|
|
|
|
|
|
|
Windows内核调试
帖子发起人: 井底之蛙 发起时间: 2008-12-08 11:46 上午 回复: 2
|
帖子排序:
|
|
|
|
2008-12-08, 11:46 上午
|
井底之蛙
注册: 2008-12-03
发 贴: 15
|
|
|
WinDBG好像有这样一个bug:
找个IDT中的中断处理程序,在入口处下个断点,触发异常,WinDBG就断下来了,根据中断门的原理,这时只有CS,EIP,TF,IF,SS,ESP会发生变化,其它的寄存器应该不变。但WinDBG自做主张把FS寄存器改成了30h,看看除0异常:
nt!KiTrap00:
8053f19c 6a00 push 0
8053f19e 66c74424020000 mov word ptr [esp+2],0
8053f1a5 55 push ebp
8053f1a6 53 push ebx
8053f1a7 56 push esi
8053f1a8 57 push edi
8053f1a9 0fa0 push fs
8053f1ab bb30000000 mov ebx,30h
8053f1b0 668ee3 mov fs,bx
8053f1b3 648b1d00000000 mov ebx,dword ptr fs:[0]
8053f1ba 53 push ebx
因该是操作系统把fs置成30h的!
更要命的是我们还没法手工改变FS(改回去又被改回来),这样如果在iret的时候FS还是30h,那么iret之后返回到ring3,FS将被CPU置0(因为30h这个选择子是ring0的),导致后面的函数执行出错(没法注册异常了),而且程序被无声无息的终止!!我在VMWare上测试的,大家看看有没有这个BUG……
调试 rootkit ring3进ring0之门系列[二] -- 中断门 就可以说明这个问题
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-08, 12:40 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
不认为WinDBG会做这样的改动,你可以用另一个WinDBG做跟踪或者Ctrl+Alt+D观察WinDBG和KD之间的通信来确认。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2008-12-08, 14:37 下午
|
井底之蛙
注册: 2008-12-03
发 贴: 15
|
|
|
bp ntKiTrap00
中断后看到fs=30,肯定有问题……
而且fs寄存器改不掉
请看:http://www.debugman.com/read.php?tid=2477
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » WinDBG的bug
|
|
|
|
|
|