能力值:
( LV2,RANK:10 )
2 楼
获得ring0特权,对CR0控制寄存器的第16位WP位置0,即可所有内存地址任意修改。
具体如何获得ring0自己实现,修改WP位2句代码就可,自己实现。
能力值:
( LV7,RANK:100 )
3 楼
楼上兄说的太大了,不过我还是找到了,Windows利用了PTE中的bit 9位用于Copy-On-Write
我先找到要全局hook地址的PTE,把bit 1位置1,使可写,在吧bit 9位清零,这样只要用普通的ring3 hook它就OK了,等一会儿我试试……
能力值:
( LV2,RANK:10 )
4 楼
我还以为是cr0的wp位来进行copy-on write功能的。
能力值:
( LV7,RANK:100 )
5 楼
我在VMware中的PAE winXP SP2试验,发现ntdll的页面Copy-On-Write没有置位!!太奇怪了,但我确实观察到了Copy-On-Write,郁闷~~~,我用windbg观察的,不知哪位朋友感兴趣也来试试
能力值:
( LV9,RANK:310 )
6 楼
二楼的方法应该可以的,LZ的方法,先更改pte属性,一样要进ring0才能改,你的想法前人已经实现了,参看帖子http://bbs.pediy.com/showthread.php?threadid=34158
能力值:
( LV7,RANK:100 )
7 楼
谢谢楼上:
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
能力值:
( LV7,RANK:100 )
8 楼
只怪我被调试器忽悠了,现在终于明白了原因了,那是因为默认所有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 0a7c0600 7c921000
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映射的页了,这些页也没了写时复制特性,再改也没用。如果其它节也有这种情况,也肯定被改过了!
能力值:
( LV9,RANK:310 )
9 楼
学习了,又查看了下资料,下面摘自
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位,进行写操作后查看,确实是在一个拷贝的新的物理页上,但奇怪的是为什么这个页面还是只读的?是完成写操作后重新又置回只读吗?
能力值:
( LV7,RANK:100 )
10 楼