异常分发(用户异常)
文章目录
- 内容回顾:
- 用户异常的处理流程:
- 总结
内容回顾:
异常如果发送在内核层,处理起来比较简单,因为异常处理函数也在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)
- _KeContextFromKframes 将Trap_frame备份到context为返回3环做准备
- 判断先前模式 0是内核调用,1是用户调用
- .是否是第一次机会
- 是否有内核调试器
- 发送给3环调试
- 如果3环调试器没有处理这个异常,修正EIP为KiUserExceptionDispatcher
- KiDispatchException函数执行结束:CPU异常与模拟异常返回地点不同
CPU异常:CPU检测到异常—>查IDT执行处理函数—>CommonDispatchException------>KiDispatchException 通过IRETD返回3环
模拟异常:CxxThrowException—>RaiseException—>RtlRaiseException---->Nt!NtRaiseException—>Nt!KiRaiseException---->KiDispatchException通过系统调用返回3环 - 无论通过哪种方式,但线程再次回到3环,将执行KiUserExceptionDispatcher函数
异常分发(用户异常)相关推荐
- Windows异常学习笔记(二)—— 内核异常处理流程用户异常的分发
Windows异常学习笔记(二)-- 内核异常处理流程&用户异常分发 用户层与内核层异常 内核异常 分析 KiDispatchException 分析 RtlDispatchException ...
- 异常分发(内核异常)
文章目录 用户层异常与内核层异常 KiDispatchException 总结: `RtlDispatchException`的作用就是: 用户层异常与内核层异常 异常,可以发生在用户空间,也可以发生 ...
- android timer后函数继续执行_Android内存异常机制(用户空间)_JE
常见的Android稳定性异常,有内核异常和Android层异常.内核异常也就是常说的"kernel panic",简称KE异常:Android层异常又分为java层crash和N ...
- Java 创建用户异常类、将异常一直向上抛、 throw和throws的区别
Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 参考文章: (1)Java 创建用户异常类.将异常一直向上抛. throw和throws的区别 (2)https://ww ...
- boost::test模块自定义用户异常转换器注册表的单元测试
boost::test模块自定义用户异常转换器注册表的单元测试 实现功能 C++实现代码 实现功能 boost::test模块自定义用户异常转换器注册表的单元测试 C++实现代码 #include & ...
- 微信亿级用户异常检测框架的设计与实践
微信亿级用户异常检测框架的设计与实践 参考文章: (1)微信亿级用户异常检测框架的设计与实践 (2)https://www.cnblogs.com/qcloud1001/p/8351385.html ...
- 华为视频显示服务器异常,给予用户一份贴心|(数十份案例)APP异常界面与Toast产品设计落地...
异常界面与Toast 说起异常界面,这里不由想起在日常生活中我们所使用的APP带来的各种阻碍情况下的一些反馈提示.这里要说明异常界面里面可能会包含Toast. 但从Android和IOS的人机交互规范 ...
- 0x0EA772D7 (msvcr80.dll) 处有未经处理的异常: 0xC000041D: 用户回调期间遇到未经处理的异常。。
当我的应用程序加装的数据占用的内存达到900M以上,会发生一个奇怪问题,使用ADO open接口 报异常 0x0EA772D7 (msvcr80.dll) 处有未经处理的异常: 0xC000041D: ...
- SIO_KEEPALIVE_VALS 用户异常掉线检测
用户异常掉线检测 David.Zhu 2005/6/1 目前主要有三种方法来实现用户掉线检测:SO_KEEPALIVE ,SI ...
最新文章
- 国内首家!携程每周两天可在家“躺平”,76% 的员工主动报名
- seaJS简介和完整实例
- [转]关于数据库的并发性的一个解决方案
- 首届中国信息通信大数据大会将于4月20-21日在京召开
- 删除本地端口指令(启动时提示端口已经被使用)
- 行业术语001--关键绩效指标KPI_NLP_ACL
- SQL Server中TEXT类型操作
- 第一次作业+105032014142
- USACO 2.1 海明码(DFS)
- 安卓手机运行ios教程_安卓手机充电提示音教程
- PostgreSQL 为什么不要滥用unlogged table hash index
- JAVA教程下载-JAVA学习视频教程网盘分享
- ovnif摄像头修改ip
- Java docx4j 操作word 2.1
- php集成环境安装包网盘,一键安装PHP环境(Z Serv)PHP集成环境安装包
- Ansys-结构动力学分析-有预应力琴弦横向振动模态分析学习收获
- 新版万能声卡驱动-VoodooHDA-2.8.5
- 分类排序 同辈元素只在数据上的层级关系
- 7-3 计算平均成绩
- 手电筒安卓_安利一款演唱会必备APP——随手电筒
热门文章
- Algorithm:数学建模大赛(国赛和美赛)的简介/内容、数学建模做题流程、历年题目类型及思想、常用算法、常用工具之详细攻略
- 成功解决Exception: Graph file doesn't exist, path=F:\File_Python\Python_example\Human_Posture_Detection\
- DL之R-FCN:R-FCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之DNN:利用MultiLayerNet模型【6*100+ReLU+SGD,weight_decay】对Mnist数据集训练来抑制过拟合
- Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Button展示图片事件)
- MAT之PSO:利用PSO+ω参数实现对一元函数y = sin(10*pi*x) ./ x进行求解优化,找到最优个体适应度
- MAT之SVM:SVM之分类预测根据已有大量数据集案例,输入已有病例的特征向量实现乳腺癌诊断高准确率预测
- mysql sql语句大全
- struts2静态方法和动态方法调用
- (三)页面之间的参数传递