我正在尝试学习如何访问其他进程的内存。我正在使用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;
它甚至不清楚哪些参数组合实际上允许读取内存(例如,我应该从AllocationProtect
或Protect
读取保护标志,除了提交之外的State
是否意味着内存是不可读的,等等,并制作一个巨大的if(这就是那个或那就是那个....)似乎不是一个干净的解决方案。
必须有更好的方法,但我似乎无法找到它......
答案 0 :(得分:2)
实际上线索在您链接的文档中:
同时可以使用<强> AllocationProtect 强>
最初分配区域时的内存保护选项 。这个成员可以是一个 内存保护常量,如果调用者没有访问权限,则为0。
VirtualProtect
或VirtualProtectEx
来更改保护(每页,而初始保护是针对整个分配的范围)。因此,您必须根据MSDN文档中的Memory Protection Constants检查结构的Protect
成员,该文档说明允许读取。检查单个位似乎不够。