【问题标题】:c++ Pointer operation equivalent with ReadProcessMemoryc++ 指针操作等价于 ReadProcessMemory
【发布时间】:2013-10-29 06:35:52
【问题描述】:

我需要从不同的应用程序中读取程序的内存。 我有整个流程和应用程序的“连接”。

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

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

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

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

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

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

那么,有人可以帮忙“翻译”一下吗

(MainClass*) *(DWORD*) PatternPointer;

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

任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • ReadProcessMemory(hProc, (void *)0x12DCD70, &data, sizeof data, NULL);,也许吧? (当然,假设dataDWORD 或指针。)
  • 我同意这似乎合乎逻辑,但我不知道如何从 'e8 10f1ffff'1sddc5b <= this one the address i get to from the signature 中取出 '12dcd70' :(
  • 它在您发布的代码的右侧...
  • 真的,但这是来自调试器的调试信息。在使用我的模式查找例程时,该信息是未知的,我只能访问 e8 10f1ffff0 字节序列。
  • 在这种情况下,here's how you can do that

标签: c++ pointers readprocessmemory


【解决方案1】:

您可以按照here 的描述计算实际地址,即。 e.你取跳转后指令的地址,即

0x12DDC5B + 5 = 0x12DDC60

然后你取一个 32 位 little endian 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);

【讨论】:

  • 这很好用,但是我现在遇到了类似的问题:H5Calc.exe+989E2A - 8B 0D 888C1D03 - mov ecx,[H5Calc.exe+2DD8C88] 通过调试内存,我认为这应该会导致我找到 002BC768,但上述逻辑似乎并不适用。 (该死的我们不能在 cmets 中放置换行符吗?)。我意识到 MOV 指令同时支持右侧的值和地址,但我不明白如何解释 888C1D03
  • @Alphacockroach 我猜mov 指令没有与call 指令相同的二进制编码方案。
【解决方案2】:

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

【讨论】:

  • 谢谢,但我现在不需要进程之间的实际通信。我只需要了解如何解释 ASM 并能够使用 readprocessmemory 来执行所需的操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
  • 1970-01-01
  • 2016-07-24
  • 2015-09-06
  • 2022-01-23
相关资源
最近更新 更多