-
-
[原创]windows 调试与异常的简单梳理
-
发表于: 2021-3-1 23:34 4642
-
int 3 ->中断表 IDT[3] -> _KiTrap03如果是Ring3异常,开启IF-> CommonDispatchException 构建陷阱帧 Trap_Frame,调用函数KiDispatchException ->
- KiDispatchException
如果是int3就eip-1(int3陷阱类异常发生时,eip 指向下一条,实际产生异常的位置在 eip - 1),如果是分页异常并且是执行异常就将ExceptionInfomation[0]设置为 0。
内核Ring0异常处理过程:
如果异常产生于内核模式下,先判断内核调试器是否存在,当KiDebugRoutine指针不为NULL(存在内核wndbg调试器)存在则交给内核调试器进行第一次处理,如果处理失败,则(RtlDispatchException)将异常传递给内核中的结构化异常SEH处理程序进行处理,若仍然处理失败,交由内核调试器进行第二次的处理。如果还是无法处理,则调用 KeBugCheckEx 使系统崩溃,蓝屏。
用户层Ring3异常处理过程:
1>如果是第一次处理
1.1>先判断是否 Ring3被调试状态,
Ring3不在调试状态,当KiDebugRoutine指针不为NULL(存在内核wndbg调试器),PsGetCurrentProcess()->DebugPort的对象为NULL(即不存在调试对象),!KdIgnoreUmExceptions 忽略kd内核,不忽略内核层异常,就会发给内核层调试器
1.2>Ring3层调试状态,DbgkForwardException 将异常发送给三环,给Ring3调试器处理(DbgkForwardException 函数用于组合消息,并在内部调用 DbgkpSendApiMessage() 进行消息的传递 HOOK DbgkpSendApiMessage 用于反调试 )
1.3>如果上面的调试器都没有处理,就填充两个结构(两个EXCEPTION_RECORD结构体)并将EIP指针指向用户层函数 KiUserExceptionDispatcher 并跳转到用户层
KiUserExceptionDispatcher
在用户模式下,(RtlDispatchException)尝试将异常派发给异常处理程序VEH->SEH->UEH,处理成功给VCH. 如果异常处理程序处理了异常, 则结束异常分发, NtContinue. 如果用户层的异常处理程序处理不了, 则调用 NtRaiseException 函数主动触发异常,第三个参数设置为 False,表示第二次异常分发
-> 第二次处理异常( DbgkForwardException 发给调试端口,DbgkForwardException 发给异常端口,结束进程)。
最后返回Ring3
赞赏
- [原创]CVE-2013-4730 缓冲溢出漏洞研究 6300
- [原创]windows 调试与异常的简单梳理 4643
- 安卓 dex 学习 3416
- [原创]简单分析病毒样本-永恒之蓝WannaCry 6957