10_PAE_非PAE
在 windows 中 保护模式 有两种模式: 段保护 和 页保护
段保护 主要体现在 段选择子上;但是数据段、代码段、栈段等采用的都是4GB平坦模式,段的特征并没有那样展现。所以具体的保护机制 采用的是页保护。
PAE和 非PAE:
页保护 有两种:
-
非 PAE
-
PAE
开启 PAE:
在 boot.ini 中 设置:为 noexcute -- 即不可执行 ;激活 DEP 的功能 -在这个时候 使用的是 PAE(因为早期的非PAE 并不支持数据执行保护);
选择 为 execute -optin 后 这里的 数据执行保护 是灰色的 根本就不能设置。这时候 就是 非 PAE 模式下。相反 就是 PAE 模式下。
图解 非 PAE:
图解 PAE:
注意: 内核地址中 专门有一块却与用来存放 pte表、pde 表的 非pae 是 4MB , pae 由于每项是8byte 所以变为 8MB;
这里 假设一个虚拟地址 0x403018 则:
手动模拟 解析 PAE地址:
-
获取测试进程的cr3
> !process 0 0 // 获取当前进程列表,找到测试进程的 dirbase = cr3
-
解析虚拟地址 0x403018
> .formats 0x403018 // 查看二进制
然后手动分解 pdpte pde pte offset :
---// 00 000000010 000000011 000000011000
---// 0 2 3 18
-
结合windbg 找对应的物理地址:
-
找 pdpte 中的项 pde 的地址
cr3 + 8*0
-
找 pde 中的项 pte 的地址
pde + 2*8
-
找 pte 中 页的地址
pte + 3*8
-
页的 地址 + offset 即 是 目标物理地址
p + 18
-
-
如图:
/i 进程调度的时候 切换 进程到指定进程:
g 运行起来 激活 调度;以至于到目标进程的时候停下来
查看 当前进程 的 cr3
使用 db 查看这时候进程空间 虚拟地址 数据
使用 windbg 解析 虚拟地址对应的物理地址:
!vtop 有两个参数
第一个对应的是 cr3
第二个参数 是 对应进程的虚拟地址。
使用 !pte 0xaddr 查看对应addr 中的页属性(前提:必须切换到当前进程,cr3也需要切换到,即 !process 0 0; .process /i xxxxx;g;)
通过下面这两个公式 解析出所在的 pde 、pte
修改pte 属性,关闭dep