28-PAE分页下的PDT-PTT基址

实际上,一路走来你也知道,在保护模式下你想通过写代码访问到物理地址简直天方夜谭。在 CPU 的世界里,无论是 PDT 还是 PTT 都保存在物理页中,PDT 和 PTT 中保存的也全部是物理地址不是线性地址。你要想访问到 PDT,除非你知道这个PDT所在的线性地址,这就是先有鸡还是先有蛋的问题了。

倘若你搞懂了 10-10-12 分页模式下的 PDT-PTT 基址的话,想必本篇你也不在话下。有关 PDT-PTT 基址的原理和由来,请你参考《PDT/PTT基址》《PDT/PTT基址(实验)》这两篇文章。

PDE 和 PTE 地址计算公式

为了先入为主,这里直接给出访问一个线性地址的 PDE 和 PTT 的计算公式。PAE分页,把线性地址分成了四段,即PDPTI-PDI-PTI-OFFSET. 如果要找出这个线性地址对应的 PDE 和 PTE 的位置,可以使用下面的计算公式。

  • 公式一
// pPDE 和 pPTE 存放的是指向 PDE 和 PTE 的指针。
pPDE = (int*)(0xc0600000 + (PDPTI<<12) + (PDI<<3)); 
pPTE = (int*)(0xc0000000 + (PDPTI<<21) + (PDI<<12) + (PTI<<3)); 

不过,我们可以采用更简洁的方式来计算PDE和PTE的位置,这种方式不需要事先计算 PDPTI、PDI 和 PTI。

  • 公式二
// addr 存放的是线性地址
pPDE = (int*)(0xc0600000 + ((addr >> 18) & 0x3ff8));
pPTE = (int*)(0xc0000000 + ((addr >> 9) & 0x7ffff8));

知道了 PDE 和 PTE,我们自然就可以随心所欲的修改物理页属性,从而获得一些权限来访问用户模式下不可访问的地址,甚至可以自己挂载物理页了。

分析实例

这里,采用地址 0x50401020为例,分别用前面两种不同的公式进行计算该线性地址的 PDE 和 PTE 的线性地址。

  • 使用公式一

0x50401020 拆分成四段式是 ‭01-01 0000 010-0 0000 0001-‬020,即1-82-1-020

故有 PDPTI = 0x1, PDI= 0x82, PTI = 0x1, OFFSET = 0x020. (注意这些数字都是16进制)。

根据公式一可以得到:

pPDE = 0xc0600000 + (PDPTI<<12) + (PDI<<3) = 0xc0600000+0x1000+0x410 = c0601410
pPTE = 0xc0000000 + (PDPTI<<21) + (PDI<<12) + (PTI<<3) = 0xc0000000+0x200000+0x82000+0x8 = 0xc0282008
  • 使用公式二
pPDE = c0600000 + ((addr >> 18) & 0x3ff8) = c0600000 + ((0x50401020>>18) & 0x3ff8) = 0xc0601410
pPTE = 0xc0000000 + ((addr >> 9) & 0x7ffff8) = 0xc0000000 + ((0x50401020>> 9) & 0x7ffff8) = 0xc0282008

可以发现,使用公式二比使用公式一计算量要小很多。在实际使用中,也会经常使用公式二。

总结

本篇结束后,你可能要提一个小小的疑问,为什么使用 0xc06000000xc0000000 这样的基址。这一点,其实是和操作系统有关的。这个地址,实际是通过分析 Windows Xp 内核的一个名为 MmIsAddressValid 的内核函数得到的。如果你的汇编掌握熟练的话,可以自己在 WinDbg 中使用下面的命令查看它的反汇编代码,并作分析。记住这并不作要求,你需要的仅仅是记住上面的计算公式。

kd> u MmIsAddressValid L50


这里写图片描述
图1 MmIsAddressValid 函数的反汇编代码

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值