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. vuetify,vux,Mint UI 等框架的选择

    vuetify: https://vuetifyjs.com/zh-Hans/getting-started/quick-start NutUI:https://github.com/jdf2e/nu ...

  2. Redis令牌桶限流

    一 .场景描述 在开发接口服务器的过程中,为了防止客户端对于接口的滥用,保护服务器的资源, 通常来说我们会对于服务器上的各种接口进行调用次数的限制.比如对于某个 用户,他在一个时间段(interval ...

  3. 如何完成述职报告或年终总结PPT

    对于我们 打工仔 职场人士来说,年有年度总结,月有月度报告,指不定有些小伙伴还会有周报和日报,不仅枯燥,而且浪费时间,头都要炸了 ,简直太有趣了呢. 所以,如何准确快速的写完述职报告呢? 这是个好问题 ...

  4. Exe4j 打包: this executable was created with an evaluation version of exe4j

    异常 this executable was created with an evaluation version of exe4j   异常.png 问题原因 当前打包使用exe4j未授权 解决方法 ...

  5. Django路由系统的简介与使用

    Django的路由系统 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL 与 为该URL调用的视图函数之间的映射表. ...

  6. 松软科技带你学开发:SQL--COUNT() 函数

    SQL COUNT() 语法 SQL COUNT(column_name) 语法 COUNT(column_name) 函数返回指定列的值的数目(NULL 不计入): SELECT COUNT(col ...

  7. 持续集成与Devops关系

    什么是持续集成 持续集成(Continuous Integration,简称CI),是一种软件开发实践,在实践中指只要代码有变更,就自动运行构建和测试,反馈运行结果.通俗一点来讲,就是绑定项目的代码仓 ...

  8. iOS---------查看界面的流畅度

    iOS查看屏幕帧数工具--YYFPSLabel iOS 保持界面流畅的技巧 iOS 优化界面流畅度的探讨 先研究一下     改天自己出一篇文章

  9. python小技巧 小知识

    python小技巧 小知识 python系统变量(修改调用shell命令路径)或用户空间说明 20150418 python调用系统命令,报找不到.怎么办? 类似执行shell的: [ -f /etc ...

  10. cookie,webstorage的理解

    在前两天的开发时,遇到一个问题,需要将一个网页在预加载时,优先出一个弹出框,但是再次加载时不希望它出现,在经过一段时间的搜索和尝试之后,发现了大多使用的两种方式:生成cookie和webStorage ...