C ReadProcessMemory – 如何检查与进程关联的内存区域

我想读取与特定进程相关的所有内存。 我知道ReadProcessMemory,但由于我没有使用它的经验,我担心我会得到一堆垃圾(垃圾……)。

a)我如何计算,从基本指针到结束)我可以阅读的总区域b)迭代这个内存区域并打印它的最佳方法/最安全c)如何打印给定我不知道它将包含哪些值,以便我可以查看它?

我还希望能够在输出中包含内存中每个数据的实际位置。

谢谢R.

内存可以以页为单位(通常为4096字节)访问。 如果您单独阅读每个页面,您可以知道如果读取失败,该页面将无法读取,您可以跳过它。

#define PAGESIZE 4096 char *base = (char *)0; do { char buffer[PAGESIZE]; if (ReadProcessMemory(handle, base, buffer, PAGESIZE, NULL) != 0) { // buffer is valid // the address of buffer[X] is base+X } base += PAGESIZE; // keep looping going until we wrap back around to 0 } while (base != 0); 

从VirtualQueryEx开始,确定进程的地址空间的哪些部分有备份页面,然后一旦知道了什么,可以使用ReadProcessMemory查看实际数据。

您通常需要(或至少希望)使用一些东西来充分利用ReadProcessMemory 。 对于第一个问题,找到可以读取的内存块,可以使用VirtualQueryEx查找进程中的内存区域,以及虚拟内存管理器如何标记每个区域。

要找到各个变量的位置之类的东西,通常需要使用调试API – 特别是符号部分 – SymInitializeSymGetSymFromName ,以及可能的SymEnumerateSymbols应该SymEnumerateSymbols你一个不错的开始。 虽然有很多……

谢谢Jerry Coffin。 这只是我在winnt.h中寻找的:

 typedef struct _MEMORY_BASIC_INFORMATION { PVOID BaseAddress; PVOID AllocationBase; DWORD AllocationProtect; DWORD RegionSize; DWORD State; DWORD Protect; DWORD Type; } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION; 

在winbase.h中:

 VirtualQueryEx( HANDLE hProcess, LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength );