将内存地址转换为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。
任何帮助将不胜感激。
答
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
使用'size_t'类型而不是'int'类型更安全。无论您的目标架构如何(32位或64位),“int”的长度始终为32位。但是,64位机器上的内存地址长度为64位。 size_t大小可以正确调整。 – CygnusX1 2011-02-27 20:53:48
实际上最好使用整数指针数据类型,比如'(u)intptr_t'(或指针之间差异的'ptrdiff_t'),而不是'size_t',它不是真的指针,而是大小。 – rubenvb 2011-02-27 20:57:47
考虑到对'ReadProcessMemory'的调用,我建议'UINT_PTR' - 将Win32函数与Win32类型匹配。 – MSalters 2011-02-28 10:40:45