异常

定位异常处理函数

示例代码

#include <iostream>

#define INTTYPE       0
#define FLOATTYPE     1
#define DOUBLETYPE    2
#define CHARPTRTYPE   3
#define CHARTYPE      4
#define INTPTRTYPE    5

using namespace std;

int main(int argc)
{
    try
    {
        switch (argc)
        {
        case INTTYPE:
        {
            throw (int)argc;

            break;
        }
        case FLOATTYPE:
        {
            throw (float)argc;

            break;
        }
        case DOUBLETYPE:
        {
            throw 5.8;

            break;
        }
        case CHARPTRTYPE:
        {
            throw (char*)&argc;

            break;
        }
        case CHARTYPE:
        {
            throw (char)&argc;

            break;
        }
        case INTPTRTYPE:
        {
            throw &argc;

            break;
        }
        default:
            char* ptr = NULL;
            throw ptr;
            break;
        }
    }
    catch (int nNumber)
    {
        std::cout << "错误" << nNumber << std::endl;
    }
    catch (char* szBuff)
    {
        std::cout << "错误" << szBuff << std::endl;
    }
    catch (float fNumber)
    {
        std::cout << "错误" << fNumber << std::endl;

    }
    catch (double dblNumber)
    {
        std::cout << "错误" << dblNumber << std::endl;
    }
    catch (char cTemp)
    {
        std::cout << "错误" << cTemp << std::endl;
    }
    catch (...)
    {
        std::cout << "错误" << "Unknown" << std::endl;
    }
}
定位异常处理函数

1.找到SEH异常处理回调

  • 一般在函数起始的位置
    在这里插入图片描述

2.找到异常处理函数查表的位置,下断点,断点来的时候单步步入
在这里插入图片描述
3.接着根据以下定则下断点跟踪(中间需要跟进7层)

  • 找参数最多的call下断点
  • 参数一样则选第二个
  • 最后一层是call 寄存器(eax)
    在这里插入图片描述

IDA静态分析SEH链

异常数据关系表
在这里插入图片描述

还原异常处理结构(上半部分表)

1函数开头进入SEH链
在这里插入图片描述
2.找到异常函数信息结构体
在这里插入图片描述
3.分析数据关系

  • 第一个表记录了该函数有几个try,以及对应的catch块信息表指针数组
  • 第二个表记录了该函数有try对应的catch表,以及对应的catch函数指针数组
  • 第三个表为每个catch函数的地址
    在这里插入图片描述
还原具体的异常处理代码(下半部分表)

1.找到函数内抛异常的函数,参数内找异常信息表
在这里插入图片描述
2.找到catch表 image
在这里插入图片描述
3.表内记录了该异常类型匹配的catch个数和catch信息表 image
在这里插入图片描述
4.catch信息表内找到对应的catch类型表 image
在这里插入图片描述
5.找到类型表,对类型表做一个交叉引用,根据引用类类型表,则能找到catch的函数地址 image
在这里插入图片描述

补充

1.如果是抛出的异常是类对象的话
2.编译器会根据抛出异常的子父类关系生成catch函数指针数组
子类优先,父类次之

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值