我使用 ReadProcessMemory 函数从地址空间读取数据。我尝试读取所有具有 MEM_PRIVATE 类型的块。但是当该块具有 PAGE_GUARD 保护时,我收到错误(函数返回 0),为什么?
谢谢大家。
具有 PAGE_GUARD 保护的页面保证不可访问。对它的任何访问都会产生页面错误,并反射回来进入拥有该页面的进程作为 STATUS_GUARD_PAGE_VIOLATION 异常。此功能在 Windows 中被大量使用,用于检测此站点所指定的状况并从中恢复。
线程堆栈的最后两页是保护页。当程序递归地崩溃、消耗所有堆栈空间并触发异常时,操作系统会重新映射这些页面,使它们可用作紧急堆栈空间,并重新引发 STATUS_STACK_OVERFLOW 异常。这使得程序可以处理心脏病发作。通常的结果是一条简短的消息和程序终止。
触发页面防护异常是一次性的事情,一旦触发,就不再有防护了。显然是非常非常重要的是只有进程中的代码才会触发它。不存在这样的情况:你探查另一个进程的地址空间并引发异常,它永远不会有好的结果。除了进程之外,不知道发生了什么,因此永远无法正确响应异常,它也消除了安全舱口。如果你戳了堆栈保护页面之一,那么你会立即终止程序。
现在应该很明显了,您被故意限制使用 ReadProcessMemory() 访问这些页面。当你这样做的时候,不可能有什么好事发生。返回值告诉您“这里没有什么可看的,继续前进”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)