[英]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部分SymInitialize
, SymGetSymFromName
和SymEnumerateSymbols
应该可以让您获得一个不错的开始。 还有很多...
谢谢杰里·科芬。 这只是我在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.