用户层异常的派发与处理
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
用户层异常的派发与处理
1. 用户层异常的派发(KiDisaptchException函数)
用户层中出现的异常在KiDispatchException比较准确,其详细如下所示:
1)其调用内核调试器还是存在条件的:
存在KiDebugRoutine;DebugPort不为空;并且如果是int3断点异常其必须所带的第一个参数不为零,这才会引发内核调试器。
其实你在实际操作的情况也有这种感觉,明明开着内核调试器windbg,但OD等操作windbg却接收不到,就是这个KdIsThisAkdTrap函数作怪。
2)构造三环栈中数据返回三环:
如下图所示,其存在四次复制,赋值的信息比较明显,形成的堆栈图也比较清晰,其返回三环是ntdll!KeUserExceptionDispatcher函数,其负责对异常的处理。
2.ntdll!KiUserExceptionDispatcher函数分析
返回三环后,可以看到其调用一个RtlDispatchException。
注意,在处理内核异常时,也有一个同名的RtlDispatchException,那是内核模块,这是三环模块。
RtlDispatchException可以认为是异常的核心,区别是如果在内核模块,则处理零环,如果在ntdll模块,则处理三环。
这样你就能很好的区分两者的作用了。
3. ntdll!RtlDispatchException函数分析
其处理两种异常,一种VEH异常,一种SEH异常。
VEH异常相当于一个全局变量的异常链表,其通过全局变量查找该张表。
SEH异常相当于局部异常,其Try··catch··就是向这里面添加异常,TEB、KPCR第一个成员都是这个ExceptionList。
我们先分析这里,之后会分析VEH异常与SEH异常,之后再来分析这个函数。
4. VEH异常与SEH异常的处理
为避免篇幅过多,我们另起篇幅来分析SEH异常与VEH异常,传送门: