Поиск и использование смещений памяти в существующей программе? - PullRequest
5 голосов
/ 07 января 2009

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

Я заинтересован в написании бота Solitaire в качестве любимого проекта. Если вы посмотрите здесь, mmoglider (коммерческий бот) уже выполнил это в качестве демонстрации для своей программы для ботов (которая обычно используется для бота WoW): Видео YouTube о MMOGlider, загружающем Vista Solitaire.

Каков общий метод точного определения местоположения различных полезных смещений памяти? Как я могу найти смещение памяти, которое указывает на «колоду» в пасьянсе, и использовать это, чтобы определить, какие карты находятся в стеке? По опыту работы с парнями-планерами я знаю, что, как только они смогли найти смещения для самой колоды, они сказали, что там есть значение каждой карты для всей колоды.

Итак, есть ли у кого-нибудь опыт реверс-инжиниринга и извлечения смещений памяти из существующих программ? И как только у вас появятся эти смещения, как быть в состоянии извлечь и прочитать значения из этой структуры "Палуба" в памяти?

1 Ответ

10 голосов
/ 07 января 2009

Обычно есть два подхода к таким задачам. Для простоты рассмотрим игру с целым количеством «здоровья» для игрока.

Во-первых, манипулировать памятью процесса во время работы программы. Это хорошо для поиска известных значений. Когда у вас в игре 100 единиц здоровья, найдите в памяти 100 единиц (скорее всего, в виде целого числа) и запишите каждое найденное место. Затем, когда ваше здоровье изменится на 99, проведите перекрестный поиск в тех же местах, чтобы увидеть, какие изменились соответствующим образом. Продолжайте, пока не сузите точное местоположение (я) переменной здоровья. В большинстве современных игр вы фактически найдете динамически распределяемый адрес памяти, который является частью структуры. На эту структуру будет ссылаться указатель внутри программы, затем вам придется искать в памяти программы значения, которые могут быть указателем на пространство рядом с переменной здоровья, и повторять процесс сужения для нескольких прогонов игры, чтобы установить Положение указателя на данные, которые вы хотите. Этот метод наиболее полезен для классических компьютерных и консольных игр, особенно для любых игр, в которых объем памяти невелик и им легко манипулировать.

Второй метод требует, чтобы вы разобрали двоичный файл приложения (для этого я использую IDA Pro ), а затем нашли функции, которые, как известно, используют нужные вам данные. Например, скажем, вы видите «Здоровье: 99» на экране. Найдите в двоичном файле строку «Health:», затем найдите ссылки на эту строку (вы, скорее всего, найдете вызов sprintf или аналогичный) и посмотрите, на какие другие области памяти ссылаются те же функции, это обычно приводит вас к состоянию переменная или структура, содержащая его. Этот метод наиболее распространен в более современных играх с большим объемом памяти и более продвинутыми методами программирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...