1

我正在尝试学习如何访问其他进程的内存。我正在使用ReadProcessMemory但它失败了,据说是因为我正在从无法访问的内存中读取。我想我应该VirtualQueryEx先看看我要读取的内存是否可读,但我不知道如何解析VirtualQueryEx.

VirtualQueryEx返回此处描述的结构http://msdn.microsoft.com/en-us/library/windows/desktop/aa366775%28v=vs.85%29.aspx

有没有什么好的简单方法可以知道MEMORY_BASIC_INFORMATION结构中的值是否表明该页面是可读的ReadProcessMemory

这个结构有几个参数,据我了解,定义内存是否可访问:

DWORD  AllocationProtect;
DWORD  State;
DWORD  Protect;
DWORD  Type;

它甚至不清楚哪些参数组合实际上允许读取内存(例如,我应该从AllocationProtector读取保护标志ProtectState除了 Commit 是否意味着内存不可读等)并产生巨大的 if (这就是那个,那是那或这就是……)似乎不是一个干净的解决方案。

一定有更好的方法,但我似乎无法找到它......

4

1 回答 1

2

实际上,线索在您链接的文档中:

分配保护

最初分配区域时的内存保护选项。此成员可以是内存保护常量之一,如果调用者无权访问,则为 0。

VirtualProtect或者VirtualProtectEx可以同时用于更改保护(每页,而初始保护是针对整个分配范围)。因此,您必须根据 MSDN 文档中声明允许读取的内存保护常量Protect检查结构的成员。检查单个位似乎还不够。

于 2012-05-12T00:42:41.173 回答