首页
社区
课程
招聘
[原创][分享]逆向win10 1909的MmIsAddressValidEx分析 999912分页
发表于: 2020-9-27 16:58 7116

[原创][分享]逆向win10 1909的MmIsAddressValidEx分析 999912分页

2020-9-27 16:58
7116

通过逆向win10 1909的MmIsAddressValidEx函数,对windows内存分页管理的理解上有很大帮助。通过win7和xp下对比 win10 1909下此函数对自映射的体现非常明显。废话不对说,直接开始:

这个函数是通过判断物理页的P为是否为1来判断是否存在物理页,从而判断虚拟地址是否有效。

图片描述

就从自映射的资料,供参考:
图片描述
图片描述
图片描述

MmIsAddressValid函数原型如下:

图片描述
可以从上图看出 MmIsAddressValid调用了MmIsAddressValidEx,通过x64和上图可以看出调用约定是fastcall,那么我们得参数VirtualAddress在rcx中。MmIsAddressValid函数并没有做什么事,那我们开始分析MmIsAddressValidEx。
图片描述
接下来我截图一块块分析
图片描述
从我红框处可以看出 rax就是我们传入的参数VirtualAddress,右移0x2F(47位)+1 这里在验证我们传入的地址是否有效,但是我们知道x64地址是否有效是判断前面16位是否是FFFF或者0000,那么按理来说应该右移48位,为何只右移了47位?
这里我不得不提windows的三环和0环地址,X64 地址空间分开成2部分
用户模式地址的范围:0x0000000000000000~0x00007FFFFFFFFFFF;
内核模式地址的范围:0xFFFF800000000000~0xFFFFFFFFFFFFFFFF。
从上面可以看出 算数右移47位 如果地址是有效的那么我们得到的结果一定是内核:0xFFFFFFFFFFFFFFFF,用户:0,所以+1之后要么就是0要么就是1,如果大于1 地址一定无效,比如0xffff700000000000,这个地址既不在内核地址范围,也不在用户地址范围,右移47位的结果是0xFFFFFFFFFFFFFFFE,如果这个值+1等于0xFFFFFFFFFFFFFFFF,ja是无符号大于跳转,所以就跳转直接返回了。

过滤完上述情况后
图片描述
这里我们可以看到rdi这个值就是PTEBASE,(在x64上这个PTEBASE的值每次重启都会随机生成),通过从PTEBASE来寻找到对应得物理页的PTE,shr rdx,9这句意思是相当于得到虚拟地址的PTE索引再8,也就是先右移12位然后8。
接下来我们就看到自映射的原理了
图片描述
这段代码似曾相识,其实是通过pte映射的虚拟地址,得到PTE的物理页,也就是PDE。然后接下来我们看到的其实也是相似的。
图片描述
通过PDE映射的虚拟地址得到PPE
图片描述
通过PPE映射的虚拟地址得到PML4也有人成为PXE
图片描述
接下来通过这段来循环判断是否是大页,物理页的P为是否为1。

因个人表达能力有限,敬请谅解

NTKERNELAPI
BOOLEAN
MmIsAddressValid (
    _In_ PVOID VirtualAddress
    );

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-9-27 23:28 被墨瑾萱编辑 ,原因: 内容补充
收藏
免费 4
支持
分享
最新回复 (5)
雪    币: 62
活跃值: (662)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
向大佬看齐
2020-9-27 17:11
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
3
看雪出现bug了 每次回复6666 都token error
2020-9-28 04:12
0
雪    币: 5
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
6666
2020-10-14 16:42
0
雪    币: 743
活跃值: (226)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
token error
2020-10-14 16:45
0
雪    币: 66
活跃值: (2746)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
B哥,我爱你哟
2020-10-26 09:59
0
游客
登录 | 注册 方可回帖
返回
//