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

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

异常的分类

  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指令检测到异常(例:除0)
  2. 查IDT表,执行中断处理函数
  3. CommonDispatchException
  4. KiDispatchException

1.CPU异常记录

下面跟一下除0异常处理执行过程,ida中Alt+T搜索_IDT
1.CPU异常记录

1.CPU异常记录

1.CPU异常记录

1.CPU异常记录

1.CPU异常记录
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];	//附加参数指针
};

CPU异常执行的流程:

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

相关文章: