Низкоуровневое программирование: как найти данные в памяти другого запущенного процесса?

Я пытаюсь написать инструмент статистики для игры, извлекая значения из памяти процесса игры (поскольку другого пути нет). Самая большая проблема — найти нужные адреса, на которых хранятся интересующие меня данные. Что еще усложняет, так это динамическое выделение памяти — мне нужно найти не только адреса, в которых хранятся данные, но и указатели на эти блоки памяти, потому что адреса меняются каждый раз при перезапуске игры.

Пока я просто вручную просматриваю игровую память с помощью редактора памяти (ArtMoney) и ищу адреса, которые меняют свои значения по мере изменения данных (или не меняются). После того, как адрес найден, я ищу указатель, который указывает на этот блок памяти аналогичным образом.

Интересно, какие методы/инструменты существуют для таких задач? Может быть, есть какие-то статьи, которые я могу прочитать? Является ли освоение дизассемблера единственным выходом? Например, гейм-тренеры решают похожие задачи, но делают их за дни, а я уже неделями бьюсь.

Спасибо.

PS. Это все под окнами.


person serg    schedule 24.03.2009    source источник
comment
Можно уточнить какая платформа?   -  person Tommy Hui    schedule 24.03.2009


Ответы (3)


Является ли освоение дизассемблера единственным выходом?

Да; загрузите WinDbg с http://www.microsoft.com/whdc/devtools/debugging/default.mspx, или, если у вас есть немного денег, IDA Pro, вероятно, лучший инструмент для этого

person Ana Betts    schedule 25.03.2009
comment
Но даже с дизассемблером, какова стратегия поиска значений? Разбирать сотни мегабайт и пытаться понять, что там происходит, мне кажется невыполнимой задачей. Когда начать? - person serg; 25.03.2009
comment
Не просто просматривайте всю память, попробуйте найти функцию, которая обновляет интересующее вас значение; установить точки останова отладчика, которые печатают материал каждый раз, когда вы их нажимаете - person Ana Betts; 26.03.2009

Если вы знаете, как кодировать на C, легко искать значения в памяти. Если вы не знаете C, эта страница может указать вам на решение. если вы умеете кодировать на С#. Нетрудно будет перенести имеющийся у них C# на Java.

person Jack L.    schedule 25.03.2009

Вы можете взглянуть на DynInst (динамические инструменты). В частности, обратите внимание на Библиотеку классов динамических зондов (DPCL). Эти инструменты позволят вам подключаться к запущенным процессам через интерфейс отладчика и вставлять в них собственные инструменты (через специальные классы зондов) во время их выполнения. Возможно, вы могли бы использовать это для инструментирования подпрограмм, которые обращаются к вашим структурам данных и отслеживают, когда интересующие вас значения создаются или изменяются.

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

Я считаю, что поддержка Windows сохраняется, но я сам ею не пользовался.

person Todd Gamblin    schedule 25.03.2009