0

我试图从内存中运行的可执行文件中读取内存地址,然后使用这些内存地址来遍历 PE 结构。

我遇到了麻烦,因为我不确定如何将 4 字节 char 数组转换为它的 int 等价物。

到目前为止,这是我的代码:

char buffer[4];
int e_lfanew = 60;

if(!ReadProcessMemory(pHandle, (me32.modBaseAddr + e_lfanew), buffer, 4, NULL))
{
    printf("ReadProcessMemory @ %x Failed (%d)\n", me32.modBaseAddr, GetLastError());
}

我正在读取的地址,在本例中为 0xE0000000,是 PE 标头的偏移量。我想获取我刚刚读取的内存地址并将其用作偏移量以再次从进程内存中读取,但我无法弄清楚如何将其正确转换为 int。

任何帮助将不胜感激。

4

2 回答 2

3
 buffer[0]        | 
(buffer[1] <<  8) |
(buffer[2] << 16) |
(buffer[3] << 24)

或相反,取决于您的高位字节是缓冲区 [0] 还是缓冲区 [3]

于 2011-02-27T19:58:27.130 回答
0
int MemoryBufferToInt(char* buffer, int buffer_size) {
   int result;
   assert(buffer_size == sizeof(result));
   memcpy(&result, &buffer[0], sizeof(result));
   return result;
} 

上面的代码假设这个缓冲区是从进程中获得的,因此内存缓冲区的字节顺序与您平台上常规 int 的字节顺序相同。否则,如果您知道缓冲区的字节顺序是什么,您可以轻松地为特定字节顺序构造整数。

请注意,您可以static_cast<char*>(&result)代替缓冲区用作检索缓冲区内容的函数的参数。

于 2011-02-27T19:59:07.520 回答