首页
社区
课程
招聘
[原创]不用CR0或MDL修改内核非分页写保护内存的一种思路(x64)
发表于: 2020-10-3 21:42 13317

[原创]不用CR0或MDL修改内核非分页写保护内存的一种思路(x64)

2020-10-3 21:42
13317
收藏
免费 13
支持
分享
最新回复 (38)
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
26
请教一下,MDL是将物理地址映射一份到虚拟空间吗?,还是把物理地址的可读虚拟地址,映射一份到另一个可写的虚拟空间?我的理解品偏向第二种
2020-10-21 22:48
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
27

最后于 2020-10-21 23:47 被hhkqqs编辑 ,原因:
2020-10-21 23:46
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
28
丿一叶知秋 请教一下,MDL是将物理地址映射一份到虚拟空间吗?,还是把物理地址的可读虚拟地址,映射一份到另一个可写的虚拟空间?我的理解品偏向第二种
大概是这个意思。MDL做的就是新建一份可写位为1的PTE,然后把要映射的虚拟地址对应的物理页帧号填进去使你能读写对应的物理页。
2020-10-21 23:46
0
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
29

谢谢大佬的解答,我对MDL是这么理解的, MmCreateMdl首先根据指针虚拟地址创建了一个MDL结构(没有物理帧),MmBuildMdlForNonPagedPool再根据MDL中描述的虚拟地址找到物理页去填物理帧,MmMapLockedPages函数,然后对这个物理帧构造PTE和PDT,并且构造好的虚拟地址返回给用户去操作

最后于 2020-10-22 11:36 被丿一叶知秋编辑 ,原因:
2020-10-22 11:35
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
30
丿一叶知秋 谢谢大佬的解答,我对MDL是这么理解的, MmCreateMdl首先根据指针虚拟地址创建了一个MDL结构(没有物理帧),MmBuildMdlForNonPagedPool再根据MDL ...
确实是这样,不过MDL最大的弱点就是如果你要映射连续的非分页内存,但这块区域存在至少一处缺页(分页或NOACCESS或PAGEGUARD或页面不存在)时MDL都会操作失败,有时甚至连自己的异常处理都无法拦截导致BugCheck,很多时候都要先MmIsAddressValid一下再用MDL,不如自己自行映射等真正需要用到的时候再MmIsAddressValid判断一下方便
2020-10-22 14:44
0
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
31
这是大佬的操作了!顺便问大佬一个问题,关于10-10-12分页0xC0000000,地址是物理地址还是虚拟地址,我有点被绕晕了。
Win2k中把页表映射到了从0xC0000000到0xC03FFFFF 的4MB地址空间中,我们来计算一下负责这4M地址空间的那个页表的地址,那个页表就是和页目录重合的页表。
4MB地址空间的首地址0xC0000000显然是由该页表的第一项负责的,我们用这个地址来计算。PTE_Address=(VirtualAddress>>12)*4+0xC0000000,此时0xC0000000是按物理地址算的呀
2020-10-22 16:00
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
32
丿一叶知秋 这是大佬的操作了!顺便问大佬一个问题,关于10-10-12分页0xC0000000,地址是物理地址还是虚拟地址,我有点被绕晕了。 Win2k中把页表映射到了从0xC0000000到0xC03FFFF ...
肯定是虚拟地址,这个是PTE的虚拟地址基址,系统启动的时候建立页表的物理地址基址理论上不会固定的
2020-10-22 16:11
0
雪    币: 919
活跃值: (1340)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
33
PTE_Address=(VirtualAddress>>12)*4+0xC0000000,
(0xC0000000 >> 12)* 4 + 0xC0000000 = 0xC0000 * 4 + 0xC0000000 = 0x300000 + 0xC0000000 = 0xC0300000
PDE_Address=(VirtualAddress>>22)*4+0xC0300000,计算得到0xC0300C00。也就是说0xC0300C00处的4个位元组作为PDE,指明了0xC0300000到0xC0300FFF这4KB所在的物理页的物理地址。我比较好奇,为什么这里是以0xC0000000开始的?算PTE的时候,不应该是CR3物理地址+(VirtualAddress>>12)*4
2020-10-22 16:28
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
34
丿一叶知秋 PTE_Address=(VirtualAddress>>12)*4+0xC0000000, (0xC0000000 >> 12)* 4 + 0xC0000000 = 0xC ...
虚拟地址只包含了PDE PTE的索引信息,但是PDE和PTE项所在的物理页可以不连续,是不可能直接用CR3算的,这个索引设计上就是用在连续的虚拟地址上而非物理地址
2020-10-22 16:47
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
35
丿一叶知秋 PTE_Address=(VirtualAddress>>12)*4+0xC0000000, (0xC0000000 >> 12)* 4 + 0xC0000000 = 0xC ...

别人文章涉及到地址的内容,几乎都是虚拟地址,不用管物理地址是多少,CR3放的是物理地址,但是通过MmPfnDataBase能查出对应的虚拟地址,反正你少纠结物理地址就是了

最后于 2020-10-22 17:13 被hhkqqs编辑 ,原因:
2020-10-22 17:11
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
36

我收藏起来了!以后慢慢研究!
佩服楼主! 在国内大环境这么恶劣的情况下,能达到接近国外大佬的水平。

最后于 2020-11-22 11:37 被低调putchar编辑 ,原因:
2020-11-22 11:30
0
雪    币: 12519
活跃值: (6024)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
37
低调putchar 我收藏起来了!以后慢慢研究!佩服楼主! 在国内大环境这么恶劣的情况下,能达到接近国外大佬的水平。
过奖了,我还只是个内核小白
2020-11-22 18:47
0
雪    币: 2674
活跃值: (2304)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
38
hhkqqs 过奖了,我还只是个内核小白[em_78]
你太谦虚了!我掌握的知识太少了!还够得向你学习!
2020-11-23 23:41
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
39
第一个自映射方法查找PTE好像在win10  21H1 不行了
2022-6-19 00:49
0
游客
登录 | 注册 方可回帖
返回
//