@PeroPero

Как прочитать указатель из памяти чужого процесса?

Здравствуйте, с помощью ArtMoNey нашел указатель на указатель. И вот проблема я читаю данные так
ReadProcessMemory(process, (LPCVOID)0x006C1D48, &p1, 4, NULL);

Не могу понять как прочесть указатель.
Вот скрин окна с ArtMoNey. Как понимаю 0x006C1D48 это адрес где лежит указатель 0x00AC1D48 если прибавить к нему смещение + 3060 , получим адрес другого указателя 0x00C00BF4 если прибавить к нему смещение +200 , то получим нужный мне адрес 0x2E947868. Подскажите как действовать , а то я запутался.
ReadProcessMemory если в него передать сразу адрес 0x2E947868 то все нормально работает.
PrjiwZ_Lzt8.jpg
  • Вопрос задан
  • 1287 просмотров
Пригласить эксперта
Ответы на вопрос 3
TrueBers
@TrueBers
Гуглю за еду
Хватит плодить вопросы. Ответ на них не поместится на десяток страниц. Почитай лучше про адресацию памяти, что такое абсолютный адрес, относительный, что такое базовый адрес процесса, что такое рандомизация базового адреса. Просто так взять и прочитать память не получится.

1. Этот адрес работает только для текущего процесса.
2. Во-вторых, он будет другим при каждом запуске и выделении памяти из кучи.
3. Он так же может меняться из-за ASLR

Чтобы докопаться до реальной структуры данных с информацией о персонаже, нужно найти то место в коде, где эта структура выделяется на куче. Т. е. там должно быть что-то типа
CharInfo info = new CharInfo();
(_thiscall) CharInfo::CharInfo(info)

Вот этот кусок кода тебе нужно найти, только так ты сможешь определить статическое место, откуда потом уже будешь плясать. Для поиска кода нужно знать хотя бы основы Ассемблера. Поможет в этом декомпилятор IDA Pro с плагином Hex-Rays.
Но и этих мест может быть не одно, а десятки и сотни в случае с шаблонными классами и функциями. Тут уже нужен отладчик, чтобы поставить точки останова на чтение или запись памяти, и от них уже отталкиваться.

Обычным чтением из памяти ты ничего не добьёшься, чтобы пойти по цепочке вызовов с необходимым адресом, тебе нужно самому внедрять свой код в клиент игры, либо пользоваться фреймворками для динамической инструментации, например, DynamoRIO, Intel PIN, Frida.

Тесты лучше проводи на пиратке, ибо официальный клиент может забанить за такие действия.

Начать можно, кстати, с курса Рикардо Нарвахи "Введение в крекинг с нуля, используя OllyDbg". Это огромный курс статей, в которых разбирается всё, что нужно для понимания основ. Там 50 с чем-то глав различной сложности, погугли. Есть ещё на ютубе целый плейлист с видео-разборами этого курса.
Ответ написан
Комментировать
@nirvimel
ArtMoney недостаточно для написания полноценного runtime-патча. Потребуется полноценный отладчик, чтение и понимание фрагментов кода, которые ответственны за чтение/запись этого значения.
Могу предсказать проблему, с которой вы столкнетесь, пытаясь выявить (якобы существующую) цепочку указателей - при каждом новом запуске это значение (и все указатели на него) будет появляться по новому адресу.
spoiler
Ибо не все так просто.
Ответ написан
Rou1997
@Rou1997
Освоили бы отладчики и прочий существующий инструментарий для анализа структуры памяти процессов, прежде чем писать "велосипед", а может быть и вместо этого.
И интересно, что вы вообще хотите написать такое, с чтением из памяти "чужого" процесса?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы