Re: KiTrap03的逻辑
Windows内核调试
KiTrap03的逻辑
wrong
2011-03-10, 16:54 下午
软件调试第4章中,介绍KiTrap03对于x86的int 3指令会做特殊的处理,会将IP值减1,在第18章中讲调试服务的时候,说int 2d会跳转到KiTrap03,并列举了DebugService2的代码。
...
cd2d int 2d
cc int 3
...
没明白后面为什么要加一条int 3,按照第4章中的逻辑,eip会指在int 2d指令的中间啊。和后面加不加int 3有什么关系。
Re: KiTrap03的逻辑
格蠹老雷
2011-03-11, 10:08 上午
读的很仔细,思考的也很深入
再前进一点点就想通了啊:-)
对的,执行INT 2D后,IP会指向下一条指令,如果这时进入INT 3的逻辑就会出现你说的eip指向cd2d这个指令的中间部分。下面的INT 3指令正是为了避免这个问题而故意放在那的,有了这条指令后,KiDebugService中会把IP先加一:
inc dword ptr [ebp+68h]
让IP指向这个看似无用的INT 3指令的后面,伪造出于与断点异常一样的现场,然后再复用INT 3的逻辑
这样做了之后,KiTrap03中再减一就指向INT 3指令了,而后交给调试引擎(调试器),后者处理好这个服务后,会递增EIP,跳过INT 3指令,然后再异常返回...
非常的精妙...
Re: KiTrap03的逻辑
wrong
2011-03-22, 17:02 下午
我晕了,看得越多越胡涂,仔细想了想,我的理解是这样,如果这个int 3是在调试器中设置的,调试器收到异常并且恢复执行后,会将这个int 3恢复成原来的指令并且从这个指令处开始执行。
如果这个int 3本身是程序里面的,调试器捕捉到后直接恢复执行就会直接跳过这条指令。不知道这样的理解对不对?这些动作是调试器完成的嘛?
但是,如果调试器不存在,int 2d重用KiTrap03进入了异常分发KiDispatchException,并且没有异常处理,程序不会Crash嘛?
Re: KiTrap03的逻辑
格蠹老雷
2011-03-22, 21:14 下午
这个INT 3是写在源代码里的,不是调试器设置的
内核函数会保证这个动作的,建议看一下有关内核函数的汇编代码
Re: KiTrap03的逻辑
wrong
2011-03-24, 11:02 上午
张老师,代码看了,比较复杂。
当int 3指令出现在代码中,CPU执行这条指令后,会跳转到KiTrap03,然后进入异常分发,异常处理后会中断返回。int 2d重用KiTrap03是否是重用的异常分发之后的步骤?
Re: KiTrap03的逻辑
格蠹老雷
2011-03-24, 12:55 下午
当然是重用KiDispatchException之前的代码啊,KiTrap2d在做些预处理后便跳转到KiTrap03中了,之后由KiDispatchException统一分发...
这样的异常不会分发给用户代码,当有调试器时会分发给调试器,没有调试器的时候,会分发给KdpStub,KdpStub中会调整Eip...
Re: KiTrap03的逻辑
wrong
2011-03-24, 17:41 下午
现在有点明白了,原来一直担心跳到KiTrap03后,异常分发,如果没有调试器,因为是内核中未处理的异常,系统会蓝屏。