Мне нужно прочитать память программы из другого приложения.
У меня есть весь процесс и приложение «связь» на месте.
У меня есть функция, которая ищет шаблон в памяти открытого процесса и благодаря подписи возвращает действительную точку входа в интересующую меня функцию.
Проблема в том, что инструкция по сборке, которая приводит меня к данным (которые я не могу найти через смещение или подпись), заключается в следующем:
H5Calc.exe+12DDC5B - E8 10F1FFFF - call H5Calc.exe+12DCD70
Я искал вокруг и обнаружил, что это может служить моей цели:
return (MainClass*) *(DWORD*) PatternPointer;
но проблема в том, что строка выше будет работать, если использовать «инъекцию», а я использую ReadProcessMemory, поскольку мне не разрешено это делать.
Итак, кто-то может помочь «перевод»
(MainClass*) *(DWORD*) PatternPointer;
операция указателя в вызове ReadProcessMemory, учитывая инструкцию по сборке?
Учитывая, что я открываю из другого приложения, у меня нет доступа к области памяти H5Calc, если не с ReadProcessMemory (который я могу регулярно вызывать для других операций).
Любая помощь приветствуется.
Благодарю.
Вы можете рассчитать фактический адрес, как описано Вот, я. е. Вы берете адрес инструкции после прыжка, который является
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);
Вы можете использовать общую память между процессами. Если вы хотите знать, как это сделать, я могу опубликовать код. Windows API использует CreateFileMapping () и MapViewOfFile (). Тогда оба процесса могут видеть одну и ту же память.