首页
论坛
专栏
课程

[系统底层] windbg的中断处理

2017-1-16 13:17 3264

[系统底层] windbg的中断处理

2017-1-16 13:17
3264
系统:win7 x64

debug模式下 windbg扮演内核调试器的角色 按下ctrl+break会将系统中断到调试器

中断的具体过程就不赘述了 最终是调用了int 3进行异常分发

异常流程:

KiBreakPointTrap->KiExceptionDispatch->KiDispatchException

VOID
KiDispatchException (
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN PKEXCEPTION_FRAME ExceptionFrame,
    IN PKTRAP_FRAME TrapFrame,
    IN KPROCESSOR_MODE PreviousMode,
    IN BOOLEAN FirstChance
    );

KiDispatchException:
1、mov r15b,r9b 将PreviousMode保存到r15寄存器中 1个字节
2、判断PreviousMode 是UserMode就跳下去 这里不讨论
3、RtlGetExtendedContextLength
4、RtlInitializeExtendedContext
5、KeContextFromKframes
6、判断ExceptionRecord.ExceptionCode 是80000003h则CONTEXT.eip--
7、判断是否触发#GP异常
8、判断r15寄存器的值是否为0
->r15b!=0 跳下去 这里不讨论
->r15b==0 判断是否为FirstChance

(1)不是FirstChance
->CHAR al = KdpTrap(rcx,rdx,r8,r9,0,1);
->al为FALSE KeBugCheckEx(0x1E...)
->al为TRUE KeContextToKframes 然后return
(2)FirstChance
->CHAR al = KdpTrap(rcx,rdx,r8,r9,0,0);al为TRUE KeContextToKframes 然后return
->al为FALSE al = RtlDispatchException();al为TRUE KeContextToKframes 然后return
->al仍为FALSE al = KdpTrap(rcx,rdx,r8,r9,0,1);al为TRUE KeContextToKframes 然后return
->al仍为FALSE KeBugCheckEx(0x1E...)

除去SEH 关键在于KdpTrap 原型:

typedef
BOOLEAN
(*PKDEBUG_ROUTINE) (
    IN PKTRAP_FRAME TrapFrame,
    IN PKEXCEPTION_FRAME ExceptionFrame,
    IN PEXCEPTION_RECORD ExceptionRecord,
    IN PCONTEXT ContextRecord,
    IN KPROCESSOR_MODE PreviousMode,
    IN BOOLEAN SecondChance
    );

KdpTrap:
1、判断ExceptionRecord.ExceptionCode
->不是80000003h KdpReport
->是80000003h 判断ExceptionRecord.ExceptionInformation是否为0->为0则KdpReport
->ExceptionRecord.ExceptionInformation为0则是正常的中断异常
->KdpReport(TrapFrame,ExceptionFrame,ExceptionRecord,ContextRecord,PreviousMode,SecondChance);

KdpReport:
1、判断ExceptionRecord.ExceptionCode
->不是80000003h 不讨论
->是80000003h 判断SecondChance

->为SecondChance 接管
->不为SecondChance return FALSE

那么问题来了 经过上述分析 我之前一直认为
KiDispatchException以SecondChance调用了KdpTrap才处理了异常

结果抱着作死的心态bp下断以SecondChance调用KdpTrap的地方
居然是无法断下的 而以SecondChance=FALSE调用KdpTrap的地方却可以造成下断死机(死循环)

以SecondChance=FLASE调用KdpTrap:
nt!KiDispatchException+0x10a:
fffff800`03ebd386 44887c2428      mov     byte ptr [rsp+28h],r15b
fffff800`03ebd38b 44887c2420      mov     byte ptr [rsp+20h],r15b
fffff800`03ebd390 4d8bcc          mov     r9,r12
fffff800`03ebd393 4c8bc3          mov     r8,rbx
fffff800`03ebd396 498bd6          mov     rdx,r14
fffff800`03ebd399 488bce          mov     rcx,rsi
fffff800`03ebd39c ff1556401f00    call    qword ptr [nt!KiDebugRoutine (fffff800`040b13f8)]
fffff800`03ebd3a2 84c0            test    al,al

在fffff800`03ebd39c下断虚拟机卡死
在fffff800`03ebd3a2下断发现al为TRUE r15为0 居然这样处理了异常

以SecondChance=TRUE调用KdpTrap:
kd> u fffff800`03ecd596
nt! ?? ::FNODOBFM::`string'+0x4983b:
fffff800`03ecd596 c644242801      mov     byte ptr [rsp+28h],1
fffff800`03ecd59b c644242000      mov     byte ptr [rsp+20h],0
fffff800`03ecd5a0 4d8bcc          mov     r9,r12
fffff800`03ecd5a3 4c8bc3          mov     r8,rbx
fffff800`03ecd5a6 498bd6          mov     rdx,r14
fffff800`03ecd5a9 488bce          mov     rcx,rsi
fffff800`03ecd5ac ff15463e1e00    call    qword ptr [nt!KiDebugRoutine (fffff800`040b13f8)]
fffff800`03ecd5b2 84c0            test    al,al

将fffff800`03ecd596+0x4改为0 无效
bp fffff800`03ecd596->g->ctrl+break 无效

明明以SecondChance=FALSE调用KdpTrap会直接返回FALSE 下断却返回TRUE
明明以SecondChance=TRUE调用KdpTrap才会被接管 居然无法卡死虚拟机

求解这是为什么 windbg中断所触发的int 3到底是怎么处理的
或者说上述很多步骤哪里分析出错了 请各位指点一二:

[公告]安全测试和项目外包请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最新回复 (3)
空白即是正义 2017-1-16 15:07
2
0
求助各位吖 走过路过可以指点一下
空白即是正义 2017-1-16 18:29
4
0
这么久了居然只有一个广告
空白即是正义 2017-1-17 19:12
5
0
解决了 神奇的signed
游客
登录 | 注册 方可回帖
返回