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函数是非常重要的,里面有对于零环与三环的异常处理是不同的。
之后是我们分析的重点。
KiRaiseException函数逆向的更多相关文章
- DbgUiConnectToDbg(ntdll.dll)函数逆向
暂时未解决问题: 1. [fs+0F24h]中存储着什么东西. 答案:其存放着被调试程序的DbgObject句柄._NtCreateDebugObject(ntoskrnl.exe)函数逆向分析 该 ...
- KeContextToKframes函数逆向
在逆向_KiRaiseException(之后紧接着就是派发KiDispatchException)函数时,遇到一个 KeContextToKframes 函数,表面意思将CONTEXT转换为 TRA ...
- RtlRaiseException(ntdll.dll)函数逆向
书中内容: 代码逆向: 1. CONTEXT是保存之前的函数(RaiseException)状态 2. 在逆向上一个函数时产生一个疑问:EXCEPTION_RECORD.ExceptionAddres ...
- RaiseException函数逆向
书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址. 答案在下个函数中:rtlRaiseE ...
- _NtCreateDebugObject(ntoskrnl.exe)函数逆向分析
该函数由 DbgUiConnectToDbg(ntdll.dll)函数 调用. 其调用时传入的参数如下: 函数作用:初始化被调试的内核对象,将被调试对象句柄放入调试对象的 [fs:f24]处. 1.现 ...
- 【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 ...
- x32下PsSetLoadImageNotifyRoutine的逆向
一丶简介 纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. ...
- 两种异常(CPU异常、用户模拟异常)的收集
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 两种异常(CPU异常.用户模拟异常)的收集 文章的核心:异常收集 ...
- SqlServer 杂记 不断补充中
1.OPTION (MAXRECURSION 25) :最大允许递归的次数.默认最大CTE递归只有100次,而你要求插入10年的数据,需要递归3000多次,所以要使用option (MAXRECURS ...
随机推荐
- 【GUI】基于V7开发板的裸机和各种RTOS版本的emWin程序模板,支持硬件JPEG,已发布(2019-05-26)
说明: 1.MDK请使用5.26及其以上版本,IAR请使用8.30及其以上版本. 2.修正了ST提供的部分驱动设计不合理的地方. 3.原创实现硬件JPEG添加到emWin中,实现简单,全程使用SDRA ...
- Python 词云可视化
最近看到不少公众号都有一些词云图,于是想学习一下使用Python生成可视化的词云,上B站搜索教程的时候,发现了一位UP讲的很不错,UP也给出了GitHub上的源码,是一个很不错的教程,这篇博客主要就是 ...
- Java入门系列之StringBuilder、StringBuffer(三)
前言 上一节我们讲解了字符串的特性,除了字符串类外,还有两个我们也会经常用到的类,那就是StringBuffer和StringBuilder.因为字符串不可变,所以我们每次对字符串的修改比如通过连接c ...
- ZooKeeper(六):watch机制的原理与实现
因为ZK有watch机制,可以随时发现一些数据的变化,从而达到数据的及时性. ZK的所有读操作都可以设置watch监视点: getData, getChildren, exists. 写操作则是不能设 ...
- ASP.NET MVC教程一:ASP.NET MVC简介
一.MVC模式简介 MVC模式是一种流行的Web应用架构技术,它被命名为模型-视图-控制器(Model-View-Controller).在分离应用程序内部的关注点方面,MVC是一种强大而简洁的方式, ...
- python爬虫爬小说网站涉及到(js加密,CSS加密)
我是对于xxxx小说网进行爬取只讲思路不展示代码请见谅 一.涉及到的反爬 js加密 css加密 请求头中的User-Agent以及 cookie 二.思路 1.对于js加密 对于有js加密信息,我们一 ...
- JS基础语法---Date对象---格式化日期
格式化后的指定格式的日期和时间,封装一个函数 function getDate() { var dt = new Date(); var year = dt.getFullYear(); var mo ...
- 项目中使用http referer,为了盗取图片资源
项目背景:因为图片的数据是爬取的别人的图片,而且保存的数据仅仅是图片地址链接,为了减少数据存储和服务器压力,但是这就引发一个问题,有的图片地址没有做防盗处理,可以随意的下载使用:但有些图片的服务器做了 ...
- TED演讲积累。
Passion is not a job,a sport ,or a hobby,it is the full of force of your attention.and energy that y ...
- 房屋布局分析《Physics Inspired Optimization on Semantic Transfer Features: An Alternative Method for Room Layout Estimation》
视觉算法在智能审核系统上的演进与实践 刘天悦 贝壳找房 / 资深工程师 https://static001.geekbang.org/con/56/pdf/1088777747/file/%E8%A7 ...