我愿意阅读与特定进程相关的所有内存。我知道ReadProcessMemory,但由于我没有使用它的经验,我担心我会得到一堆垃圾(垃圾......)。
a)我如何计算出从基本指针到结尾的全部区域,我可以阅读 b)迭代这个内存区域并打印它的最佳方法/最安全的方法是什么 c)我如何打印它,因为我不知道它将包含哪些值,以便我可以查看它?
我还希望能够在输出中包含内存中每个数据的实际位置。
谢谢R。
答案 0 :(得分:5)
可以以页为单位访问内存(通常为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);
答案 1 :(得分:4)
从VirtualQueryEx开始,确定进程地址空间的哪些部分有备份页面,然后一旦知道了什么,就可以使用ReadProcessMemory查看实际数据。
答案 2 :(得分:1)
您通常需要(或至少需要)使用ReadProcessMemory
来充分利用这些内容。对于第一个问题,找到可以读取的内存块,可以使用VirtualQueryEx
查找进程中的内存区域,以及虚拟内存管理器如何标记每个区域。
要查找单个变量的位置等内容,通常需要使用调试API - 特别是符号部分 - SymInitialize
,SymGetSymFromName
,可能SymEnumerateSymbols
应该可以使用一个体面的开始。虽然有很多......
答案 3 :(得分:0)
谢谢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
);