1.异常记录

我们主要围绕这个主线展开:

  • 异常记录
  • 异常分发
  • 异常处理

异常的分类

  1. CPU产生的异常
  2. 软件模拟产生的常

这种属于CPU产生的异常

int main()
{
	int a = 10;
	int b = 0;
	int val = a / b;
}

这种属于软件模拟的异常

void a()
{
	throw 1;
}
int main()
{
	a();
}

CPU异常产生过程

  1. CPU指令检测到异常
  2. 查IDT表,执行中断处理函数
  3. 调用CommonDispatchException(构建EXCEPTION_RECORD)
  4. KiDispatchException(分发异常:目的是找到异常的处理函数)

在这里插入图片描述

下面跟一下除0异常处理执行过程,ida中Alt+T搜索_IDT
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
CommonDispatchException这个函数就是构建一个_EXCEPTION_RECORD结构体并赋值

typedef struct _EXCEPTION_RECORD//记录异常信息
{
	DWORD ExceptionCode;		//异常码
	DWORD ExceptionFlags;	//异常标志 cpu 0 ,软件模拟 1,嵌套异常10h ...
	struct _EXCEPTION_RECORD* ExceptionRecord;	//下一个异常 一般为NULL 除非出现嵌套异常
	PVOID ExceptionAddress;	//发生异常的指令地址
	DWORD NumberParameters;	//参数个数
	ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];	//附加参数指针
};


软件模拟异常的过程

  1. CxxThrowException
  2. (KERNEL32.DLL)RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, const ULONG PTR "IpArguments)
  3. NTDLL.DLL! RtIRaiseException()
  4. NT!NtRaiseException
  5. NT!KiRaiseException

(KERNEL32.DLL)RaiseException函数分析

在这里插入图片描述
0xE06D7363就是异常码,软件模拟的异常码是固定的依赖与编译环境。

RaiseException
在这里插入图片描述

KiRaiseException行为

  1. EXCEPTION_RECORD.ExceptionCode最高位清零用于区分CPU异常。
  2. 调用 KiDispatchException 开始分发异常

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值