【软件安全】PAE下虚拟地址到物理地址的转换

欢迎大家到我的个人主页点击打开链接,一起交流、学习,一起进步~

之前文章讲到利用windbg查询文件的PTE和PDE,现尝试手动实现虚拟地址转换到物理地址。

使用ollydbg打开我们的hello world,查看字符串所在位置:


【软件安全】PAE下虚拟地址到物理地址的转换


打开windbg进入内核调试状态,进入该进程,查看该虚拟地址对应的字符串,使用命令!vtop查看该虚拟地址对应的物理地址:


【软件安全】PAE下虚拟地址到物理地址的转换

【软件安全】PAE下虚拟地址到物理地址的转换

【软件安全】PAE下虚拟地址到物理地址的转换

【软件安全】PAE下虚拟地址到物理地址的转换


这里发现一个奇怪的东西:PAE是什么?

http://blog.****.net/q1007729991/article/details/52829235该博文中有对PAE更为详细的讲解,简单来讲就是将32位的线性地址空间映射到52位的物理地址空间。

三段式分页是将线性地址拆分成了 10-10-12 的形式,而 PAE 分页将线性地址拆分成了 2-9-9-12 的四段式,即 3 段索引加偏移,其中的两个 9 分别是页目录表索引和页表索引。

2-9-9-12 分页方式转换方式:

  1. 根据 CR3 找到 Page Directory Pointer Table
  2. 根据一级索引在 Page Directory Pointer Table 中查询到 Page Directory
  3. 根据二级索引在 Page Directory 中查询到 Page Table
  4. 根据三级索引在 Page Table 中查询到普通 4KB 物理页
  5. 在物理页中查找第四段偏移。

三段式分页中的 PDE 和 PTE 都是 4 字节,无论是 PDT 还是 PTT 都有1024个表项。而PAE分页中,PDPT只有 4 个表项,PDT 和 PTT 有 512 个表项,PDPTE、PDE、PTE 的大小是 8 字节。PDPT 表一共占用 32 字节,PDT 、PTT 表仍然占用 4KB 的物理页。PAE 分页多了一个 PDPT 表,也就是*目录表,它主要用来查找页目录的基址。

于是我们将”hello world”所在的虚拟地址分成2-9-9-12的形式:

00  000000010  000000100  000000000000

0            2                 4                     0


【软件安全】PAE下虚拟地址到物理地址的转换


(这次实验已经过去快一个月了,但是就是想找到这个hello world,时隔一个月后再看,当时花费很大的功夫查找资料,但是尝试的都是三段式分页,这次通过结果找方法,终于发现了一些不太一样的东西,还是要继续加油啊~)