как узнать оффсеты игры
Продвинутый способ поиска оффсетов
Разработка ПО для Perfect World
Здравствуйте, друзья. Сегодня поговорим о «трудных» смещениях.
В современных играх обширно используются классы. Я не буду сейчас рассказывать об их преимуществах, напомню лишь о недостатке для создателей ботов/читов/плагинов: динамическое расположение объектов (экземпляров классов).
Именно поэтому любому разработчику приходится докапываться до нужных ему значений через указатели и смещения: существует какой-то базовый адрес (который никогда не меняется) и смещения от него. Здесь всё строится на том, что смещения, в отличие от указателей, всегда статические.
Напомню, что какое-либо значение, лежащее в определённой структуре и изменяемое самой игрой, может привести нас к началу структуры. Что мы для этого делали в Cheat Engine? Искали начальное значение, изменяли его в игре, отсеивали в CE, так доходили до одного адреса, который точно отвечал именно за искомый параметр. Затем цепляли отладчик CE к процессу и ставили BreakPoint на адрес данного параметра, дабы отследить команды, меняющие его значение. Он выдавал нам команды, содержащие смещения. Вычитали из адреса параметра смещение, получали начало структуры. Затем в памяти искали уже начало структуры (чтобы выйти к структурам более высоких уровней).
А теперь вопрос: как быть, если у нас нет ни конкретного значения, ни возможности изменить его, но есть начало структуры (которое легко вычисляется по «нормальным» оффсетам вышеописанным способом)?
За примерами далеко ходить не придётся: пол, класс персонажа, внешний вид его фейки (ад/рай 1/2/3).
Первые два стандартными средствами изменены не могут быть вообще. А в третьем примере придётся надолго оставлять Cheat Engine, чтобы изменить фейку и выполнить отсеивание (причём шанс добиться успеха довольно мал, так как у нас будет мало отсеиваний; особенно худо придётся, если мы не знаем даже примерных возможных значений).
Или вот такая ситуация: предмет лежит в инвентаре, его свойства можно изменить только так или иначе передвинув его. Как найти эти свойства? Проблема в том, что если сдвинуть/снять/одеть предмет и потом вернуть на место, то его структура будет лежать уже в другом месте. К подобным свойствам можно отнести, например, уровень джинна (можно изменить только экипировав его) или количество его свободных статов, уровень питомца (лежащего в инвентаре в виде яйца). Именно здесь Cheat Engine не справляется, да-да.
Сейчас я покажу пример, как пользоваться такой техникой и этой программой. Найдём смещение от начала информации о джинне, лежащем в инвентаре, до уровня джинна.
Поместим джинна в первый слот инвентаря (для удобства).
[скриншот]
В текстовом поле должны появиться байты, но это не так важно для нас. Сохраняем в двоичном виде, даём название аля «LvL__41» (чтобы потом не запутаться).
[скриншот]
Идём в игру, экипируем джинна и повышаем ему уровень (например, засчёт духа игрока).
[скриншот]
Затем возвращаем джинна в тот же слот инвентаря, делаем второй дамп структуры по тем же оффсетам (можно просто нажать кнопку Update в программе), сохраняем его под именем типа «LvL__42».
[скриншот]
Основная задача выполнена, закрываем дампер и идём в HEX-редактор, я использую 010 Editor. Открываем в нём сравнение файлов, указываем наши bin-файлики.
[скриншот]
И здесь хочу заметить, что дамп это как бы снимок памяти, как, например, скриншот из игры: мы видим то, что было когда-то до настоящего момента. Это и позволяет изучить структуру позднее (словно мы открыли старый скрин и смотрим его).
Итак, внизу мы можем видеть совпадающие и отличающиеся области файла. У меня получилось, что первое отличие в файлах находится по смещению +E0 от начала файлов (и, соответственно, структуры джинна в инвентаре), причём отличаются всего три байта.
[скриншот]
Как видим, это значение тоже хранится в двух байтах. На скриншоте показано, как получать смещения (складываем смещение в столбце и смещение в строке). Берём число, начиная именно с третьего (по счёту) байта, а не с четвёртого, потому что так организована память (повторюсь, байты перевёрнуты). Тем же способом уточним тип значения, это снова будет двухбайтовое целое со знаком.
ItemStructStart
+E0 = (short) GenieLvL
+E2 = (short) FreeStats
Offset Memory Dumper v1.0 в аттаче к посту, [ Ссылки могут видеть только зарегистрированные пользователи. ].
Поиск поинтеов и оффсетов
Архив читов (без хайда)Поиск поинтеов и оффсетовДля поиска поинтеров и оффсетов нам понадобится: *********61692; Cheat Engine (или аналог) 1. Открываем Cheat Engine 8. Возвращаемся к Cheat Engine и копируем значение поля «Address». 9. Возвращаемся к калькулятору и вставляем значение сюда. После этого вычисляем (-) 500. 10. Получившийся результат копируем на поле»Address» и нажимаем OK 11. В Address list смотрим и видим, добавилось новое значение. Нажимаем ПКМ и выбираем»Pointer scan for this address». 12. Появиться окно. В настройках ставим Max level на 1 и галочку на»Improve pointerscan with gathered heap data» потом жмем OK и ожидаем окончание загрузки. 13. Должно, появится что-то вроде PointBlank.i3exec+123123123, на него 2 раза кликнем и закрываем окно. 15. Около него должен быть поле»Offset (Hex)» копируем данное поле и вставляем на калькулятор и сложим (+) на 500. Получившийся результат это оффсет. Чтобы искать новый оффсет и не проделывать все пункты сначала: 16. Нажимаем на «Add address manually»,ставим галочку на «Pointer» и в поле «Address of pointer» пишем наш Pointer (например: PointBlank.i3exec+123123123). Нажимаем Ок. 18. Выполняем пункт с 1-9. НО (!) вместо того чтобы вычислят (-) 500, мы будем, вычислят значение которое нашли недавно. Получившийся результат это — ОффСет. 2-ой способ я выложуtxt файлом т.к там очень много писать..прочитав,вы всё поймёте… Guide Чтож вы такое, Оффсеты? |