VirtualQueryEx我如何解析结果(如何通过ReadProcessMemory知道页面是否可读?)

时间:2012-05-11 23:16:58

标签: winapi

我正在尝试学习如何访问其他进程的内存。我正在使用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;

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

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

1 个答案:

答案 0 :(得分:2)

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

  

<强> AllocationProtect

     

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

同时可以使用

VirtualProtectVirtualProtectEx来更改保护(每页,而初始保护是针对整个分配的范围)。因此,您必须根据MSDN文档中的Memory Protection Constants检查结构的Protect成员,该文档说明允许读取。检查单个位似乎不够。