首页
论坛
课程
招聘
[系统底层] [原创]win10 1909逆向(0E号异常---1.主动触发页面支撑的内存区)
2021-4-6 15:13 2478

[系统底层] [原创]win10 1909逆向(0E号异常---1.主动触发页面支撑的内存区)

2021-4-6 15:13
2478

0x0 前言

        

         这里是完成上一篇文章《win10 1909逆向(内存区对象(SectionObject)----1.页面支撑的内存区)》的实现部分,了解共享内存映射后,windows是如何通过0E号异常完成物理页的挂靠和管理,因为0E号异常过于庞大,和上一篇一样,将分支剪掉,将判断过程忽略掉,仅保留最核心的关键部分。


0x1 代码触发

首先在映射完成后下一个中断,这样进入Windbg里面,我们bp 到swapgs的下面的地址,因为是共享内存,PTE是没有值的,直接g运行。

0x2 逆向跟踪


进入 KiPageFaultShadow和KiPageFault,这里的主要目的是用来填充KTRAP_FRAME,然后进入MmAccessFault:


进入KiPageFault



中断进入过程中,0E号异常会有相应的错误码,我们这里的ErrorCode是为6,下面是错误码的解释。( 用户模式 | 写),在用户模式下的写操作引起的异常。

                            进入MmAccessFault:

                            1.创建一个结构体,并进行相应的初始化:

                            struct _FAULTCONTEXT

                            {

                            PVOID VirtualAddress;

                            UINT64 ErrorCode;

                            PKTRAP_FRAME pTrapFrame;

                            PVOID PointerPte;

                            PVOID PointerPde;

                            PVOID PointerPpe;

                            PVOID PointerPxe;

                            PVOID pProcessVm;

                            UINT32 U9Low;

                            char irql;

                            char u9flags;

                            PVOID U10;

                            char Flags;

                            PVOID Vad;

                            PVOID ProtoPTE;

                            PVOID U14;

                            PVOID U15;

                            PVOID U16;

                            PVOID U17;

                            };

这里如果是DPC等级进入换页,会有条件蓝屏。


如果VirtualAddress < 0xFFFF800000000000进入MiUserFault(pFaultContext)

1.判断PPE是否有效。

2判断PDE是否有效。

3.修改PDE的属性为:*PDE | 0x1000000000000020

4.MiZeroFault。主要实现:1.寻找虚拟地址的VAD。2.MiGetProtoPteAddress  得到原型PTE的地址。

5.返回0xC0000016。



进入MiDispatchFault:


     MiResolveProtoPteFault(FaultContext, __int64 a2, _QWORD *a3)  


1。将PTE的值改成 ffffffff00000490

这里就要简单介绍一下,基于VAD的PTE:

这里是由Windows实现的。当PTE值为空(_MMPTE.u.Long=0)时,必须检查虚拟地址描述符(VAD)进程,当设置_MMPTE.u.Soft.Prototype标志并且PTE.u.Proto.ProtoAddress等于0xFFFFFFFF0000时(在Windows中,该状态称为虚拟地址描述符);

2。MiCreateSharedZeroPages 主要是创建一个物理页,并且设置好属性,用来放进FirstPrototypePte里,但这时,PTE目前还是0xFFFFFFFF00000490



3。最后调用MiCompleteProtoPteFault进入属性值的判断和修改,并最终挂入PTE。


0x3 完成


         整体写的会非常简单,但实际内部的判断条件非常苛刻和复杂,会涉及很多工作集的处理,这里全部简化,只为大家了解最基本的流程,如果有兴趣,各位可以自行逆向,接下来会逆向最为复杂的文件映射。


        



[公告] 2021 KCTF 春季赛 防守方征题火热进行中!

收藏
点赞2
打赏
分享
最新回复 (7)
雪    币: 856
活跃值: 活跃值 (1180)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
丿一叶知秋 活跃值 2021-4-6 15:30
2
0
其实去检查VAD是为了去获取保护位或者理想的NUMA了等等,VAD的存在感觉就是与用户编程的一个接口,比如,我分配内存函数申请了一块带属性的内存,但是此时PTE并没有初始化,而当在0E里里面初始化的时候,就会去查 VAD。
工作集的话,更像是页的交替中转站,从某种程度上,有点性能优化的味道。

我的一些看法!  顺便说一句豆总牛逼。
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2021-4-6 15:53
3
0
丿一叶知秋 其实去检查VAD是为了去获取保护位或者理想的NUMA了等等,VAD的存在感觉就是与用户编程的一个接口,比如,我分配内存函数申请了一块带属性的内存,但是此时PTE并没有初始化,而当在0E里里面初始化的时 ...
能不能把顺便说一句后面的取消掉
雪    币: 158
活跃值: 活跃值 (565)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengyunabc 活跃值 1 2021-4-6 16:09
4
0
感谢分享! 豆总牛逼!
雪    币: 1377
活跃值: 活跃值 (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 活跃值 2021-4-6 16:35
5
1
第一次访问映射pagingfile的内存,0e其实要处理两个缺页,一个是虚拟地址本身的缺页,一个是原型PTE的缺页,Vad.FirstPrototypePte刚设置时也是缺页的,要额外调用一次MiDispatchFault去换入。

而第一次访问普通的private内存只需要处理虚拟地址本身的缺页,没有原型PTE。这是和访问映射pagingfile的内存最大的区别

另外原型PTE本身就处于PagedPool,第一次换入后仍然可能被换出,到时同样要用MiDispatchFault换入。而硬件PTE如果发现原型PTE.Valid=1,就直接将原型PTE的内容拷贝到自身,不需要去磁盘读了。
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2021-4-6 16:48
6
1
dearfuture 第一次访问映射pagingfile的内存,0e其实要处理两个缺页,一个是虚拟地址本身的缺页,一个是原型PTE的缺页,Vad.FirstPrototypePte刚设置时也是缺页的,要额外调用一次MiDi ...

行家啊,我第一次逆向原型PTE的时候绕了很久。

最后于 2021-4-6 16:49 被学技术打豆豆编辑 ,原因:
雪    币: 1377
活跃值: 活跃值 (405)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
dearfuture 活跃值 2021-4-6 17:02
7
0
学技术打豆豆 dearfuture 第一次访问映射pagingfile的内存,0e其实要处理两个缺页,一个是虚拟地址本身的缺页,一个是原型PTE的缺页,Vad. ...
豆总才是行家,向你学了很多(我是宫代
雪    币: 2791
活跃值: 活跃值 (2780)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
学技术打豆豆 活跃值 1 2021-4-6 20:00
8
0
dearfuture 豆总才是行家,向你学了很多[em_78](我是宫代
搞了半天是你啊
游客
登录 | 注册 方可回帖
返回