Перейти к содержимому

Поиск указателей в Cheat Engine: как найти адреса, которые переживают перезапуск

Cheat-Engine.net Автор: Cheat-Engine.net 9 мин чтения 25 просмотров

Почему адреса меняются при каждом перезапуске игры, как работают многоуровневые указатели и как использовать сканирование указателей, карты указателей и повторные сканирования, чтобы создавать записи, которые продолжают работать.

Вы нашли значение здоровья, сохранили его в таблице Cheat Engine (Cheat Table), перезапустили игру, и теперь запись показывает ?? или случайное число. Это не ваша ошибка. Большинство игровых значений при каждом запуске игры находятся по новому адресу. Указатель — это путь к значению от неподвижной начальной точки, а сканер указателей Cheat Engine — инструмент, который находит такие пути за вас.

В этом руководстве предполагается, что вы уже умеете находить значение с помощью First Scan и Next Scan; если нет, сначала прочитайте руководство по Cheat Engine для начинающих. Используйте эти приёмы только в одиночных и офлайн-играх и делайте резервные копии сохранений, прежде чем экспериментировать.

Почему адреса меняются после перезапуска

Игры создают большую часть своих данных во время работы. Когда загружается уровень, игра запрашивает у системы блок памяти для объекта игрока, другой — для инвентаря и так далее. Это динамическое выделение памяти, и то, где окажется каждый блок, зависит от того, что было выделено до него, а это различается от запуска к запуску и даже между экранами загрузки. Ваше здоровье хранится в фиксированной позиции внутри объекта игрока, но сам объект игрока перемещается.

Кроме того, Windows по соображениям безопасности загружает программы и их модули (основной исполняемый файл и его DLL) по разным базовым адресам. Поэтому стабильные адреса всегда записываются относительно модуля, например "game.exe"+01A2B3C0, а не в виде обычного числа.

В списке результатов сканирования Cheat Engine показывает адреса, принадлежащие модулю, зелёным цветом. Они статические: при каждом запуске у них то же смещение внутри модуля. Чёрные адреса динамические. Большинство нужных вам значений динамические.

Как работают многоуровневые указатели

Указатель — это просто значение, содержащее адрес. Игры полны таких значений: глобальный «менеджер игры» хранит адрес мира, мир хранит адрес игрока, игрок хранит адрес блока характеристик, а блок характеристик содержит здоровье по смещению 18. Если пройти по такой цепочке от статической начальной точки, вы всегда попадёте на текущий адрес значения, независимо от того, где были выделены объекты.

"game.exe"+01A2B3C0   read the 8-byte address stored here  (level 1)
  + 10                read the address stored here         (level 2)
  + 18                this is the health value

Cheat Engine записывает тот же путь в скобочной нотации как [["game.exe"+01A2B3C0]+10]+18: каждая пара скобок означает «прочитать адрес, хранящийся здесь». Смещения шестнадцатеричные. Путь с одним смещением — это одноуровневый указатель; большинству реальных игр нужно от двух до пяти уровней.

Шаг 1: найдите текущий адрес значения

Найдите значение как обычно и добавьте его в список адресов. Убедитесь, что тип выбран правильно, ведь запись с указателем унаследует его; руководство по типам значений поможет, если вы не уверены, что здоровье — это 4 Bytes или Float. Подтвердите адрес, изменив значение и увидев изменение в игре.

Шаг 2 (необязательно): узнайте, что обращается к адресу

Щёлкните запись правой кнопкой мыши и выберите Find out what accesses this address или Find out what writes to this address. Cheat Engine подключит свой отладчик и покажет список инструкций, которые обращаются к значению во время игры. Типичный результат выглядит как movss [rbx+18],xmm0 или mov [rcx+18],eax. Число в скобках, здесь 18, — это смещение значения внутри его объекта, а регистр (rbx или rcx) в тот момент содержал адрес объекта. Если выбрать инструкцию и открыть её подробности, вы увидите значения регистров.

Это ручной способ отслеживать указатели: вы ищете адрес объекта как 8-байтовое шестнадцатеричное значение, чтобы узнать, что на него указывает, а затем повторяете для каждого уровня. Именно так указатели объясняются во встроенном обучении Cheat Engine, и стоит сделать это хотя бы раз, чтобы понять идею. Учтите, что подключение отладчика может сделать некоторые игры нестабильными; сохранитесь, прежде чем пробовать.

Найденные здесь инструкции также служат отправной точкой для скриптов внедрения кода — альтернативы указателям, которая описана в руководстве по основам Auto Assembler.

Шаг 3: запустите сканирование указателей

Проходить каждый уровень вручную долго, поэтому Cheat Engine умеет автоматически искать все возможные пути. Щёлкните запись правой кнопкой мыши и выберите Pointer scan for this address. В окне настроек много параметров; важные из них:

  • Address to find: заполняется адресом вашей записи.
  • Maximum offset value: насколько большим может быть каждое смещение. Значение по умолчанию — разумная отправная точка; увеличивайте его, только если сканирование ничего не находит.
  • Max level: на сколько уровней в глубину искать. Большие уровни находят больше путей, но занимают намного больше времени и дают намного больше результатов. Начните примерно с 5.

Нажмите OK, выберите, куда сохранить результаты (файл .PTR и вспомогательные файлы), и подождите. Первое сканирование может дать сотни тысяч или миллионы возможных путей. Большинство из них — совпадения, которые работают только в этой сессии. Следующие шаги их отсеивают.

Шаг 4: повторно просканируйте после перезапуска игры

Именно этот шаг заставляет сканирование указателей работать.

  1. Оставьте окно сканирования указателей открытым или позже снова откройте сохранённый файл .PTR из меню сканера указателей.
  2. Полностью закройте игру и запустите её снова. Загрузите сохранение.
  3. Снова подключите Cheat Engine и найдите новый адрес значения обычным сканированием.
  4. В окне сканирования указателей откройте его меню и выберите вариант повторного сканирования. Введите новый адрес как искомый адрес и подтвердите.

Cheat Engine проверяет каждый сохранённый путь на новом запуске и оставляет только те, которые теперь ведут к новому адресу. Повторите два или три раза, желательно с разнообразием: другое сохранение, другой уровень и хотя бы один раз после перезагрузки ПК. Каждый раунд убирает пути, которые работали лишь случайно. Также можно выполнять повторное сканирование по значению, а не по адресу, если значение известно и заметно выделяется.

Карты указателей: сканируем умнее

Карта указателей — это снимок всех указателей в памяти игры в один момент времени, сохранённый на диск. Вы создаёте её из контекстного меню списка адресов, пока игра запущена, и записываете адрес значения для этой сессии. Позже в настройках сканирования указателей можно сканировать по сохранённой карте указателей вместо живой памяти и сравнивать её с другими сохранёнными картами, каждая из которых сопоставлена с адресом значения в её сессии.

Преимущество в том, что можно сначала собрать карты из нескольких игровых сессий и объединить их в одном сканировании, не держа игру открытой во время медленной части. В итоге вы получаете такой же отфильтрованный список, как после серии повторных сканирований, зачастую быстрее.

Шаг 5: выберите результат и добавьте его в таблицу

В списке результатов есть столбец Base Address, например "game.exe"+01A2B3C0, затем по одному столбцу на каждое смещение и адрес, на который путь указывает сейчас. Выбирая среди оставшихся, отдавайте предпочтение:

  • путям, которые начинаются в основном исполняемом файле игры или её главном модуле движка;
  • более коротким путям с меньшим числом уровней;
  • путям, которые пережили больше всего разнообразных повторных сканирований.

Дважды щёлкните результат, чтобы добавить его в список адресов. Адрес записи появится с префиксом P->, показывающим, что это указатель. Проверьте её тип; записи сканирования указателей по умолчанию имеют тип 4 Bytes, поэтому смените его на Float или другой тип, если это нужно вашему значению. Дайте записи понятное описание и сохраните таблицу.

Указатель можно ввести и вручную: нажмите кнопку добавления адреса вручную, отметьте параметр Pointer, укажите модуль и смещение в поле базового адреса (например, "game.exe"+01A2B3C0) и добавьте по одному полю на каждое смещение. Cheat Engine показывает адрес, к которому приводит каждый уровень, прямо во время ввода, так что ошибки легко заметить. Обратите внимание на порядок полей смещений в этом окне: смещение, применяемое первым, находится рядом с базовым адресом.

Ограничения указателей

Хороший указатель переживает перезапуски, но не обязательно обновления игры. Когда разработчик выпускает патч, статический базовый адрес и смещения могут измениться, и сканирование придётся повторить. Сохраняйте файлы .PTR и заметки, чтобы быстро всё повторить. Также будьте осторожны со значениями, у которых несколько копий, например с характеристиками отдельных персонажей в отряде; путь может вести к тому персонажу, который был выбран первым.

Итоги

  1. Найдите значение и подтвердите его.
  2. При желании используйте отладчик, чтобы увидеть, какие инструкции к нему обращаются.
  3. Запустите сканирование указателей с умеренными настройками уровня и смещения.
  4. Перезапустите игру, найдите новый адрес, выполните повторное сканирование. Повторите на разных сессиях.
  5. Выберите короткий и стабильный путь, добавьте его в таблицу с правильным типом и сохраните.

Комментарии

0
Ответ пользователю

Публично не отображается.

Комментарии проверяются модератором перед публикацией.

Комментариев пока нет

Будьте первым, кто поделится своим мнением.