首页
社区
课程
招聘
[原创]详解Windows写时复制机制
发表于: 2021-3-29 16:14 16183

[原创]详解Windows写时复制机制

2021-3-29 16:14
16183

        看雪上关于写时拷贝的文章,又是各种MDL又是各种函数调用?觉得讲得挺复杂的。明明挺简单的一个事搞得那么复杂,所以才想写这么一篇文章


        废话不多说,直接进入主题。

        当一个应用层程序试图往一个内存页面写入数据时,CPU操作系统会走如下流程:

        第0步:检查PTE被写入内存页的PTE属性,如果页面的PTE属性的U/S位为0,触发页保护异常,写入失败返回0XC00000005错误码;否则进入下一步.

        第1步:检查PTE的Write/Read位,如果为1表示检查通过则直接写入数据到内存,写入成功!如果为0,表示此PTE描述的内存页面为只读页,继续检查PTE的第9位,如果此位为0,触发页保护异常;

        第2步:进入页保护异常后就完全将控制权交给操作系统,操作系统会先检查被写入页面的进程VAD属性,如果为不存在写拷贝属性,写入失败,返回0xc00000005错误码;如果存在写拷贝属性,进入下一步;

        第3步:如果存在写拷贝属性,操作系统会在将被写入页面的PTE的第9位置1,将CPU的EIP设置为之前程序往内存写入数据的那条指令的地址,进入下一步;

        第4步:继续执行写入数据到内存的那条指令,注意此时PTE属性的write/Read仍然为0,仍然会再次触发页保护异常,返回第0步,接着走第2步,此时操作系统会发现PTE的第9位被置1了,如果PTE属性的第9位为1,则分配一个新的物理内存页面,将原来的数据复制到新的内存页面,修改PTE并且将PTE的write/Read位置1,页保护异常返回到程序之前写入数据到内存的那条指令,再次执行这条指令因为PTE的Write/Read位为1,会直接写入成功!

        

可以做以下实验来验证以上流程:

修改PTE属性


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 12
支持
分享
最新回复 (7)
雪    币: 2428
活跃值: (2597)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

总结的不错,补充一下我自己的理解

PTE的第9位是对intel来说是保留位,硬件上不对它做任何处理,不过windows把它当成WriteCopy位,而在硬件上触发写拷贝的是R/W位。也就是只要写某个PTE.R/W=0的地址就会触发页异常,而对PTE.WriteCopy的使用是在页异常处理程序做的


当写某个地址,这个地址对应的PTE.R/W=0且PTE.WriteCopy=0且VAD有写拷贝属性时,页异常处理程序会把PTE.WriteCopy置1。当PTE.R/W=0且PTE.WriteCopy=1时,页异常处理程序会申请一个新的物理页保存修改之后的内容,并把PTE.Pfn指向新的物理页

mdl/mapiospace之类的方法能突破写拷贝的原因是他用了另一个虚拟地址去映射物理地址,且这个虚拟地址对应的PTE.R/W=1,所以不会触发页异常处理程序,也就不会发生写拷贝了。当然直接将PTE.R/W置1或者将cr0.WP置0的方法也可以绕过(cr0.WP置0会导致当前核心的写保护全部失效)

最后于 2021-3-29 17:05 被dearfuture编辑 ,原因:
2021-3-29 16:49
3
雪    币: 14633
活跃值: (17729)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2021-3-31 14:49
0
雪    币: 7457
活跃值: (4186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习到了。
2021-4-2 09:18
0
雪    币: 5314
活跃值: (4798)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2021-4-30 18:05
0
雪    币: 239
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
比书上讲的详细,感谢分享!
2021-5-24 11:56
0
雪    币: 876
活跃值: (594)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
good
2021-10-31 23:25
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
dearfuture 总结的不错,补充一下我自己的理解PTE的第9位是对intel来说是保留位,硬件上不对它做任何处理,不过windows把它当成WriteCopy位,而在硬件上触发写拷贝的是R/W位。也就是只要写某个PT ...
老哥总结的很棒
2024-10-17 00:13
0
游客
登录 | 注册 方可回帖
返回
//