文章目录

  • 内容回顾:
  • 用户异常的处理流程:
  • 总结

内容回顾:

异常如果发送在内核层,处理起来比较简单,因为异常处理函数也在0环,不用切换堆栈,但是如果异常发生在3环,就意味着必须要切换堆栈,回到3环执行处理函数

切换堆栈的处理方式与用户APC的执行过程几乎是一样的,惟一的区别就是执行用户APC时返回3环后执行的函数是KiUserApcDispatcher,而异常处理时返回3环后执行的函数是KiUserExceprionDispatcher

所以,理解用户APC的执行过程是理解3环异常处理的关键

用户异常的处理流程:

VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)
1._KeContextFromKframes 将Trap_frame备份到context为返回3环做准备

第一步:不管用户异常还是内核异常,先把Trap_frame(当前线程3环进入0环时,那些寄存区环境,也就是eip运行地方那些值)备份到context里(为返回3环做准备)

这个函数两种异常(用户异常和内核异常)的分发都归它管,所以就存在异常处理是否需要回到三环,内核异常不用回去(内核异常处理函数在0环),用户异常需要回去(用户层处理函数在3环0)。

2.第二步:判断先前模式,0是内核调用,1是用户调用,用户层异常呢,紧接着就是跳转:0x4258C3

第三步:第一次执行时,肯定是第一次调用(这个函数不止执行一次),所以接着往下:

这里判断是否启用了内核调试器,如果有内核调试器的话,那么这个值是非零的,如果有内核调试器的话,那它就调用,把异常信息先发送给异常调试器(那么我们此处假设没有内核异常调试器,或者内核异常调试器没有处理)

第四步:用来判断3环调试器(3环调试器如果不存在或者3环调试器没有处理的话,那么接着往下走)

第五步:为回到三环做准备

一开始就把Trap_frame备份到context里,然后这里接下来就可以随心所欲地改

最关键的修改,把KeUserExceptionDispatcher里面的值覆盖到Eip,它并没有在当前位置直接返回三环。而是让当前程序结束执行

总结

VOID KiDispatchException(ExceptionRecord,ExceptionFrame,TrapFrame,PreviousMode,FirstChance)

  1. _KeContextFromKframes 将Trap_frame备份到context为返回3环做准备
  2. 判断先前模式 0是内核调用,1是用户调用
  3. .是否是第一次机会
  4. 是否有内核调试器
  5. 发送给3环调试
  6. 如果3环调试器没有处理这个异常,修正EIP为KiUserExceptionDispatcher
  7. KiDispatchException函数执行结束:CPU异常与模拟异常返回地点不同
    CPU异常:CPU检测到异常—>查IDT执行处理函数—>CommonDispatchException------>KiDispatchException 通过IRETD返回3环
    模拟异常:CxxThrowException—>RaiseException—>RtlRaiseException---->Nt!NtRaiseException—>Nt!KiRaiseException---->KiDispatchException通过系统调用返回3环
  8. 无论通过哪种方式,但线程再次回到3环,将执行KiUserExceptionDispatcher函数

异常分发(用户异常)相关推荐

  1. Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发

    Windows异常学习笔记(二)-- 内核异常处理流程&用户异常分发 用户层与内核层异常 内核异常 分析 KiDispatchException 分析 RtlDispatchException ...

  2. 异常分发(内核异常)

    文章目录 用户层异常与内核层异常 KiDispatchException 总结: `RtlDispatchException`的作用就是: 用户层异常与内核层异常 异常,可以发生在用户空间,也可以发生 ...

  3. android timer后函数继续执行_Android内存异常机制(用户空间)_JE

    常见的Android稳定性异常,有内核异常和Android层异常.内核异常也就是常说的"kernel panic",简称KE异常:Android层异常又分为java层crash和N ...

  4. Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别

    Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 参考文章: (1)Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 (2)https://ww ...

  5. boost::test模块自定义用户异常转换器注册表的单元测试

    boost::test模块自定义用户异常转换器注册表的单元测试 实现功能 C++实现代码 实现功能 boost::test模块自定义用户异常转换器注册表的单元测试 C++实现代码 #include & ...

  6. 微信亿级用户异常检测框架的设计与实践

    微信亿级用户异常检测框架的设计与实践 参考文章: (1)微信亿级用户异常检测框架的设计与实践 (2)https://www.cnblogs.com/qcloud1001/p/8351385.html ...

  7. 华为视频显示服务器异常,给予用户一份贴心|(数十份案例)APP异常界面与Toast产品设计落地...

    异常界面与Toast 说起异常界面,这里不由想起在日常生活中我们所使用的APP带来的各种阻碍情况下的一些反馈提示.这里要说明异常界面里面可能会包含Toast. 但从Android和IOS的人机交互规范 ...

  8. 0x0EA772D7 (msvcr80.dll) 处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。。

    当我的应用程序加装的数据占用的内存达到900M以上,会发生一个奇怪问题,使用ADO open接口 报异常 0x0EA772D7 (msvcr80.dll) 处有未经处理的异常: 0xC000041D: ...

  9. SIO_KEEPALIVE_VALS 用户异常掉线检测

    用户异常掉线检测                                  David.Zhu  2005/6/1    目前主要有三种方法来实现用户掉线检测:SO_KEEPALIVE ,SI ...

最新文章

  1. 国内首家!携程每周两天可在家“躺平”,76% 的员工主动报名
  2. seaJS简介和完整实例
  3. [转]关于数据库的并发性的一个解决方案
  4. 首届中国信息通信大数据大会将于4月20-21日在京召开
  5. 删除本地端口指令(启动时提示端口已经被使用)
  6. 行业术语001--关键绩效指标KPI_NLP_ACL
  7. SQL Server中TEXT类型操作
  8. 第一次作业+105032014142
  9. USACO 2.1 海明码(DFS)
  10. 安卓手机运行ios教程_安卓手机充电提示音教程
  11. PostgreSQL 为什么不要滥用unlogged table hash index
  12. JAVA教程下载-JAVA学习视频教程网盘分享
  13. ovnif摄像头修改ip
  14. Java docx4j 操作word 2.1
  15. php集成环境安装包网盘,一键安装PHP环境(Z Serv)PHP集成环境安装包
  16. Ansys-结构动力学分析-有预应力琴弦横向振动模态分析学习收获
  17. 新版万能声卡驱动-VoodooHDA-2.8.5
  18. 分类排序 同辈元素只在数据上的层级关系
  19. 7-3 计算平均成绩
  20. 手电筒安卓_安利一款演唱会必备APP——随手电筒

热门文章

  1. Algorithm:数学建模大赛(国赛和美赛)的简介/内容、数学建模做题流程、历年题目类型及思想、常用算法、常用工具之详细攻略
  2. 成功解决Exception: Graph file doesn't exist, path=F:\File_Python\Python_example\Human_Posture_Detection\
  3. DL之R-FCN:R-FCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  4. DL之DNN:利用MultiLayerNet模型【6*100+ReLU+SGD,weight_decay】对Mnist数据集训练来抑制过拟合
  5. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件)
  6. MAT之PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度
  7. MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测
  8. mysql sql语句大全
  9. struts2静态方法和动态方法调用
  10. (三)页面之间的参数传递