Re: 关于KiTrap03中的eip - 1

Windows内核调试

关于KiTrap03中的eip - 1


wrong 2011-08-16, 15:13 下午

本来以为理解了这个问题,想多后却胡涂了。我的系统是Win7 SP1

KiTrap03中的dec ebx,并没有直接修改TrapFrame,修改的是传递给CommonDispatchException的参数,这样,在KiDispatchException中看到的2个参数(ExceptionRecord和TrapFrame对于int 3来说,EIP的值是不一样的,差了一个1),

而到了KiDispatchException中,有了dec     [edi+_CONTEXT._Eip]语句,修改的是Context,对trapframe也没有影响,

在发送给调试器的时候,只传递了ExceptionRecord,没有TrapFrame或是Context,如果调试器有回复,就直接退出了,并没有调用KeContextToFrame(看了代码,好象用户态下的都没有调用,kernel下的调用了),那么使用iret中断返回后是怎么到正确的指令地址上的?难道是用户态的调试器做的手脚?

Re: 关于KiTrap03中的eip - 1


zyq8709 2011-08-19, 16:21 下午
不好意思,之前没弄明白就发帖,见笑了。
我又查了查书,看了一下ReactOS,确实是用户调试器时内核不管eip的修正。我在罗云彬的windows环境下32位汇编语言程序设计的13.3.3节的第3部分发现了答案,他的程序在模拟调试器时首先用GetThreadContext获得了TrapFrame的内容,然后并将其中的eip减一,用SetThreadContext写回了TrapFrame,在用户状态进行了修正,楼主的想法应该是正确的。
但是我在张老师的软件调试书中图 11-3中发现用户模式的调试也被最终用KeContextException将eip修正了,这可能是XP系统之后的新变化吧。

Powered by Community Server Powered by CnForums.Net