я хочу с помощью своей программы прочесть данные из процесса игры. Достаточно легко написала небольшое консольное приложение на C#.
Проблема заключается в следующем: в интерфейсе игры я вижу определенный набор значений, которые хочу прочитать своей программой. Изначально приступая к решению вопроса, я думала, что написав небольшое приложение смогу помощью программы ArtMoney проскандировать память процесса и найти необходимые адреса нужных значений и использовать их в своем коде. К сожалению таким путем я сделать это не смогла. Как мне кажется причина заключается в том, что игра оперирует дробными значениями, а на интерфейсе показываются округленные результаты. Пробовала искать через диапазоны, тоже никаких результатов. Поиск заканчивается после первого отсеивания. Но точные данные мне как раз и не требуются, мне необходимо найти то что показывает интерфейс. Проведя достаточно много времени на поиски через ArtMoney и не добившись никаких результатов решила обратиться к вам.
1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?
2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?
Наверное надо уточнить, что сканируемая игра написана скорее всего на С++ с использованием DX, интерфейс приближен к оконному и если описывать выше изложенную задачу проще, то мне требуется прочитать данные нескольких label'ов в одном из окон. Вполне возможно, что при выводе на интерфейс искомые данные уже округляются и хранятся в текстовом виде, но опять же попытки сканирования через ArtMoney этих данных в строковом виде результатов не дали.
Здравствуйте, 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 здесь нет.
Бред какой.
Здравствуйте, pva, Вы писали:
pva>Здравствуйте, Аноним, Вы писали:
А>>Бред какой. pva>Расскажи нам, милый аноним, откуда в директх элементы label? pva>По существу что-нибудь будет?
Прошу прощение, используя термин label я конечно же не имела какой то стандартный компонент, визуально просто строка выводимая на пользовательский интрефейс, вот и применила этот термин.
Здравствуйте, pva, Вы писали:
R>>я хочу с помощью своей программы прочесть данные из процесса игры. Достаточно легко написала небольшое консольное приложение на C#. pva>Ну, во-первых, Вы ошиблись форумом. Вам на какой-нибудь ксакеп.ру надо.
Спасибо за совет, но ксакеп на мой взгляд не то место где мне могут помочь разобраться с этим.
R>>1. Каким образом можно узнать адрес значения выводимого на интерфейс? pva>Как Вы уже заметили, отладчик — самый универсальный способ. Но для пользования данным инструментом нужно иметь богатый опыт анализа. Тем более что начинаете Вы с многомегабайтного кода. Если Вы знаете что видимое на экране число не целочисленное, то можно поискать его бинарное представление от типов float, real, double.
R>>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты? pva>Скорей всего у каждого экземпляра он будет разный. Просто потому что объекты с данными создаются динамически.
Если вам не сложно, помогите мне точно сформулировать задачу в голове. Ок, решение требует использование отладчика, я приступила к изучению методов работы с ним. Но мне не совсем понятно, что я ищу. Исходя из происков с ArtM. и подсказки pva память для хранения нужного мне значения выделяется через оператор new и меняется при каждом изменении значения. Каким образом просмотр дизасемблированного кода и стека может помочь мне написать уинифицированную программу, которая будет понимать, что при открытии определенного интерфейса в игре, нужное значение лежит по такому-то адресу, а так же сама сумеет находить новый правильный адрес при ее изменении?
Здравствуйте, ravel, Вы писали:
R>помощью программы ArtMoney проскандировать память процесса и найти необходимые адреса нужных значений и использовать их в своем коде. К сожалению таким путем я сделать это не смогла. Как мне кажется причина заключается в том, что игра оперирует дробными значениями, а на интерфейсе показываются округленные результаты.
Игра может хранить переменные в зашифрованном виде.
R>1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?
Если ArtMoney не помогает, то только отладчиком.
R>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?
Если это статическая переменная, то адрес скорее всего будет постоянным, относительно модуля, которому пренадлежит переменная.
Если переменная лежит в стеке или в куче, то адрес будет всегда разный. Но иногда можно найти указатель на эту переменную или структуру (или указатель на этот указатель).
А вообще создайте тред на www.exelab.ru и вам с радостью ребята помогут. Только они скорее всего запросят EXE-файл, так что выкладывайте сразу.
Здравствуйте, ravel, Вы писали:
R>1. Каким образом можно узнать адрес значения выводимого на интерфейс? В настоящий момент рассматриваю вариант использования дебагера (скачала и установила windbg), но опыта отладки чужих программ нет и на первый взгляд там все очень сложно, так что пока изучаю как им пользоваться. Может быть есть другие способы и инструменты?
Что касается отладчика, лучше взять OllyDbg.
R>2. Допустим так или иначе я получу нужный адрес, для примера пусть он будет 034F101E, правильно ли я понимаю, что у запущенного экземпляра данной программы адрес для хранения данного значения будет постоянным или же я сильно ошибаюсь и тут есть варианты?
Зависит от внутренней логики. Вдруг это поле класса, который периодически пересоздается.
Берите IDA, декомпилируйте вашу игру и смотрите, где могут храниться эти данные. Затем проверяйте правильность предположений в OllyDbg.
Здравствуйте, Flammable, Вы писали:
F>Что касается отладчика, лучше взять OllyDbg. F>Берите IDA, декомпилируйте вашу игру и смотрите, где могут храниться эти данные. Затем проверяйте правильность предположений в OllyDbg.
Оля — это прошлый век. Все что нужно и даже больше есть в иде.
R>Если вам не сложно, помогите мне точно сформулировать задачу в голове.
Из возможных вариантов:
1. Просканировать адресное пространство процесса на предмет данного числа, но с учетом его возможного представления в других типах данных. Посмотреть, меняется ли адрес в разных сессиях. Определить механизм отрисовки.
2. Брякнуться, например, на DrawText с условием, что текст совпадает с ожидаемым. По стеку отследить где и как оно отрисовывается.
Скорей всего обнаружится что-то ветвистое (дерево), которое упирается вершиной в статический указатель. Собственно, дальше дело техники. Пробегаете по цепочке указателей с учетом структуры и вытаскивается свои данные.
А может отрисовка идет в пакетном режиме. Тогда из самой отрисовки вы никакой толковой информации не получите. И прийдется анализировать откуда данные пришли изначально.
Здравствуйте, pva, Вы писали: pva>Оля — это прошлый век. Все что нужно и даже больше есть в иде.
Оля гораздо удобнее, чем IDA. Насчет всего что нужно и даже больше — есть модификация YDbg.
Здравствуйте, Flammable, Вы писали:
F>Оля гораздо удобнее, чем IDA. Насчет всего что нужно и даже больше — есть модификация YDbg.
Чем она гораздо удобней? Мне кажется что вы просто к ней привыкли. YDbg — это унылое гно какое-то с вырвиглаз интерфейсом. Я так подозреваю что того же можно добиться навесив на ольку фантом или стронг.
У иды гораздо больше отладочных возможностей по сравнению с олей. Удаленная отладка, ядреный режим, трейсеры, х64 отладка, мобильные девайсы и прочее. idastealth точно так же прячет иду как указанные выше плаги для одбг.
Олли больше популярна из-за обилия материалов для новичков. Это как паскаль и си. +)
Но это как раз тот случай, когда лучше час потерять, а потом за 5 минут долететь.