• KiRaiseException函数逆向


      KiRaiseException函数是记录异常的最后一步,在这之后紧接着就调用KiDispatchException分发异常。

      我们在逆向前,先看一下书中的介绍:

       

    1. 概念认知:

      KiRaiseException 可以被看作 “处理前的最后一次异常记录”,异常记录的目的是:完善异常处理信息,在派发时根据这些信息来进行处理。

      无论是三环异常,还是零环异常,进入内核中都会经过这里。

      因此对于两者有不同的记录处理。

      如下图,对于三环,多了一个部分--备份CONTEXT_FRAME与EXCEPTION_RECORD。(之后介绍为什么要备份)

      

    二、代码分析:

      1. 【未解决】为什么这里会是先前模式判断?

         

         1)可以肯定的是:这部分必然是三环与零环的判断(根据处理逻辑与WRK源码)

        2)但值从哪里来?FS在零环中指向KPCR,fs:124h指向 _Kthread,在_Kthread+0x13A处,是关于APC的。

            

        3)希望有懂的可以告诉我,或者之后有时间会解决。

       2. 为什么三环需要备份 CONTEXT_FRAME 与 EXCEPTION_RECORD?

        因为三环异常,需要从零环再次返回三环处理。而入口并不是从之前从三环到零环的入口,因此需要备份防止出错恢复。

        之前有一篇APC的文章,里面有一张图详细解释了 "三环->零环->新三环" 的问题。

        1)基于WRK源码分析

          

        2)代码逆向

          从源码看,其逆向代码应该很简单,但实际分析起来并不是。

          仅ExceptionRecord时调用了一个 _memcpy。

          现在问题来了:ContextRecord是如何实现初始化的?

            

            分析策略-逆推法:当之后有函数调用这个ContextRecord时,我们就可以确定其内存地址或寄存器,在这基础之上往前寻找。

              

              如上图,我们发现ebx存储着 CONTEXT_FRAME 结构,我们点亮ebx寄存器,查看其最近改变的情况。

              如下图,最近一次调用 mov ebx,edi。而edi是内存复制中最终的目的地址。

                  因此就可以推断出这里实现了对 CONTEXT 的某些操作(并不能确定是复制,可能在xp系统中没有实现复制,但肯定是完善了Context)。

              

      3. 为什么要调用 KeContextToKframes 进行转换

        类似下面的这张图,之前记录的CONTEXT_FRAME是为了还原之前的环境,并不是处理异常使用的。

        因此,处理异常,我们需要专门的TRAP_FRAME来进行,这时,就用到了 KeContextToKframes 这个函数了。

        这里有篇文章简单介绍了一下  KeContextToKframes函数逆向 

        

       4. 最高位清零:

        1)书中的解释:

          

          2)WRK中的解释

          

        3)反汇编代码的处理:

          

    三、总结:

      经过上面的处理之后,我们就开始执行 KiDIspatchException,其对于不同的异常,有不同的处理策略。

      我们先看一下其需要的参数:

      

       异常记录、转换后的TrapFrame,之前的TrapFrame,先前模式,是否是第一次。

      KiDIspatchException函数是非常重要的,里面有对于零环与三环的异常处理是不同的。

      之后是我们分析的重点。

  • 相关阅读:
    python 编码问题
    关于网页划词翻译
    clang 编译 c++
    Java流(Stream)操作实例筛选、映射、查找匹配
    JAVA系列笔记十八之nohup实现后台运行程序
    VSCode汇总
    java jdk 国内下载镜像地址及安装
    LocalDate、LocalDateTime与timestamp、Date的转换
    List.sort()排序功能
    Java Array、List、Set互相转化
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11871361.html
Copyright © 2020-2023  润新知