前置知识:

在 windows 中 保护模式 有两种模式: 段保护 和 页保护

段保护 主要体现在 段选择子上;但是数据段、代码段、栈段等采用的都是4GB平坦模式,段的特征并没有那样展现。所以具体的保护机制 采用的是页保护。

PAE和 非PAE:

页保护 有两种:

  • 非 PAE

  • PAE

开启 PAE:

在 boot.ini 中 设置:为 noexcute -- 即不可执行 ;** DEP 的功能 -在这个时候 使用的是 PAE(因为早期的非PAE 并不支持数据执行保护);

10_PAE_非PAE

选择 为 execute -optin 后 这里的 数据执行保护 是灰色的 根本就不能设置。这时候 就是 非 PAE 模式下。相反 就是 PAE 模式下。

10_PAE_非PAE

图解 非 PAE:

10_PAE_非PAE

图解 PAE:

10_PAE_非PAE

注意: 内核地址中 专门有一块却与用来存放 pte表、pde 表的 非pae 是 4MB , pae 由于每项是8byte 所以变为 8MB;

这里 假设一个虚拟地址 0x403018 则:

10_PAE_非PAE

手动模拟 解析 PAE地址:

  1. 获取测试进程的cr3

    > !process 0 0 // 获取当前进程列表,找到测试进程的 dirbase = cr3

    10_PAE_非PAE

  2. 解析虚拟地址 0x403018

    > .formats 0x403018 // 查看二进制

    10_PAE_非PAE

    然后手动分解 pdpte pde pte offset :

    ---// 00 000000010 000000011 000000011000

    ---// 0 2 3 18

  3. 结合windbg 找对应的物理地址:

    1. 找 pdpte 中的项 pde 的地址

      cr3 + 8*0

    2. 找 pde 中的项 pte 的地址

      pde + 2*8

    3. 找 pte 中 页的地址

      pte + 3*8

    4. 页的 地址 + offset 即 是 目标物理地址

      p + 18

  4. 如图:

    10_PAE_非PAE

    10_PAE_非PAE

/i 进程调度的时候 切换 进程到指定进程:

g 运行起来 ** 调度;以至于到目标进程的时候停下来

10_PAE_非PAE

查看 当前进程 的 cr3

10_PAE_非PAE

使用 db 查看这时候进程空间 虚拟地址 数据

10_PAE_非PAE

使用 windbg 解析 虚拟地址对应的物理地址:

!vtop 有两个参数

第一个对应的是 cr3

第二个参数 是 对应进程的虚拟地址。

10_PAE_非PAE

使用 !pte 0xaddr 查看对应addr 中的页属性(前提:必须切换到当前进程,cr3也需要切换到,即 !process 0 0; .process /i xxxxx;g;)

通过下面这两个公式 解析出所在的 pde 、pte

10_PAE_非PAE

10_PAE_非PAE

修改pte 属性,关闭dep

10_PAE_非PAE


相关文章:

  • 2022-01-01
  • 2022-12-23
  • 2022-12-23
  • 2021-10-15
  • 2021-04-13
  • 2021-11-20
  • 2022-12-23
  • 2021-04-27
猜你喜欢
  • 2021-10-11
  • 2021-06-05
  • 2021-07-11
  • 2021-10-26
  • 2021-09-29
  • 2021-11-25
  • 2021-08-08
相关资源
相似解决方案