Чтение памяти другого процесса
От: ravel  
Дата: 17.01.13 22:50
Оценка:
Здравствуйте,

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

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

1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?

2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?

Наверное надо уточнить, что сканируемая игра написана скорее всего на С++ с использованием DX, интерфейс приближен к оконному и если описывать выше изложенную задачу проще, то мне требуется прочитать данные нескольких label'ов в одном из окон. Вполне возможно, что при выводе на интерфейс искомые данные уже округляются и хранятся в текстовом виде, но опять же попытки сканирования через ArtMoney этих данных в строковом виде результатов не дали.

Заранее спасибо.
Re: Чтение памяти другого процесса
От: pva  
Дата: 18.01.13 09:53
Оценка:
Здравствуйте, ravel, Вы писали:

R>я хочу с помощью своей программы прочесть данные из процесса игры. Достаточно легко написала небольшое консольное приложение на C#.

Ну, во-первых, Вы ошиблись форумом. Вам на какой-нибудь ксакеп.ру надо.

R>1. Каким образом можно узнать адрес значения выводимого на интерфейс?

Как Вы уже заметили, отладчик — самый универсальный способ. Но для пользования данным инструментом нужно иметь богатый опыт анализа. Тем более что начинаете Вы с многомегабайтного кода. Если Вы знаете что видимое на экране число не целочисленное, то можно поискать его бинарное представление от типов float, real, double.

R>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?

Скорей всего у каждого экземпляра он будет разный. Просто потому что объекты с данными создаются динамически.

R>Наверное надо уточнить, что сканируемая игра написана скорее всего на С++ с использованием DX, интерфейс приближен к оконному

Если это ДХ, то никаких Label здесь нет.
newbie
Re[2]: Чтение памяти другого процесса
От: Аноним  
Дата: 18.01.13 11:25
Оценка:
R>>Наверное надо уточнить, что сканируемая игра написана скорее всего на С++ с использованием DX, интерфейс приближен к оконному
pva>Если это ДХ, то никаких Label здесь нет.
Бред какой.
Re[3]: Чтение памяти другого процесса
От: pva  
Дата: 18.01.13 12:00
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Бред какой.

Расскажи нам, милый аноним, откуда в директх элементы label?
По существу что-нибудь будет?
newbie
Re[4]: Чтение памяти другого процесса
От: ravel  
Дата: 18.01.13 13:34
Оценка:
Здравствуйте, pva, Вы писали:

pva>Здравствуйте, Аноним, Вы писали:


А>>Бред какой.

pva>Расскажи нам, милый аноним, откуда в директх элементы label?
pva>По существу что-нибудь будет?

Прошу прощение, используя термин label я конечно же не имела какой то стандартный компонент, визуально просто строка выводимая на пользовательский интрефейс, вот и применила этот термин.
Re[2]: Чтение памяти другого процесса
От: ravel  
Дата: 23.01.13 10:52
Оценка:
Здравствуйте, pva, Вы писали:

R>>я хочу с помощью своей программы прочесть данные из процесса игры. Достаточно легко написала небольшое консольное приложение на C#.

pva>Ну, во-первых, Вы ошиблись форумом. Вам на какой-нибудь ксакеп.ру надо.

Спасибо за совет, но ксакеп на мой взгляд не то место где мне могут помочь разобраться с этим.

R>>1. Каким образом можно узнать адрес значения выводимого на интерфейс?

pva>Как Вы уже заметили, отладчик — самый универсальный способ. Но для пользования данным инструментом нужно иметь богатый опыт анализа. Тем более что начинаете Вы с многомегабайтного кода. Если Вы знаете что видимое на экране число не целочисленное, то можно поискать его бинарное представление от типов float, real, double.

R>>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?

pva>Скорей всего у каждого экземпляра он будет разный. Просто потому что объекты с данными создаются динамически.

Если вам не сложно, помогите мне точно сформулировать задачу в голове. Ок, решение требует использование отладчика, я приступила к изучению методов работы с ним. Но мне не совсем понятно, что я ищу. Исходя из происков с ArtM. и подсказки pva память для хранения нужного мне значения выделяется через оператор new и меняется при каждом изменении значения. Каким образом просмотр дизасемблированного кода и стека может помочь мне написать уинифицированную программу, которая будет понимать, что при открытии определенного интерфейса в игре, нужное значение лежит по такому-то адресу, а так же сама сумеет находить новый правильный адрес при ее изменении?

Благодарю за Ваше потраченное время.
Re: Чтение памяти другого процесса
От: acDev Россия  
Дата: 23.01.13 12:32
Оценка:
Здравствуйте, ravel, Вы писали:

R>помощью программы ArtMoney проскандировать память процесса и найти необходимые адреса нужных значений и использовать их в своем коде. К сожалению таким путем я сделать это не смогла. Как мне кажется причина заключается в том, что игра оперирует дробными значениями, а на интерфейсе показываются округленные результаты.


Игра может хранить переменные в зашифрованном виде.

R>1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?


Если ArtMoney не помогает, то только отладчиком.

R>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?


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


А вообще создайте тред на www.exelab.ru и вам с радостью ребята помогут. Только они скорее всего запросят EXE-файл, так что выкладывайте сразу.
Re: Чтение памяти другого процесса
От: Flammable Россия  
Дата: 23.01.13 12:45
Оценка:
Здравствуйте, ravel, Вы писали:

R>1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?

Что касается отладчика, лучше взять OllyDbg.

R>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?

Зависит от внутренней логики. Вдруг это поле класса, который периодически пересоздается.

Берите IDA, декомпилируйте вашу игру и смотрите, где могут храниться эти данные. Затем проверяйте правильность предположений в OllyDbg.
Re[2]: Чтение памяти другого процесса
От: pva  
Дата: 23.01.13 14:39
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Что касается отладчика, лучше взять OllyDbg.

F>Берите IDA, декомпилируйте вашу игру и смотрите, где могут храниться эти данные. Затем проверяйте правильность предположений в OllyDbg.
Оля — это прошлый век. Все что нужно и даже больше есть в иде.

R>Если вам не сложно, помогите мне точно сформулировать задачу в голове.

Из возможных вариантов:
1. Просканировать адресное пространство процесса на предмет данного числа, но с учетом его возможного представления в других типах данных. Посмотреть, меняется ли адрес в разных сессиях. Определить механизм отрисовки.
2. Брякнуться, например, на DrawText с условием, что текст совпадает с ожидаемым. По стеку отследить где и как оно отрисовывается.

Скорей всего обнаружится что-то ветвистое (дерево), которое упирается вершиной в статический указатель. Собственно, дальше дело техники. Пробегаете по цепочке указателей с учетом структуры и вытаскивается свои данные.
А может отрисовка идет в пакетном режиме. Тогда из самой отрисовки вы никакой толковой информации не получите. И прийдется анализировать откуда данные пришли изначально.
newbie
Re[3]: Чтение памяти другого процесса
От: Flammable Россия  
Дата: 23.01.13 14:46
Оценка:
Здравствуйте, pva, Вы писали:
pva>Оля — это прошлый век. Все что нужно и даже больше есть в иде.
Оля гораздо удобнее, чем IDA. Насчет всего что нужно и даже больше — есть модификация YDbg.
Re[4]: Чтение памяти другого процесса
От: pva  
Дата: 23.01.13 18:19
Оценка:
Здравствуйте, Flammable, Вы писали:

F>Оля гораздо удобнее, чем IDA. Насчет всего что нужно и даже больше — есть модификация YDbg.

Чем она гораздо удобней? Мне кажется что вы просто к ней привыкли. YDbg — это унылое гно какое-то с вырвиглаз интерфейсом. Я так подозреваю что того же можно добиться навесив на ольку фантом или стронг.
У иды гораздо больше отладочных возможностей по сравнению с олей. Удаленная отладка, ядреный режим, трейсеры, х64 отладка, мобильные девайсы и прочее. idastealth точно так же прячет иду как указанные выше плаги для одбг.

Олли больше популярна из-за обилия материалов для новичков. Это как паскаль и си. +)
Но это как раз тот случай, когда лучше час потерять, а потом за 5 минут долететь.
newbie
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.