Windows内核实验 ——— PAE分页
前言
上个实验中我们通过将PAE进行关闭之后学习通过CR3来找到真实物理地址的方式,而在此次实验中将恢复为原来的noexecute
,来再次完成原先我们的操作
实验过程
与上次实验一样,我们先执行我们之前运行的一个获取cr3
以及signFlag
地址的程序
此处不再贴代码了,找代码可以往回翻一下非PAE分页处的代码
同样需要注意修改 int 20H 的中断
运行成功后与之前类似,我们查找当前运行的程序的信息
将signFlag
拆分为二进制,与之前不同的是我们此处分割需要采用2+9+9+12
1 |
|
采用上述分割方式是因为在PAE模式下引入了一个PDPT的模块,其被称为页目录指针表,在这个表中,每个表项被称为PDPTE,也就是页目录指针表项,保存页目录的基址
而在非PAE模式下采用的是三段式分页,三段式分页中的PDE
以及PTE
都是4 字节
,无论是PDT还是PTT都有着1024个表项
但在非PAE分页中,引入了PDPT表,其只有四个表项,PDT以及PTT有 512 个表项。PDPTE、PDE、PTE的大小是8 字节
,PDPT表一共占用 32 字节,PDT、PTT表仍占用 4KB 的物理页
接下来我们继续以相似的方式来获取signFlag
的真实物理地址
查找cr3指向的PDPT表项
查找指向的PDT表项
查找指向的PTT表项
查找指向的物理内存
可以看到我们同样的成功找到了signFlag
对应的物理地址
同时我们观察其指向的PTT表项的最高位出现了一个 8 (二进制下最高位置一),其代表着关闭了栈执行的权限,即开启了数据执行保护
和之前一样我们同样可以使用!vtop
指令来获取对应物理地址
1 |
|
PAE模式下在虚拟内存中PTE映射的位置在0xC0000000
,PDE在虚拟内存中映射在0xC0300000
而在非PAE模式中PTE映射的位置在0xC0000000
,PDE在虚拟内存中映射在0xC0600000
因为其在PAE模式下PTE以及PDE由原来的4字节扩展到了8字节,进而对齐的内存相当于大了一倍
那么我们原来的PTE的计算公式可以更新为:
1 |
|
PDE的计算公式:
1 |
|
总结
我们在两种模式下找到了PTE的位置,以及PDE的位置,为我们了解并操控页提供了相应的帮助