将内存地址转换为int

问题描述:

我正尝试从内存中运行的可执行文件读取内存地址,然后使用这些内存地址来遍历PE结构。将内存地址转换为int

我遇到了麻烦,因为我不确定如何将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 header的偏移量。我想读取刚刚读取的内存地址,并将其用作偏移量以再次从进程内存中读取,但我无法弄清楚如何正确地将其转换为int。

任何帮助将不胜感激。

+0

使用'size_t'类型而不是'int'类型更安全。无论您的目标架构如何(32位或64位),“int”的长度始终为32位。但是,64位机器上的内存地址长度为64位。 size_t大小可以正确调整。 – CygnusX1 2011-02-27 20:53:48

+0

实际上最好使用整数指针数据类型,比如'(u)intptr_t'(或指针之间差异的'ptrdiff_t'),而不是'size_t',它不是真的指针,而是大小。 – rubenvb 2011-02-27 20:57:47

+0

考虑到对'ReadProcessMemory'的调用,我建议'UINT_PTR' - 将Win32函数与Win32类型匹配。 – MSalters 2011-02-28 10:40:45

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

或周围的其他方法,根据你的高位字节是否是缓冲液[0]或缓冲液[3]

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)代替缓冲区作为检索缓冲区内容的函数的参数。

+0

谢谢。这很好! – Brian 2011-02-27 23:34:58