3.用户异常的分发

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

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

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

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

用户异常跳转
在这里插入图片描述

在这里插入图片描述

这些都是修改Ktrap_Frame回准备回3环操作
在这里插入图片描述

修改Ktrap_Frame.eip
在这里插入图片描述

  1. KeContextFromKframes将Trap_frame备份到context为返回3环做准备
  2. 判断先前模式0是内核调用1是用户层调
  3. 是否是第一次机会
  4. 是否有内核调试器
  5. 发送给3环调试
  6. 如果3环调试器没有处理这个异常,把异常数据填充到用户栈。
  7. 修正EIP为KiUserExceptionDispatcher。这个函数是ntdll的
  8. 调用KiDispatchException 返回用户层

在这里插入图片描述
无论通过那种方式,但线程再次回到3环时,将执行KiUserExceptionDispatcher函数

KiUserExceptionDispatcher()函数会将异常发生给一个基于帧的异常处理器,如果存在异常处理器处理了该异常,则程序继续执行。
如果该异常仍未被处理,调用NtRaiseException函数再次进入内核中处理该异常,这次KiDispatchException函数的FirstChance为FALSE(不是第一次了),第二次还没处理该异常,则终止该进程

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值