跳转至

区分 x86 Windows 内存保护属性

你目前学到的内存读取技术非常基础。它们假设你访问的内存受到 PAGE_READWRITE 属性保护。虽然这个假设对变量数据是正确的,但其他类型的数据存在于具有不同类型保护的页面上。表 6-1 描述了 x86 Windows 中不同类型的内存保护。

保护类型值读取?写入?执行?特殊权限?否否否是否否是是否是是否是,写入时复制否否是是否是是是是是是是是,写入时复制否否否是,守卫页面

如果表 6-1 中的保护类型在任何权限列中有「是」,意味着可以对该内存页面执行相应操作。例如,如果页面是 PAGE_READONLY,程序可以读取该页面上的内存,但不能写入该内存。

例如,常量字符串通常以 PAGE_READONLY 保护存储。其他常量数据,比如虚函数表和模块的整个可移植可执行文件(PE)头(包含关于程序的信息,比如它是哪种应用程序、使用的库函数、大小等等),也存储在只读页面上。另一方面,汇编代码存储在受 PAGE_EXECUTE_READ 保护的页面上。

大多数保护类型只涉及读取、写入和执行保护的某种组合。目前,你可以安全地忽略特殊保护类型;如果你好奇,我在第一百二十六页「特殊保护类型」中介绍了它们,但只有非常高级的破解才会需要这些知识。不过,基本保护类型会在你的游戏破解之旅中随处可见。