C++异常处理机制反汇编(二):32位下基本类型异常分析

C++异常处理机制反汇编(二):32位下基本类型异常分析

上一篇文章分析了异常处理时遇到的一些结构,现在我们来通过实例分析来加深对那些表的理解。

示例分析

注册异常回调函数

下面的代码用于注册异常回调函数:

asm 复制代码
00401010 55                   push        ebp
00401011 8B EC                mov         ebp,esp
00401013 6A FF                push        0FFh
00401015 68 60 34 41 00       push        offset __ehhandler$_main (00413460)
0040101A 64 A1 00 00 00 00    mov         eax,fs:[00000000]
00401020 50                   push        eax
00401021 64 89 25 00 00 00 00 mov         dword ptr fs:[0],esp

收集异常信息

对于__ehhandler$_main:

其中eax是___CxxFrameHandler函数的参数,是FuncInfo的地址。该函数是对异常信息进行获取的,我们进一步查看该函数的代码:

CxxFrameHandler函数原型如下:

cpp 复制代码
int cdecl CxxFrameHandler (
	EXCEPTION_RECORD *pExcept,
	EHRegistrationNode *pRN,
	struct _CONTEXT *pContext,
	void *pDC);

对异常进行分类处理

上图中的_InternalCxxFrameHandler这个函数是对异常进行分类处理,完成了标记检查、展开、查找和派发等工作。该函数原型如下:

cpp 复制代码
int cdecl InternalCxxFrameHandler(
	EXCEPTION_RECORD *pExcept, 
	EHRegistrationNode *pRN,
	struct _CONTEXT *pContext,
	void *pDC,
	struct FuncInfo *pFuncInfo,
	int CatchDepth,
	int pMarkerRN,
	int recursive
	);

从上图可以看到,该函数有几个结构体参数,我们来看看其中的具体字段。

先看EXCEPTION_RECORD:

cpp 复制代码
typedef struct _EXCEPTION_RECORD {
  DWORD                    ExceptionCode;
  DWORD                    ExceptionFlags;
  struct _EXCEPTION_RECORD *ExceptionRecord;
  PVOID                    ExceptionAddress;
  DWORD                    NumberParameters;
  ULONG_PTR                ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];
} EXCEPTION_RECORD;

再来看看EHRegistrationNode:

txt 复制代码
EHRegistrationNode struc ; (sizeof=0x10)
pNext dd ? ; 指向链表的上一个节点EHRegistrationNode*
HandlerProc dd ? ; 记录当前函数栈帧的异常回调函数
dwState dd ? ; 记录当前函数栈帧的状态值
dwEbp dd ? ; 记录当前函数栈帧的ebp值
EHRegistrationNode ends

InternalCxxFrameHandler函数反汇编代码较长,这里不列出,我们需要知道的是函数__InternalCxxFrameHandler的主要功能是完成异常类型的检查,最终调用查找try块和catch块的函数FindHandler。

二FindHandler利用TypeMatch函数完成了对异常匹配的判定并得到了结果,又调用CatchIt完成了异常处理。

总结

这里说得很简单,如何利用先前提到的各种结构完成对异常处理没有细讲。

相关推荐
wo_jack29 分钟前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
David猪大卫20 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger20 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz1 天前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化1 天前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu1 天前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu1 天前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖1 天前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json