-
-
[原创]Windows内核逆向-----<页表自映射与MmIsAddressValidEx>
-
发表于:
2021-9-17 17:29
27957
-
[原创]Windows内核逆向-----<页表自映射与MmIsAddressValidEx>
分享一下自己对页表自映射的理解,并逆向MmIsAddressValidEx。
应该会用到的东西:Win10_x64 + Windbg + IDA + Xp源代码 + Intel手册
垃圾二本 开学大三 水平有限 还请各位前辈多多指点
MMU(Memory Management Unit)是CPU的一个组成部分,功能之一是参照页表将虚拟内存转换为物理内存,转换方式由 CRx 和 MSR 中的标置位进行控制, Win10_x64使用的转换方式为9-9-9-9-12 。
在NT内核中,物理地址(PFN)和虚拟地址(Vad)被分别管理,当在进程中分配一段内存空间时,OS需要在页表中添加新的表项以建立虚拟地址和物理地址间的映射关系,即OS需要访问页表,在开启分页模式后已无法直接访问物理地址,所以OS需要将进程的页表映射到虚拟地址空间中,从而进行访问,Windows使用了页表自映射来解决“需要将进程的页表映射到虚拟地址空间中”这个问题。
下图是X64下从虚拟地址到物理地址的转换过程,其中一共使用索引查表4次得到了正确的物理页的地址(图中4-KByte Page的物理地址),再加上页内偏移后即可访问到正常的位置(Physical Addr)。
![图片描述](upload/attach/202109/882390_MFD6DZN49A47QP5.png)
我们如何才能访问到一个PTE呢(也就是如何使用虚拟地址访问页表呢)?
现在我们假设CPU中的MMU单元在地址翻译时只对地址进行3次索引(使用索引查表3次),那么我们最后会得到图中PTE的物理地址(在正常情况下索引4次会得到图中4-KByte Page的物理地址)。即我们把正常的地址翻译过程减少一次查表过程就可以得到PTE得物理地址。
但是MMU是已经设计好的电路,我们不可能对其逻辑进行更改,但我们可以使用特殊手段来"欺骗"MMU使最后的效果和假设中的三次索引一样。
若将PML4表中的表项(PML4E)指向PML4表本身的物理地址,在使用此表项进行索引时本应获得PDPT表的地址,但由于此PML4E指向PML4表本身,所以获得的表依然是PML4表,在这种情况下第二次索引仍使用PML4表,第三次索引则会使用PDPT,第四次对PD表进行索引得到PT的地址并加上偏移,便得到了PTE得地址。
⚪总结上文所述:
我们可以看出在PML4表中有表项指向自身时,对某些特定的地址查表会"减少一次索引次数",因为其第一次索引得到的结果还是PML4表相当于第一次索没有进行反而直接使用PML4表查三次得到了PTE得物理地址。
以上便是我对页表自映射原理的理解,若有问题还请各位斧正
下图有助于对PTE_BASE进行理解:
页表自映射机制使得虚拟内存布局反映出了PTE_BASE,PDE_BASE,等特征
![图片描述](upload/attach/202109/882390_JEJC2WFTZXD8PTJ.png)
有一个未导出函数可以获取,用于映射参数中虚拟地址的所有表项的地址,其原理有助于对上图的理解,感兴趣的可以逆一下
![图片描述](upload/attach/202109/882390_MEFDUXW2486EKQV.png)
参考XP源代码注释 可以看出,此函数会根据所给虚拟地址判断对此内存的访问是否会发生页错误,实现方式就是检查和此虚拟地址相关的页表项。
Routine Description:
Arguments:
Return Value:
因为本文主要研究页表自映射所以省略无关细节,函数细节在IDA注释中给出
1.首先检查用户给出的地址是否合法(高位符号扩展)
![图片描述](upload/attach/202109/882390_J5SUEP9HBRYM24N.png)
2.核心部分,获得与地址相关的各个表项地址
![图片描述](upload/attach/202109/882390_D5DHCSTZDEH5MUF.png)
3.检查相关的各个表项,得出结果并返回
![图片描述](upload/attach/202109/882390_DUD8T63X852ZQ96.png)
一周一期争取不鸽 :)
下次打算写线程切换相关的
ASSERT(你已经了解
9
-
9
-
9
-
9
-
12
转换的细节)
ASSERT(你可以根据一个给定的虚拟地址参考页表将它转换为物理地址)
ASSERT(你已经了解
9
-
9
-
9
-
9
-
12
转换的细节)
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!
最后于 2021-9-17 21:16
被小白养的菜鸡编辑
,原因: