首页
社区
课程
招聘
[求助]如何禁用Copy-On-Write
2010-9-26 10:10 6772

[求助]如何禁用Copy-On-Write

2010-9-26 10:10
6772
如题,在网上很难找到资料,就像冰刃一样可以修改全局数据,我主要想用来做全局hook

[培训]内核驱动高级班,冲击BAT一流互联网大厂工 作,每周日13:00-18:00直播授课

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aait 2010-9-26 10:37
2
0
获得ring0特权,对CR0控制寄存器的第16位WP位置0,即可所有内存地址任意修改。
具体如何获得ring0自己实现,修改WP位2句代码就可,自己实现。
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
better 2 2010-9-26 11:40
3
0
楼上兄说的太大了,不过我还是找到了,Windows利用了PTE中的bit 9位用于Copy-On-Write
我先找到要全局hook地址的PTE,把bit 1位置1,使可写,在吧bit 9位清零,这样只要用普通的ring3 hook它就OK了,等一会儿我试试……
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
aait 2010-9-26 11:44
4
0
我还以为是cr0的wp位来进行copy-on write功能的。
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
better 2 2010-9-26 19:55
5
0
我在VMware中的PAE winXP SP2试验,发现ntdll的页面Copy-On-Write没有置位!!太奇怪了,但我确实观察到了Copy-On-Write,郁闷~~~,我用windbg观察的,不知哪位朋友感兴趣也来试试
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
wxxw 6 2010-9-26 22:25
6
0
二楼的方法应该可以的,LZ的方法,先更改pte属性,一样要进ring0才能改,你的想法前人已经实现了,参看帖子http://bbs.pediy.com/showthread.php?threadid=34158
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
better 2 2010-9-27 11:59
7
0
谢谢楼上:
WP:对于Intel 80486或以上的CPU,CR0的位16是写保护(Write Proctect)标志。当设置该标志时,处理器会禁止超级用户程序(例如特权级0的程序)向用户级只读页面执行写操作;当该位复位时则反之。这好像跟copy-on-write没什么关系,而且我不想在ring0下修改(hook)ntdll,我只是想去除copy-on-write(肯定要在ring0中),在ring3下修改(hook)ntdll。http://bbs.pediy.com/showthread.php?threadid=34158我看过了,也不符合我的要求,而且它是非PAE
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
better 2 2010-9-28 15:35
8
0
只怪我被调试器忽悠了,现在终于明白了原因了,那是因为默认所有DLL代码页、文件头等都是只读(PAGE_READONLY)的,根本不能修改。只要把它们改成可写的,相应PTE的CopyOnWrite(bit 9)就会显现出来,但write(bit 1)仍然为0,因为copy-on-write一定会引发异常 KiTrap0E->MmAccessFault->MiCopyOnWrite,所有这两位一定是配合使用的。我们以ntdll举例:
用OD任意加载/附加一个exe/进程,Alt+M 打开内存映射表
.txt代码节       (7c921000)
打开windbg->kernel debug
lkd> !process 0 0 Test.exe
PROCESS 87b99c88  SessionId: 0  Cid: 0f78    Peb: 7ffd5000  ParentCid: 058c
    DirBase: 0a7c0600  ObjectTable: e3b9f270  HandleCount:  12.
    Image: Test.exe
lkd> !vtop 0a7c0600 7c921000
X86VtoP: Virt 7c921000, pagedir a7c0600
X86VtoP: PAE PDPE a7c0608 - 000000000bdc5801
X86VtoP: PAE PDE bdc5f20 - 000000002d5e6867
X86VtoP: PAE PTE 2d5e6908 - 000000000e227025
X86VtoP: PAE Mapped phys e227000
Virtual address 7c921000 translates to physical address e227000.
!vtop可以把虚拟地址转换成物理地址,蓝色部分就是PTE!
再用OD把内存映射表中的7c921000一行改成read/write(右键单击,od的访问属性一栏不准的),再用windbg查看:
lkd> !vtop 0a7c06007c921000
X86VtoP: Virt 7c921000, pagedir a7c0600
X86VtoP: PAE PDPE a7c0608 - 000000000bdc5801
X86VtoP: PAE PDE bdc5f20 - 000000002d5e6867
X86VtoP: PAE PTE 2d5e6908 - 800000000e227225
X86VtoP: PAE Mapped phys e227000
Virtual address 7c921000 translates to physical address e227000.
哈哈,确实只有第九位发生变化吧(最高位置1,可能是不可执行的意思)。
这时,如果改动.text节的内容的话
lkd> !vtop 0a7c0600 7c921000
X86VtoP: Virt 7c921000, pagedir a7c0600
X86VtoP: PAE PDPE a7c0608 - 000000000bdc5801
X86VtoP: PAE PDE bdc5f20 - 000000002d5e6867
X86VtoP: PAE PTE 2d5e6908 - 0000000064e2e025
X86VtoP: PAE Mapped phys 64e2e000
Virtual address 7c921000 translates to physical address 64e2e000.
可以看到PTE发生了巨大变化,从新映射了一个新的物理页64e2e000
也可以试一下其它节,但是千万不要去试.data数据节,因为软件在运行过程中早就修改了data数据,也就是说早就引发了CopyOnWrite,所以.date已经不是原生dll映射的页了,这些页也没了写时复制特性,再改也没用。如果其它节也有这种情况,也肯定被改过了!
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
wxxw 6 2010-9-29 01:16
9
0
学习了,又查看了下资料,下面摘自
http://www.xfocus.net/articles/200510/830.html
“以下这段内容摘自<<Undocumented Windows NT>>
  The VirtualProtect() function does not mark the page as read-write–it keeps the page as
read-only. Nevertheless, to distinguish this page from normal read-only pages, it is marked for copy-on-write. Windows NT uses one of the available PTE bits for doing this. When this page is written onto, because it is a read-only page, the processor raises a page fault exception. The page fault handler makes a copy of the page and modifies the page table of the faulting process accordingly. The new copy is marked as read-write so that the process can write to it.”

不知自己理解是否有误?当置了copyonwrite位,如果页是只读的,在对它进行写操作时会触发异常,然后异常处理是拷贝一份这个页面,并将页面置为可读写的,以便可以对它进行写操作
从上面看,置了copyonwrite位,进行写操作后查看,确实是在一个拷贝的新的物理页上,但奇怪的是为什么这个页面还是只读的?是完成写操作后重新又置回只读吗?
雪    币: 331
活跃值: (57)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
better 2 2010-9-29 20:16
10
0
当然是只读的,要不然下次就不能copy-on-write了。对于新映射的页,OD会在修改完成后改回只读状态。
我专门写了两篇文章来解释copy-on-write机制:
http://blog.csdn.net/better0332/archive/2010/09/28/5912585.aspx
http://blog.csdn.net/better0332/archive/2010/09/29/5914971.aspx
游客
登录 | 注册 方可回帖
返回