c++ 指针操作等效于 ReadProcessMemory

c++ Pointer operation equivalent with ReadProcessMemory

本文关键字:ReadProcessMemory 指针 操作 c++      更新时间:2023-10-16

我需要从不同的应用程序读取程序的内存。我已经完成了整个过程和应用程序"连接"。

我有一个函数,

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

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

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

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

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

但问题是,如果使用"注入",上面的行会起作用,并且我正在使用 ReadProcessMemory,因为我不允许这样做。

那么,有人可以帮助"翻译"吗

(MainClass*) *(DWORD*) PatternPointer;

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

任何帮助表示赞赏。

谢谢。

您可以按照此处所述计算实际地址,即您在跳转后获取指令的地址,即

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

您可以在进程之间使用共享内存。 如果你想知道如何做到这一点,我可以发布一些代码。 Windows API 使用 CreateFileMapping() 和 MapViewOfFile()。 然后两个进程可以看到相同的内存。

相关文章:
  • 没有找到相关文章