首页
社区
课程
招聘
[原创]win10 1909逆向(0E号异常---1.主动触发页面支撑的内存区)
发表于: 2021-4-6 15:13 9986

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

2021-4-6 15:13
9986

        

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


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


进入 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;


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

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

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

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

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

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

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