Windows内核实验 ——— PAE分页

前言

上个实验中我们通过将PAE进行关闭之后学习通过CR3来找到真实物理地址的方式,而在此次实验中将恢复为原来的noexecute,来再次完成原先我们的操作

实验过程

与上次实验一样,我们先执行我们之前运行的一个获取cr3以及signFlag地址的程序

此处不再贴代码了,找代码可以往回翻一下非PAE分页处的代码

同样需要注意修改 int 20H 的中断

运行成功后与之前类似,我们查找当前运行的程序的信息

signFlag拆分为二进制,与之前不同的是我们此处分割需要采用2+9+9+12

1
2
3
4
5
6
# 0x004197B0
# 00000000 01000001 10010111 101100000
00 # 0x00 pdpti
000000 010 # 0x02 pdi
00001 1001 # 0x19 pti
0111 10110000 # 0x7B0 offset

采用上述分割方式是因为在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
!vtop 2140300 4197b0

PAE模式下在虚拟内存中PTE映射的位置在0xC0000000,PDE在虚拟内存中映射在0xC0300000

而在非PAE模式中PTE映射的位置在0xC0000000,PDE在虚拟内存中映射在0xC0600000

image-20230604211029686

因为其在PAE模式下PTE以及PDE由原来的4字节扩展到了8字节,进而对齐的内存相当于大了一倍

那么我们原来的PTE的计算公式可以更新为:

1
0xC0000000 + ((addr >> 12) << 3)

PDE的计算公式:

1
0xC0600000 + ((addr >> 21) << 3)

总结

我们在两种模式下找到了PTE的位置,以及PDE的位置,为我们了解并操控页提供了相应的帮助


Windows内核实验 ——— PAE分页
https://equinox-shame.github.io/2023/06/04/Windows内核实验 — PAE分页/
作者
梓曰
发布于
2023年6月4日
许可协议