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

时间:2010-02-25 01:15:41

标签: c++ c visual-studio-2008

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

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

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

谢谢R。

4 个答案:

答案 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 - 特别是符号部分 - SymInitializeSymGetSymFromName,可能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
);