c ++ Указатель операции, эквивалентный с ReadProcessMemory

Мне нужно прочитать память программы из другого приложения.
У меня есть весь процесс и приложение «связь» на месте.

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

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

H5Calc.exe+12DDC5B - E8 10F1FFFF           - call H5Calc.exe+12DCD70

Я искал вокруг и обнаружил, что это может служить моей цели:

return (MainClass*) *(DWORD*) PatternPointer;

но проблема в том, что строка выше будет работать, если использовать «инъекцию», а я использую ReadProcessMemory, поскольку мне не разрешено это делать.

Итак, кто-то может помочь «перевод»

(MainClass*) *(DWORD*) PatternPointer;

операция указателя в вызове ReadProcessMemory, учитывая инструкцию по сборке?
Учитывая, что я открываю из другого приложения, у меня нет доступа к области памяти H5Calc, если не с ReadProcessMemory (который я могу регулярно вызывать для других операций).

Любая помощь приветствуется.

Благодарю.

3

Решение

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

0x12DDC5B + 5 = 0x12DDC60

затем вы берете смещение, которое представляет собой 32-разрядное целое число со знаком с порядком байтов младшего байта 2, так

"0x10 0xF1 0xFF 0xFF" = 0xFFFFF110 - 0x100000000 = -0xEF0

Затем вы добавляете смещение к базовому адресу, вычисленному выше, чтобы получить

0x12DDC60 + (-0xEF0) = 0x12DCD70

В Си это будет выглядеть примерно так:

unsigned char *jmp_ptr = (unsigned char *)0x12DDC5B;
int offset; // or use ptrdiff_t if it's 32 bits wide
ReadProcessMemory(hProc, jmp_ptr + 1, &offset, sizeof offset, NULL);
unsigned char *target_ptr = jmp_ptr + 5 + offset;

(примените стилистические сочетания для получения кода C ++. Также проверьте возвращаемое значение функции и т. д.)

Теперь вы можете передать полученный адрес на другой звонок ReadProcessMemory() чтобы получить указатель на экземпляр:

MainClass *instance = NULL;
ReadProcessMemory(hProc, target_ptr, &instance, sizeof instance, NULL);
1

Другие решения

Вы можете использовать общую память между процессами. Если вы хотите знать, как это сделать, я могу опубликовать код. Windows API использует CreateFileMapping () и MapViewOfFile (). Тогда оба процесса могут видеть одну и ту же память.

0

По вопросам рекламы [email protected]