-
-
[原创][分享]异常处理机制-用户异常的分发与处理学习笔记
-
发表于: 2020-8-26 20:22 4476
-
一、用户异常分发
异常记录记录之后就是分发异常
最终会调用KiDispatchException来分发异常:
接上图
用户异常分发总结
异常如果发生在内核层,处理起来比较简单,因为异常处理函数也在0环,
不用切换堆栈,但是如果异常发生在3环,就意味着必须要切换堆栈,回到3环执行处理函数。
切换堆栈的处理方式与用户APC的执行过程几乎是一样的,惟一的区别就是
执行用户APC时返回3环后执行的函数是KiUserApcDispatcher,
而异常处理时返回3环后执行的函数是KiUserExceptionDispatcher。
二、用户异常处理之VEH
VEH是一个全局链表,里面存储了处理异常的函数
(Ntdll.dll)KiUserExceptionDispatcher 函数总结
1.调用ntdll的库函数RtlDispatchException查找并执行异常处理函数(内核异常处理的RtlDispatchException是ntoskrnl.exe模块的库函数,两个函数名一样,但是是不同库的库函数)
2.如果RtlDispatchException成功处理异常,返回真,调用ZwContinue再次进入0环,修正恢复3环EIP。
3.如果RtlDispatchException未处理异常,返回假,调用ZwRaiseException进行第二轮异常分发
VEH异常处理流程总结
1.CPU捕获到异常信息
2.通过KiDispatchException分发异常(EIP=KiUserExceptionDispatcher)
3.KiUserExceptionDispatcher调用RtlDispatchException
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课