Перейти к содержанию

keng

Ветераны
  • Постов

    1 635
  • Зарегистрирован

  • Посещение

  • Победитель дней

    55

Весь контент keng

  1. Когда у меня остается несколько сотен значений и дальше они не отсеиваются, я сначала прикидываю на глазок нужное мне значение (скажем, если ищем экранное разрешение, то оно больше нуля и меньше того, что на мониторе выставлено), а потом рискую - начинаю замораживать адреса пачками по 10 штук, скрестив пальцы и молясь, чтобы игра не вылетела.
  2. NullAlex, оно не будет через ReadProcessMemory читать сразу Double, оно будет читать байты. Байты нужно преобразовать в Double после прочтения, а уже Double - в текстовую строку. Автор, что тебе не понятно из комментариев в моем предыдущем посте? Вроде бы понятно написано.
  3. Я в псевдокоде напишу, т.к. не пишу на дельфях: У тебя три переменные - 8 байт (long word), double и string. Делаешь так: hex_bytes;double;string; hex_bytes = ReadProcessMemory - читаешь 8 байт из нужного адреса памяти в переменную hex_bytesdouble = PInt64(hex_bytes) - используешь функцию PInt64, чтобы сконвертировать массив байт в тип doublestring = FloatToStr(double, 8, 4) - конвертируешь double в string при помощи FloatToStr
  4. Я так понимаю, что ты прочитал 8 байт (потому что тип - double), но они у тебя прочитаны в 16-ричной системе счисления, т.е. hexademical. Так что сначала тебе нужно преобразовать эти байты в нужный тебе тип (double), а уже затем - double в строку, воспользовавшись FloatToString (она работает и для float и для double). Возможно, в hex-double поможет PInt64(hex_num), но я не уверен, что эта функция есть в delphi xe7. Можешь написать байты, которые читаются из памяти? 16-ричные.
  5. Таймер тикает - его значение или уменьшается \ не уменьшается, или просто изменяется\не изменяется. Начать попробуй с типа float. Еще рекомендую периодически ставить игру на паузу и отсеивать "не изменилось" - это часто помогает. Может быть и так, что таймер не уменьшается, а увеличивается, но такое бывает редко.
  6. Вот [тут] достаточно подробно описан синтаксис нужной функции.
  7. Чаще всего таймер в игре - это как раз сумма секунд, которую игра просто для понимания игрока отрисовывает в более понятном формате (часы\минуты\секунды), так что скорее всего нужна именно сумма, но может быть и одни секунды сработают - я не могу точно сказать, как игра устроена.
  8. Вот на твоем скриншоте "05:56", то есть 5 часов и 56 минут. Кружочек внизу - скорее всего, секунды. 5:56 утра, а тикать таймер будет до 8:00 утра. Отнимаешь, получаешь 124 минуты, или 7440 секунд (без учета тех, что на скриншоте). Эту цифру и ищешь. PS: Если не получится, то ищи все-таки через неизвестное значение - это долгий, но надежный способ.
  9. Привет! Искать или неизвестное, или сумму секунд (минут). Может быть, что и мсек. Тип - целое 4 байта или float, чаще всего.
  10. Дык погоди, оно ведь и должно искать первое вхождение. Сигнатура-то уникальная. Если надо несколько просканировать - делай список сигнатур и получай список адресов, точно так же, циклом.
  11. Привет! "Не катит" - в смысле, ничего не читает, или не получается потом на экран вывести полученное значение?
  12. Привет! Можно попробовать долгий и беспощадный метод - ищешь неизвестное значение, тип float, меняешь положение прицела - "изменилось" - меняешь опять - "изменилось" - перемещаешься, не трогая мышку - "не изменилось" и так далее. В результате должно найтись примерно 4 пары адресов, 1-2 из которых будет в пределах от -1.0 до 1.0, а другие - довольно большие значения. Они-то и будут тебе нужны.
  13. Привет! Предположу, что можно выяснить, как работает сканер из приведенного тобой архива, и поменять так, как тебе нужно. Вероятно, что как-то он отличает статическую память от динамической в процессе сканирования - это место и нужно будет поменять. Так же вероятно, что это будет просто битовый флажок (0x1001000 или что-нибудь в этом духе).
  14. Привет! Можешь показать исходный код метода mem->ReadPointer() ?
  15. Привет! По поводу указателей - ощущение такое, будто игра любит скрипты и движок в ней соответствующий. Копать в этом случае лучше разбирая код, нежели ища указатели. По второй идее: 0. У тебя есть окно, два [editbox]-а, [кнопка]. 1. При запуске ищешь идентификатор нужного тебе процесса (pID). [ToolHelp API], [FindWindow], [OpenProcess]. 2. Если нажали на кнопку, то: 3. Если в первом editbox-е есть адрес и во втором есть целое число, то: 4. Ставим своей программе права на запись в нужный адрес ([VirtualProtectEx]). 5. Делаем [ReadProcessMemory] введенного адреса. 6. Полученные байты конвертируем в int32 (или нужный нам тип). 7. Прибавляем к полученному значению число из второго editbox-а. 8. Делаем [WriteProcessMemory] в тот же адрес, записывая новое значение. 9. Ставим старую защиту на адрес через ту же VirtualProtectEx. 10. Готово! PS: Как читать указатели, можно найти у меня в видеоуроках или тут же, на форуме. Алгоритм простой.
  16. Да, как-то так. Попробуй, заодно и проверишь. Я бы еще запись в файл и формирование формата выкидывал в отдельный поток, куда бы копировал hdc. Скопировать - это быстро, а вот в файл писать - очень медленно. RockHammer - уроки будут, сейчас есть несколько интересных задумок. Беда в том, что задумки есть, а вот времени - мало.
  17. keng

    Custom DLL Injector

    Ребята, стоп! В адресное простоанство можно инжектить код, другой исполняемый файл (библиотеку), а так же создавать потоки, клонировать процесс и делать все это из режима ядра. Ехе выполнить внутри другого ехе - можно, но довольно бессмысленно. Сначала стоит четко определиться с задачей, а уже потом проектировать решение.
  18. Привет! Можно, например, через swapbuffer, хотя в точном имени функции я могу ошибаться. Суть в том, чтобы перехватить любую функцию отрисовки, работающую с экранным буфером. Будет доступ к текущему и предыдущему. Оттуда проверяешь, надо ли снять скриншот, затем конвертишь буфер в нужный формат и пишешь в файл.
  19. /*---------------------------------------------------------------------------*/ Привет! Раз ты в dll, то это сильно облегчает задачу, потому что засунув в игру эту самую dll, ты получаешь доступ к адресному пространству игры. Если адрес инструкции статический и своего положения не меняет, то ты просто берешь и используешь [inline-assembler] (псевдокод в данном примере): __asm: push arg1 push arg2 call myfuncaddr Просто так, само собой, тебе игра не даст выполнить этот код, поэтому у тебя как минимум пара вариантов - сделать стандартную инъекцию кода (рекомендую!) или записать все это дело в память (побайтно) и затем сделать новый поток, выдав ему адрес памяти, куда ты записал эти инструкции. Работа с игровыми функциями - вообще достаточно муторное дело, я планирую записать об этом урок или написать статью. /*---------------------------------------------------------------------------*/
  20. /*----------------------------------------------------------------------------*/ Привет! Расширенный редактор формы отправки сообщения очень фигово переваривает bb-тэги. В частности, code, spoiler и font, смешанные вместе. Воспроизвести можно примерно так: - Оборачиваем текст в [ spoiler ] [ code ] ... [ /code ] [ /spoiler ]. - Выделяем абзац и меняем ему шрифт. - Жмем кнопку "Предварительный просмотр". В результате тэг code поломается и перестанет отображаться текстом в редакторе, а сам текст в этом тэге не полезет под спойлер. /*----------------------------------------------------------------------------*/
  21. /*---------------------------------------------------------------------------*/ Привет! Взломом многопользовательских игр я не занимаюсь. В качестве альтернативы предлагаю написать разработчикам игры - спросить, что за фигня с этими ботами. /*---------------------------------------------------------------------------*/
  22. /*---------------------------------------------------------------------------*/ Привет! Ссылка на канал - в подписи. Там есть несколько видео о создании трейнеров на ассемблере, чтение указателей (вроде как) тоже показывается. Точно показывается на C#, на ассемблере принцип точно такой же. Если не будет или будет непонятно - пиши мне на почту или сюда, постараюсь объяснить. /*---------------------------------------------------------------------------*/
  23. /*----------------------------------------------------------------------------*/ Можешь посмотреть скрипт вот в [этом] видео - способ тот же. /*----------------------------------------------------------------------------*/
  24. /*----------------------------------------------------------------------------*/ Привет! Читаешь текущее значение адреса, прибавляешь нужное значение, записываешь обратно. Это если через указатели. Если через код, то понадобится флаг - если он равен единице, то нужно прочитать-добавить-записать и сбросить флаг на ноль, если ноль - то ничего не добавлять и просто записать. Пример сейчас не могу привести - пишу из транспорта с телефона. /*----------------------------------------------------------------------------*/
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.