zoukankan      html  css  js  c++  java
  • 用户层异常的派发与处理

    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异常

  • 相关阅读:
    线程同步的方法
    为什么HashMap中key是引用类型而不是基本数据类型?为什么有了基本数据类型还有包装类型?
    使用MyBatis的mapper接口(动态代理对象)调用时的注意点
    redis的aof持久化模式
    redis的RDB持久化方式的优缺点
    快排算法
    JAVA8新特性
    NIO中Buffer的capacity,position和limit含义
    ArrayBlockingQueue与LinkedBlockingQueue对比
    写加锁但读没有加锁造成的脏读问题
  • 原文地址:https://www.cnblogs.com/onetrainee/p/12773363.html
Copyright © 2011-2022 走看看