前言
目前根据逆向得知,有两种方式判断任意物理帧是否是CR3,其中有一种已经在 上一篇文章(CR3无法被MmMapioSpace映射原理和绕过代码)。
那接下来就来介绍第二种方法,不仅可以判断物理帧是否是CR3,而且还能通过解密来得到这个CR3的EPROCESS。
先来一下对比CR3这个物理帧和普通物理帧在PFN数据库里的区别:
对比:
一、任意取一个进程的CR3

二、选个GDTR的物理帧

函数:
ListEntry这个链表的第一项就不同了,具体修改点在函数:MiSetPageTablePfnBuddy()

初步得知:普通的物理帧链表第一项为0,而CR3这种有特殊意义的物理帧,第一项有值,放的就是加密后的EPROCESS。
画框的地方就是加密过程:将(EPROCESS << 0xD) & 0x0FFFFFFFFFFE0000,至于末尾的1并不是这里设置,了解即可。
过程(简化):
以下手动演示解密过程(简化):


因为这里是算术右移,所以最高位需要被符号位,所以是0xFFFFE70FD7955080
结尾:
因为是靠逆向,特别是windows10的内存有点复杂,如有错误,还望多多指教,希望能借此抛砖引玉!
第五届安全开发者峰会(SDC 2021)议题征集正式开启!