首页
社区
课程
招聘
[原创]windows 调试与异常的简单梳理
发表于: 2021-3-1 23:34 4642

[原创]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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 2
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//