2013-10-29 28 views
2

我需要从不同的应用程序中读取程序的内存。 我有整个过程和应用程序“连接”。C++与ReadProcessMemory等效的指针操作

我有搜索,在打开的进程的内存图案的功能,而且由于采用了签名会返回一个有效的切入点,我感兴趣的函数。

问题是,装配指令使我的数据(这是我无法通过偏移或签名找到),如下:

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

我搜索了一圈,发现这可能成为我的目的:

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

但问题是,如果使用'注入',上面的行将工作,并且我使用ReadProcessMemory,因为我不允许这样做。

因此,有人可以帮忙“翻译”的

(MainClass*) *(DWORD*) PatternPointer; 

指针操作成ReadProcessMemory调用,考虑汇编指令? 鉴于我从另一个应用程序打开,如果没有ReadProcessMemory(我可以定期调用其他操作),我无法访问H5Calc内存区域。

任何帮助表示赞赏。

谢谢。

+0

'ReadProcessMemory(hProc,( void *)0x12DCD70,&data,sizeof data,NULL);',也许? (当然,假设'data'是一个'DWORD'或一个指针。) – 2013-10-29 06:42:01

+0

我同意这看起来很合逻辑,但我不知道如何从''e8 10f1ffff''或'1sddc5b <=这是我从签名中得到的地址'中获得'12dcd70': ( –

+0

它在你发布的代码的右边...... – 2013-10-29 07:02:15

回答

0

您可以按照here所述计算实际地址,即i。即你把指令的跳转后的地址,这是

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

感谢为C例如 –

+0

这工作完全,但是我现在有什么似乎是一个类似的问题: 'H5Calc.exe + 989E2A - 8B 0D 888C1D03 - MOV ECX,[H5Calc.exe + 2DD8C88]' 通过调试内存,我认为这应该引导我到002BC768,但上述逻辑似乎并不适用。 (该死的我们不能在评论中插入换行符?)。我意识到MOV指令支持右侧的值和地址,但我不明白'888C1D03'是如何解释的。 –

+0

@Alphacockroach我猜'mov'指令没有'call'指令所具有的相同的二进制编码方案。 – 2013-11-03 18:02:30

0

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

+0

谢谢,但我不需要在流程之间进行实际的沟通,我只需要了解如何解释ASM,并且能够o使用readprocessmemory来执行所需的操作。 –