Регистрация Главная Сообщество
Сообщения за день Справка Регистрация
Навигация
Zhyk.org LIVE! Реклама на Zhyk.org Правила Форума Награды и достижения Доска "почета"

Продвинутый способ поиска оффсетов

-

Разработка ПО для Perfect World

- Бюро разработчиков Zhyk.Ru: создание ботов, снифферов и прочих программ для Perfect World

Ответ
 
Опции темы
Старый 23.02.2012, 17:01   #1
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Продвинутый способ поиска оффсетов

Здравствуйте, друзья. Сегодня поговорим о "трудных" смещениях.

В современных играх обширно используются классы. Я не буду сейчас рассказывать об их преимуществах, напомню лишь о недостатке для создателей ботов/читов/плагинов: динамическое расположение объектов (экземпляров классов).
Именно поэтому любому разработчику приходится докапываться до нужных ему значений через указатели и смещения: существует какой-то базовый адрес (который никогда не меняется) и смещения от него. Здесь всё строится на том, что смещения, в отличие от указателей, всегда статические.
Напомню, что какое-либо значение, лежащее в определённой структуре и изменяемое самой игрой, может привести нас к началу структуры. Что мы для этого делали в Cheat Engine? Искали начальное значение, изменяли его в игре, отсеивали в CE, так доходили до одного адреса, который точно отвечал именно за искомый параметр. Затем цепляли отладчик CE к процессу и ставили BreakPoint на адрес данного параметра, дабы отследить команды, меняющие его значение. Он выдавал нам команды, содержащие смещения. Вычитали из адреса параметра смещение, получали начало структуры. Затем в памяти искали уже начало структуры (чтобы выйти к структурам более высоких уровней).

А теперь вопрос: как быть, если у нас нет ни конкретного значения, ни возможности изменить его, но есть начало структуры (которое легко вычисляется по "нормальным" оффсетам вышеописанным способом)?
За примерами далеко ходить не придётся: пол, класс персонажа, внешний вид его фейки (ад/рай 1/2/3).
Первые два стандартными средствами изменены не могут быть вообще. А в третьем примере придётся надолго оставлять Cheat Engine, чтобы изменить фейку и выполнить отсеивание (причём шанс добиться успеха довольно мал, так как у нас будет мало отсеиваний; особенно худо придётся, если мы не знаем даже примерных возможных значений).
Или вот такая ситуация: предмет лежит в инвентаре, его свойства можно изменить только так или иначе передвинув его. Как найти эти свойства? Проблема в том, что если сдвинуть/снять/одеть предмет и потом вернуть на место, то его структура будет лежать уже в другом месте. К подобным свойствам можно отнести, например, уровень джинна (можно изменить только экипировав его) или количество его свободных статов, уровень питомца (лежащего в инвентаре в виде яйца). Именно здесь Cheat Engine не справляется, да-да.

В подобных случаях удобно сохранить структуру куда-нибудь на жёсткий диск и сверить её с уже изменённой версией. Например, играли лучником - сохранили структуру, зашли воином - сохранили ещё раз; идём сверять. Рано или поздно найдём смещение для расы/класса игрока.
Чем сверять? Для данных целей удобнее всего будет использовать шестнадцатеричные редакторы, например, 010 Editor. В нём есть функция сравнения двух файлов.
Другая проблема в том, как правильно (и что конкретно) сохранять. Задавшись однажды этим вопросом, я был не в силах сопротивляться своему желанию написать-таки софтину для автоматизации данной задачи. Свою программу "Offset Memory Dumper" прикрепляю к этой статье.
В чём вообще удобства такого подхода:
1) безопасность: сохранённые значения никуда не денутся (Ваш К.О.);
2) надёжность и наглядность: любые смещения байтов от начала файла равны смещениям для соответствующих байтов от начала структуры (разумеется, речь идёт о бинарных файлах);
3) компактность: не нужно снимать полные дампы памяти, достаточно нескольких сотен байтов от начала исследуемой структуры.

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

Запоминаем уровень - 41. Идём в программу-дампер, выбираем процесс игры.
[скриншот]

Задаём смещения от базового адреса:
BA +1C +34 +CAC +C +0, где 0 - смещение для первой ячейки инвентаря. Если нужна другая, то ставим N*4, где N - номер ячейки от 0 до 63.
Следует учесть, что по данному адресу будет лежать адрес начала структуры (а не сами значения, лежащие в ней). Поэтому мы добавляем ещё одно смещение +0. Нажимаем кнопочку "Get Raw Data".
[скриншот]

В текстовом поле должны появиться байты, но это не так важно для нас. Сохраняем в двоичном виде, даём название аля "LvL__41" (чтобы потом не запутаться).
[скриншот]

Идём в игру, экипируем джинна и повышаем ему уровень (например, засчёт духа игрока).
[скриншот]

Затем возвращаем джинна в тот же слот инвентаря, делаем второй дамп структуры по тем же оффсетам (можно просто нажать кнопку Update в программе), сохраняем его под именем типа "LvL__42".
[скриншот]

Основная задача выполнена, закрываем дампер и идём в HEX-редактор, я использую 010 Editor. Открываем в нём сравнение файлов, указываем наши bin-файлики.
[скриншот]

И здесь хочу заметить, что дамп это как бы снимок памяти, как, например, скриншот из игры: мы видим то, что было когда-то до настоящего момента. Это и позволяет изучить структуру позднее (словно мы открыли старый скрин и смотрим его).
Итак, внизу мы можем видеть совпадающие и отличающиеся области файла. У меня получилось, что первое отличие в файлах находится по смещению +E0 от начала файлов (и, соответственно, структуры джинна в инвентаре), причём отличаются всего три байта.
[скриншот]

Поставим курсор в начало отличающейся области (прямо в первый байт на +E0) и посмотрим на таблицу слева вверху. Это - интерпретация байтов в виде привычных глазу человека типов. Красным в этой таблице (на скриншоте) я обозначил огромные числа - вряд ли это корректные/нужные данные, а числа размерностью в 1 и 2 байта (отмеченные на скриншоте синим цветом) очень даже подходят: маленькие (уровень точно не будет равен 3473449), равны для двух файлов 41 и 42 соответственно, что и является уровнями джиннов. Какое совпадение!
А теперь определим размер данного значения. Мы уже заметили, что 4-байтовые величины не подходят, а что насчёт 2-байтовых?
Смотрим на запись: 29 00 35 00 (из дампа "LvL__41"). Понимать её стоит справа налево, то есть байты в памяти перевёрнуты. Это совершенно нормально, всегда так и есть.
Перевернём байты: 00 35 00 29. Совершенно очевидно, что байт между двумя числами не используется. Переведём эти два значения (как мы договорились, двухбайтовых) в десятичную систему счисления: 53 и 41. Делаем вывод, что уровень джинна должен храниться в одном или двух байтах (занятый числом 29h + "пустой", где лежит 00), однако я уверен на 100%, что "пустой" байт действительно тоже относится к уровню, и стоит использовать тип short или unsigned short. В точности установить это поможет отладчик - смотреть следует на операции, которые будут работать с этим смещением. Проверим с помощью Cheat Engine. Добавим в таблицу указатель на наше значение (BA +1C +34 +CAC +C +0 +E0), поставим BreakPoint на доступ к конечному адресу.
[скриншот]

Судя по команде movsx, это целое со знаком (т.е. может принимать отрицательные значения), размерность действительно 2 байта ("word ptr").
Кстати, наш третий отличающийся байт (по смещению +E0) в десятичной системе счисления для первого случая равен 53, а для второго - 54. Смотрим в игре на экипированного джинна с целью найти число 54, обнаруживаем, что свободно 54 стата для распределения.
Логично предположить, что в таком случае смещение до количества свободных статов будет +E2, и это действительно так.
[скриншот]

Как видим, это значение тоже хранится в двух байтах. На скриншоте показано, как получать смещения (складываем смещение в столбце и смещение в строке). Берём число, начиная именно с третьего (по счёту) байта, а не с четвёртого, потому что так организована память (повторюсь, байты перевёрнуты). Тем же способом уточним тип значения, это снова будет двухбайтовое целое со знаком.

Таким образом:

ItemStructStart = BA +1C +34 +CAC +C +I*4, где I - номер ячейки инвентаря, в которой лежит предмет, структура которого нас интересует.

ItemStructStart
+E0 = (short) GenieLvL
+E2 = (short) FreeStats

Вот и сказочке конец, а кто не понял - отпишись ;d

Offset Memory Dumper v1.0 в аттаче к посту, [Ссылки могут видеть только зарегистрированные пользователи. ].

23.02.2011 © BritishColonist
специально для zhyk.ru
Вложения
Тип файла: rar OMDumper.rar (333.0 Кб, 289 просмотров)
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3

Последний раз редактировалось BritishColonist; 26.02.2012 в 15:29.
  Ответить с цитированием
6 пользователя(ей) сказали cпасибо:
crazy613ii (16.03.2012), Любомир1 (05.09.2012), lcd1232 (25.02.2012), Nek1t (26.02.2012), Smertig (21.04.2012), Доминик (23.02.2012)
Старый 23.02.2012, 17:22   #2
-= Элитный Мастер =-
 Главнокомандующий
Аватар для Kitsune
 
Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(
Регистрация: 20.01.2010
Сообщений: 1,539
Популярность: 22780
Золото Zhyk.Ru: 600
Сказал(а) спасибо: 43
Поблагодарили 1,717 раз(а) в 538 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Пример не очень удачный.
Поясню: у большинства предметов в игре есть определенный набор байт, определяющий его свойства. Китайцы зовут это октетом.
Для каждого типа предмета используется свой, уникальный по структуре октет.
Октет может содержать в себе как статичный по размеру набор данных, так и динамический.

Если уж говорить о джинах, то структура октета примерно такая:
Код:
Int32 Experience
UInt16 Level
UInt16 TotalAP
UInt16 Strength
UInt16 Agility
UInt16 Vitality
UInt16 Intellect
... еще 9 полей тут (описывать структуру целиком не собираюсь)
Int32 кол-во одежки
{
    Int32 ID одежки
    ...
}
Int32 кол-во скилов
{
    Int32 ID скила
    ...
}
Исходя из выше сказанного можно сразу понять, что оффсеты могут попадать, а могут и нет на нужные вам значения.

Последний раз редактировалось Kitsune; 23.02.2012 в 17:24.
  Ответить с цитированием
Старый 23.02.2012, 17:28   #3
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Эм.. Немного не понял. В статье предполагается, что в инвентаре лежит именно джинн, а у него же структура одинаковая для всех типов джиннов, разве нет?
  Ответить с цитированием
Старый 23.02.2012, 17:42   #4
-= Элитный Мастер =-
 Главнокомандующий
Аватар для Kitsune
 
Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(
Регистрация: 20.01.2010
Сообщений: 1,539
Популярность: 22780
Золото Zhyk.Ru: 600
Сказал(а) спасибо: 43
Поблагодарили 1,717 раз(а) в 538 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
у него же структура одинаковая для всех типов джиннов

Да, для всех предметов одного типа используется одна и та же структура.

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
В статье предполагается, что в инвентаре лежит именно джинн

К джинам претензий нет

Хотел лишь подчеркнуть, что некоторые оффсеты в рамках одной структуры для разных предметов могут указывать на совсем разные значения, потому что структуры могут быть динамическими.
  Ответить с цитированием
Старый 13.03.2012, 16:02   #5
 Пехотинец
Аватар для Jok3r666
 
Jok3r666 скоро будет известенJok3r666 скоро будет известенJok3r666 скоро будет известен
Регистрация: 17.05.2010
Сообщений: 53
Популярность: 204
Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

ИМХО если знаем начало структуры, просто сканим память и ищем в этой каке значение не?
  Ответить с цитированием
Старый 13.03.2012, 19:00   #6
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Jok3r666,
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
как быть, если у нас нет ни конкретного значения, ни возможности изменить его, но есть начало структуры?

________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 13.03.2012, 20:55   #7
 Пехотинец
Аватар для Jok3r666
 
Jok3r666 скоро будет известенJok3r666 скоро будет известенJok3r666 скоро будет известен
Регистрация: 17.05.2010
Сообщений: 53
Популярность: 204
Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

BritishColonist,
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Задаём смещения от базового адреса:
BA +1C +34 +CAC +C +0

  Ответить с цитированием
Старый 13.03.2012, 22:17   #8
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Jok3r666, окей, и какое значение ты будешь искать в "просканенной памяти", если оно для тебя неизвестно? И, ах да, чем же ты её "просканишь" так, чтобы сохранилось, скажем, 1000 байт и чтобы потом сразу были заметны разные места двух структур?
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 14.03.2012, 06:14   #9
 Пехотинец
Аватар для Jok3r666
 
Jok3r666 скоро будет известенJok3r666 скоро будет известенJok3r666 скоро будет известен
Регистрация: 17.05.2010
Сообщений: 53
Популярность: 204
Сказал(а) спасибо: 11
Поблагодарили 15 раз(а) в 6 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Jok3r666, окей, и какое значение ты будешь искать в "просканенной памяти", если оно для тебя неизвестно? И, ах да, чем же ты её "просканишь" так, чтобы сохранилось, скажем, 1000 байт и чтобы потом сразу были заметны разные места двух структур?

О_О как неизвестно?
Цитата:
Сообщение от BritishColonistПосмотреть сообщение
Запоминаем уровень - 41

Ручками все, а если этот скан частое явление дык и приблуду написать можно.
  Ответить с цитированием
Старый 14.03.2012, 13:54   #10
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Jok3r666, сдаётся мне, ты просто не сталкивался с тем, что описано в теме. Хорошо, раз уж ты не вник в её суть, попробуй рассказать мне, как ты найдёшь смещение до фейки персонажа. А лучше до его класса или пола.
Меня не интересуют сами смещения, только способ поиска.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3

Последний раз редактировалось BritishColonist; 14.03.2012 в 13:58.
  Ответить с цитированием
Старый 20.03.2012, 22:15   #11
 Разведчик
Аватар для bugadenis94
 
bugadenis94 никому не известный тип
Регистрация: 18.02.2012
Сообщений: 8
Популярность: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Отправить сообщение для bugadenis94 с помощью Skype™
 
По умолчанию Re: Продвинутый способ поиска оффсетов

а можно таким способом откет пухи определить?
  Ответить с цитированием
Старый 20.03.2012, 22:29   #12
 Сержант
Аватар для BritishColonist
 
BritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауруBritishColonist излучает ауру
Регистрация: 11.12.2010
Сообщений: 110
Популярность: 541
Сказал(а) спасибо: 5
Поблагодарили 66 раз(а) в 39 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

bugadenis94, не откет, а октет.
На самом деле сложно сказать. Иногда этой штукой можно вычислить примерные границы структуры.
Безусловно, это можно назвать тяжёлой артиллерией - тут ты точно определяешь, какие байты структур отличаются, определяешь, что это за байты, т.е. описываешь структуру. Одновременно ты видишь, какие байты либо всегда повторяются, либо не имеют смысла. Разве что на основе такого исследования можно выделить октеты.
________________
Принимаю реквесты на статьи, программы. Всё будет запилено в лучшем виде :3
  Ответить с цитированием
Старый 13.04.2012, 17:51   #13
 Пехотинец
Аватар для alegr
 
alegr скоро будет известенalegr скоро будет известенalegr скоро будет известен
Регистрация: 19.01.2011
Сообщений: 57
Популярность: 280
Сказал(а) спасибо: 3
Поблагодарили 35 раз(а) в 9 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

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

Добавлено через 37 минут
кстати, для Jade Dynasty подойдёт?

Последний раз редактировалось alegr; 13.04.2012 в 18:28. Причина: Добавлено сообщение
  Ответить с цитированием
Старый 13.04.2012, 22:40   #14
-= Элитный Мастер =-
 Главнокомандующий
Аватар для Kitsune
 
Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(Kitsune сломал счётчик популярности :(
Регистрация: 20.01.2010
Сообщений: 1,539
Популярность: 22780
Золото Zhyk.Ru: 600
Сказал(а) спасибо: 43
Поблагодарили 1,717 раз(а) в 538 сообщениях
 
По умолчанию Re: Продвинутый способ поиска оффсетов

Цитата:
Сообщение от alegrПосмотреть сообщение
кстати, для Jade Dynasty подойдёт?

Для чего угодно.
  Ответить с цитированием
Ответ

Метки
britishcolonist, dump, offset, struct, tutorial


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Руководство] Способ поиска хороших прокси 4ipolino Школа Читера 1 06.08.2011 16:55
[Подсказка] Способ поиска мыл для пв ser1325 Общение и обсуждение Perfect World 0 25.06.2010 18:31
Бот без оффсетов! schurik Общение и обсуждение Perfect World 6 12.05.2010 14:39

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 23:30.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net