繁体   English   中英

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

[英]C ReadProcessMemory - how to examine the memory area associated with a process

我想读取与特定进程关联的所有内存。 我知道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-特别是Symbol部分SymInitializeSymGetSymFromNameSymEnumerateSymbols应该可以让您获得一个不错的开始。 还有很多...

谢谢杰里·科芬。 这只是我在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
);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM