Re: 请问大家一个关于int 2d的问题

Windows内核调试

请问大家一个关于int 2d的问题


秋雨落 2008-11-09, 20:57 下午
我在看雪论坛上看到,说用户态调用int 2dh,如果没有调试器就会返回异常,如果有调试器,那就不会返回异常。这个是什么个流程呢?
我在DBGPrint过程中也看到了一直调用到int 2dh,后面就是KiDebugService,然后CommonDispatchException,然后再到KiDispatchException,再到KdpStub或者KdpTrap,可是我怎么也没发现什么时候判断调试器的。

Re: 请问大家一个关于int 2d的问题


格蠹老雷 2008-11-09, 23:41 下午

这里要区分CPU级的异常,还是软件层次的异常。CPU执行INT 2D时总是会产生异常(TRAP)。操作系统也总会收到和分发这个异常。按照异常分配的原则,有人处理了就不会继续分发,所以如果是内核调试例程声明处理了这个异常,那么用户态的代码就不会收到[软件]异常了。

有否调试器的差异就是调用KdpStub(没有调试器)还是KdpTrap(有调试器),分发异常时不需要做判断,因为调试器函数已经把函数指针(KiDebugRoutine)的指向设置好了。

Re: 请问大家一个关于int 2d的问题


秋雨落 2008-11-10, 00:01 上午
就是说用户态调试器如vc调试器或ollydbg也是KdpTrap?

Re: 请问大家一个关于int 2d的问题


秋雨落 2008-11-10, 03:27 上午
我查到的reactos中用户态异常处理的代码:
if (FirstChance)
{
/* Make sure a debugger is present, and ignore user-mode if requested */
if ((KiDebugRoutine) &&
(!(PsGetCurrentProcess()->DebugPort)))
{
/* Call the debugger */
if (KiDebugRoutine(TrapFrame,
ExceptionFrame,
ExceptionRecord,
&Context,
PreviousMode,
FALSE))
{
/* Exception was handled */
goto Handled;
}
}

/* Forward exception to user mode debugger */
if (DbgkForwardException(ExceptionRecord, TRUE, FALSE)) goto Exit;

这儿先是判断 if ((KiDebugRoutine) &&
(!(PsGetCurrentProcess()->DebugPort)))
就是说DebugPort不为零的话,那么调用KiDebugRoutine,
否则就直接DbgkForwardException发往调试器。

Re: 请问大家一个关于int 2d的问题


格蠹老雷 2008-11-10, 08:47 上午

 qiuyuluo wrote:
就是说DebugPort不为零的话,那么调用KiDebugRoutine,否则就直接DbgkForwardException发往调试器。

应该为“就是说DebugPort为零的话.......”为零代表没有用户态调试器。

 

Re: 请问大家一个关于int 2d的问题


格蠹老雷 2008-11-10, 08:52 上午

 qiuyuluo wrote:
就是说用户态调试器如vc调试器或ollydbg也是KdpTrap?

KdpTrap是内核调试引擎(KD)的接口函数,是用来做内核态调试的,它与用户态的调试器没有必然关系。用户态调试器是不需要关心下面是不是启用了内核调试的。

如果你有《软件调试》,那么先看一下第3篇的篇扉,然后仔细读一下第9、10章(用户态调试)和第18章(内核态调试)。它们是两套"系统"。

Powered by Community Server Powered by CnForums.Net