Пошаговое руководство по определению базового адреса и смещений для игровых величин (HP, MP и т.д.).
В целом, процедура абсолютно одинакова для большинства программ, посему, раз прочитав подобное руководство для другой игры, которых хватает на нашем ресурсе, читать уже для Jade Dynasty особого смысла нет. Хотя, здесь я приведу несколько дополнительных вещей и пояснений.
Note:
- здесь не дается определения базовому адресу, смещениям и т.п.
- здесь нет детального описания функций и окон CE
- здесь нет детального описания ассемблерных команд
- данное руководство на 90% применимо и для Perfect World’а, т.к. движки у этих двух игр одинаковые.
- перед многими значениями стоит символ «$». Используется для идентификации шестнадцатеричных величин
Приступим.
Загружаем клиент Jade Dynasty, запускаем Cheat Engine (CE) и присоединяем последний к процессу игры «elementclient.exe». Объектом поиска будет самая доступная величина – количество жизней (HP), в моем случае, равная 779 единиц.
В поле «Value» CE вводим значение 779, выбираем тип сканирования «Exact value» и тип величины «4 bytes», и начинаем сканирование «first scan»
По завершению первого сканирования, CE отобразит список адресов (если он не очень велик), значения которых в момент поиска равнялись 779. Таких адресов может быть 10, может быть и сотни тысяч. Поэтому, нам требуется точно определить нужный адрес. Возвращаемся в игру и любым способом меняем значение HP, например, снимем с чара какую-либо вещь, дающую прирост HP:
Как только значение изменится, продолжаем поиск в CE, при этом тип сканирования оставляя «Exact value»
Найдено 4 адреса. Можно еще раз изменить значение HP и посмотреть, как будут меняться значения у этих адресов.
Через несколько секунд становится ясно: два первых адреса не имеют отношения к искомой величине, а два последних – текущее значение HP и максимальное.
Добавляем оба адреса в список и, выбрав «HP max», вызываем контекстное меню.
Нам требуется отыскать участок кода, который записывает значения в выбранный адрес $1265F098: «Find out what writes to this address»
Выполнив указанную команду, CE отобразит окно со списком опкодов (operation code, код операции)
Код операции, операционный код, опкод — часть машинного языка, называемой инструкцией, определяющей операцию, которая должна быть выполнена.
Убедимся, что отображаются все опкоды, для чего требуется вернуться в клиент и изменить значение HP
Посмотрим дополнительную информацию для инструкции по адресу «$0046b5ca»:
CE отобразит окно, где будут указаны значения регистров и дизассемблированный участок кода клиента; инструкция mov [esi + $288], ecx как раз и отвечает за запись величины HP по адресу $1265F098, а значение указателя равно $1265EE10.
Смещение: +288.
$1265EE10 – следующая величина для поиска.
Note: если не будет найдено ни одного значения, значит требуется повторить процедуру по определению значения указателя (просмотр списка опкодов)
Берем первый из найденных адресов (совсем не обязательно, что данный адрес даст какой-либо результат), добавляем его в список (название +$288 для более легкой идентификации смещений) и теперь начнем поиск того, что обращается к данному адресу
Список опкодов достаточно велик, что, по большей части, свидетельствует о правильности поиска.
Рассмотрим две инструкции.
первая по адресу: $004c2ad2
Видим, что значение указателя уже было использовано нами для поиска, следовательно, требуется выбрать другую инструкцию.
вторая по адресу: $004d11c8
Человек, знакомый с ассемблером, сразу видит результат… К этому результату вернемся чуть позже, т.к. завершим процедуру поиска базового адреса по выработанному алгоритму.
$039F6E20 – следующая величина для поиска.
Осуществив сканирование, CE выдаст список и выделит первый адрес зеленым цветом, что означает «статический адрес»
Это и есть «почти» базовый адрес, которым пользуются большинство ботоделов. Используя его, и указанные ранее смещения, можем записать:
[$00B06B5C] + $28 + $288 – Максимальное значение HP
Однако (возвращаясь к ассемблеру), хоть мы и нашли статический адрес, но этот адрес является адресом «структуры игрока», в то время как истинный базовый адрес - $00B03064
mov eax, [00B03064]
mov eax, [eax+1c]
mov eax, [ecx+28]
Итог:
[Базовый адрес] = $00B03064
[BA] + $1C + $28 + $288 – Максимальное значение HP
Note: Текущее значение HP искать нет уже необходимости, т.к. адрес был найден на первых шагах и он отличается от HP max на 18 байт, т.е.:
[BA] + $1C + $28 + $270 - Текущее значение HP
(c) Dwar
копирование материала разрешено только с указанием автора и адреса источника