用户层异常的派发与处理

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异常,传送门:

  ① 用户层异常的处理 - VEH异常

 

posted @ 2020-04-25 16:54  OneTrainee  阅读(514)  评论(2编辑  收藏  举报