我们主要围绕这个主线展开:
- 异常记录
- 异常分发
- 异常处理
异常的分类
- CPU产生的异常
- 软件模拟产生的常
这种属于CPU产生的异常
int main()
{
int a = 10;
int b = 0;
int val = a / b;
}
这种属于软件模拟的异常
void a()
{
throw 1;
}
int main()
{
a();
}
CPU异常产生过程
- CPU指令检测到异常(例:除0)
- 查IDT表,执行中断处理函数
- CommonDispatchException
- 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]; //附加参数指针
};
CPU异常执行的流程:
- CPU指令检测到异常
- 查IDT表,执行中断处理函数
- 调用CommonDispatchException(构建EXCEPTION_RECORD)
- KiDispatchException(分发异常:目的是找到异常的处理函数)