c++指针操作等同于ReadProcessMemory

标签 c++ pointers readprocessmemory

我需要从不同的应用程序读取程序的内存。 我已将整个过程和应用程序“连接”到位。

我有一个函数可以在打开的进程的内存中搜索模式,并且由于签名返回了我感兴趣的函数的有效入口点。

问题是,引导我找到数据(我无法通过偏移量或签名找到)的汇编指令如下:

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

我四处搜索,发现这可能符合我的目的:

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

但问题是,如果使用“注入(inject)”,上面的行将起作用,而我正在使用 ReadProcessMemory,因为我不允许这样做。

那么,有人可以帮助“翻译”

(MainClass*) *(DWORD*) PatternPointer;

将指针操作转换为 ReadProcessMemory 调用,考虑汇编指令? 鉴于我是从另一个应用程序打开的,如果不使用 ReadProcessMemory(我可以定期调用它进行其他操作),我将无法访问 H5Calc 内存区域。

感谢任何帮助。

谢谢。

最佳答案

您可以按照说明计算实际地址here , 一世。 e.您取跳转后指令的地址,即

0x12DDC5B + 5 = 0x12DDC60

然后你取偏移量,它是一个 32 位小端 2 的补码有符号整数,所以

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

然后将偏移量添加到上面计算的基地址得到

0x12DDC60 + (-0xEF0) = 0x12DCD70

在 C 中,这看起来像:

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);

关于c++指针操作等同于ReadProcessMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19651318/

相关文章:

c++ - Qt - 如何自定义 QTableWidget 的复选框

c - 将 32 位值分配给无符号 uint8_t 数组

c++ - 了解如何使用带指针作为参数的typedef void函数

C++ ReadProcessMemory 收到 998/3E6 错误

c++ - 轻量级 Windows 应用程序的最佳开源示例是什么?

c++ - 仅扩展到其参数的 PROTOTYPE 宏有何意义?

c++ - 为什么不允许将 Derived T::* 转换为 Base T::*?

c - 使用 void 指针进行指针算术

python - 使用 ctypes 读取进程内存

c# - 获取进程内存的图像