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函数是非常重要的,里面有对于零环与三环的异常处理是不同的。

  之后是我们分析的重点。

KiRaiseException函数逆向的更多相关文章

  1. DbgUiConnectToDbg(ntdll.dll)函数逆向

    暂时未解决问题: 1.  [fs+0F24h]中存储着什么东西. 答案:其存放着被调试程序的DbgObject句柄._NtCreateDebugObject(ntoskrnl.exe)函数逆向分析 该 ...

  2. KeContextToKframes函数逆向

    在逆向_KiRaiseException(之后紧接着就是派发KiDispatchException)函数时,遇到一个 KeContextToKframes 函数,表面意思将CONTEXT转换为 TRA ...

  3. RtlRaiseException(ntdll.dll)函数逆向

    书中内容: 代码逆向: 1. CONTEXT是保存之前的函数(RaiseException)状态 2. 在逆向上一个函数时产生一个疑问:EXCEPTION_RECORD.ExceptionAddres ...

  4. RaiseException函数逆向

    书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址. 答案在下个函数中:rtlRaiseE ...

  5. _NtCreateDebugObject(ntoskrnl.exe)函数逆向分析

    该函数由 DbgUiConnectToDbg(ntdll.dll)函数 调用. 其调用时传入的参数如下: 函数作用:初始化被调试的内核对象,将被调试对象句柄放入调试对象的 [fs:f24]处. 1.现 ...

  6. 【Linux】-NO.87.Assembly.1.滴水逆向.1.001-【介绍】-

    1.0.0 Summary Tittle:[Linux]-NO.87.Assembly.1.滴水逆向.1.001-[基础]- Style:Java Series:Log4j Since:2017-04 ...

  7. x32下PsSetLoadImageNotifyRoutine的逆向

    一丶简介 纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. ...

  8. 两种异常(CPU异常、用户模拟异常)的收集

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集  文章的核心:异常收集 ...

  9. SqlServer 杂记 不断补充中

    1.OPTION (MAXRECURSION 25) :最大允许递归的次数.默认最大CTE递归只有100次,而你要求插入10年的数据,需要递归3000多次,所以要使用option (MAXRECURS ...

随机推荐

  1. BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型

    问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...

  2. Web安全测试学习笔记-DVWA-SQL注入-1

    SQL注入的定义网上很多,作为一个初学者,我对SQL注入的理解是这样的:网站应用一般都有后台数据库(不论是关系型还是非关系型),用户在网站上的绝大部分操作,最终都会跟数据库交互(也就是执行一串SQL语 ...

  3. dataTable 表插入新行

    DataRow dr = dt.NewRow();//定义新行            dr["sumPrice"] = sumPrice;//对应字段赋值            d ...

  4. 利用Python开发智能阅卷系统

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 机器学习与统计学 PS:如有需要Python学习资料的小伙伴可以加 ...

  5. 原生js获得八种方式,事件操作

    08.17自我总结 关于js 一.原生js获得八种方式 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTa ...

  6. Go 自定义类型来实现枚举类型限制

    今天使用iota 发现一个问题.定义别名类型的时候 调用函数报错.废话不多说,我们看一段示例(关于iota的用法这里就不介绍了,手册介绍滴比较详细): package main import &quo ...

  7. html文本框默认值刷新后无法继续显示解决方法

    转载于:https://blog.csdn.net/yufeitong/article/details/8485129 有这种情况,文本框输入值后,再次刷新默认值就无法显示了 原始html代码: &l ...

  8. 【三】Gradle中的Task

    gradle中,最经常被使用的,一个task,一个是dependencies 1.Task声明 task默认是DefaultTask类, Task中有两个属性 group description,最佳 ...

  9. Docker-核心笔记(含Dockerfile,Compose)

    Docker-核心笔记(含Dockerfile,Compose) 2017/03 Chenxin 参考 https://yeasy.gitbooks.io/docker_practice Docker ...

  10. & 和 && 的区别,与(&)运算符、位移运算符(<< 、>>、>>>)的含义及使用(Java示例)

    & 和 && 的区别,与(&)运算符.位移运算符(<< .>>.>>>)的含义及使用(Java示例) 1. & 和 & ...