为什么无法从具有PAGE_GUARD保护的块读取数据?

use*_*337 2 windows operating-system readprocessmemory virtualquery virtual-address-space

我使用ReadProcessMemory函数从地址空间读取数据.我尝试从所有具有MEM_PRIVATE类型的块读取.但是当该块具有PAGE_GUARD保护时,我得到错误(函数返回0),为什么?

谢谢大家.

Han*_*ant 5

保证无法访问具有PAGE_GUARD保护的页面.对它的任何访问都会产生页面错误,并将其作为STATUS_GUARD_PAGE_VIOLATION异常反映回拥有该页面的进程.Windows中大量使用此功能来检测并恢复此站点命名的条件.

一个线程堆栈的最后两页是保护页面.当程序递归地耗尽时,消耗所有堆栈空间并触发异常,操作系统重新映射这些页面以使它们可用作紧急堆栈空间并重新引发STATUS_STACK_OVERFLOW异常.这使程序能够处理心脏病发作.通常的结果是简短的消息和程序终止.

绊倒页面保护异常是一次性事件,一旦你做到那里就没有后卫了.显然,只有过程中的代码才会使它绊倒是非常非常重要的.没有任何一种情况可以让你进入另一个进程的地址空间并绊倒异常,它将永远达到目的.除了这个过程不知道发生了什么,因此永远无法正确回应异常,它也消除了安全孵化.如果你戳了一个堆栈保护页面,那么你就会立即终止程序.

现在应该很明显,您有意通过使用ReadProcessMemory()来限制访问这些页面.当你这样做时,没有什么好事可能发生.返回值告诉你"这里没什么可看的,继续前进".