C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原

iBinary 2017-12-15 原文

C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原

 

得知            C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原

我们以前讲SEH异常处理的时候已经说过了,C++中的Try catch语法只不过是对SEH做了一个封装.

如果不懂SEH异常处理,请点击博客链接熟悉一下,当然如果不想知道,也可以直接往下看.因为异常处理所以做了封装,但是不影响我们还原.

这里有两种解决方法,

第一种,小白也能明白了还原方式,不用懂原理

第二种,了解其原理,并能在IDA中正确的还原.

SEH异常处理博客链接:

  http://www.cnblogs.com/iBinary/category/1083755.html

一丶小白也懂的异常处理还原.

第一种,不用懂任何原理,(反汇编要懂,最起码的汇编代码知道是什么,不然这个专题讲了你也看不懂)

先看下高级代码:

  

int main(int argc, char* argv[])
{
    try
    {
        throw 3;//抛出3整形的异常
    }
    catch (int)
    {
        printf("%d\r\n",3);
    }
    return 0;
}

OD调试,观看步骤.

首先步骤分两步.

1.找SEH异常处理回调.

2.找参数多的call下断点

3.最后一个是call 寄存器.则找到正确的cath位置.

 

1.找到SEH的异常处理回调函数(如果不懂,看下SEH的筛选器异常.)

观看栈参数,可以看到回调函数地址是00410CC0,此时反汇编窗口跟过去下断点.

2.观看参数多了call,下断点,然后跟进.

因为层级较多,这里大家动手实战即可.

3.找到最后一层call一个寄存器.

此时则找到了我们的cath处理块了.

 

二丶理解原理进行实战.

上面说的,不懂原理你也可以做.比如以后工作了,原理不懂,起码做代码还原的时候还可以混口饭吃 ^_^

下面讲解原理.

首先,我们先寻找数据关系.

一个函数可以有多个 try 这是没问题的,所以 函数和try的关系是一对多的关系.

一个try有多个catch也是没有问题的.那么对应关系也是一对多.

所以操作系统为了管理这些.需要建表.(当然是未公开的),我们可以逆向得知.

1.原理介绍,上半部分表

观看表

看到怎么多表是不是很晕.其实很简单,只是里面的某个字段对我们有用.

1.观看函数信息表FuncInfo,重要字段就是dwTryCount,以及pTryBlockMap,我们说过一个函数可以有多个try,所以函数信息就记录了try的个数.以及每个try的try块结构,关于上面的成员,都是SEH的异常展开的.要做首尾动作的,对于我们还原没有任何阻碍,可以不用理解.

2.TryBlockMap表(tyr块信息表),我们还说过,一个try可以有多个catch,显然,try块信息表也要记录catch的个数.一个catch信息块的结构.

3.cathch信息块的结构体(msRTTIDsrc)msRTTIDsrc这个表是IDA识别的,我们可以自己说他是catch信息表,msRTTIDsrc的全名是 Microsoft Run Time TypeInfo ….微软运行时类型识别.

表结构体中重要字段就是 dwCount,catch信息快的个数,一个cathch信息表.

4.catch信息表(msRTTIDsrc),里面有4个成员, nflag 一个标志,表示你是常量,还是变量,还是引用. ptype,表示你的类型是什么类型.是int,还是float什么的,这个有个专门的表格存放着.下面重要字段则是catch的函数地址.编译器内部编译的时候,编译的catch是一个函数,也是有返回值的,返回值是catch_end的位置.

到这里,我们的上半部分就看完了.

总结一下:

  对于上半部分.主要着重于 函数信息表,try块表.catch表.以及catch块表.

为什么说上半部分,是这样的,对于我们还原来说.有两种情况.

1.完整的还原trycatch的异常信息结构

2.找到关键的catch匹配函数.

这两种是完全不一样的,如果我们还原就看上版本的表.如果我们要找那个catch捕获异常,则看下部分的表,(下面讲解.)

实战演练.

实战演练的时候,我们就要知道函数信息表在哪,其实我们已经找到了,只不过大家不知道,按照小白思路为什么一路跟就可以找到catch块表.只是我们没讲.

1.找到注册异常回调的地方,进入回调函数内部.

2.看到反汇编.

这个地方,给eax赋值的地址就是函数信息表了.我们用IDA打开.根据表结构可以很自然的就能找到.catch块的位置.

IDA实战.

1.找到函数信息表点击进去

可以看到MaicNumber等等一些列的东西.

,通过最后一个成员,可以找到Try块信息表.

2.找到Try块信息表

可以看到Try块信息表中有几个Catch信息.

3.找到Catch信息表.

看到最后是catch的回调地址,里面则是catch的位置.

我们也能看到类型是什么.自己点击进去看看即可.

4.找到Catch函数地址,点击查看.

正确找到了Catch块了.

 

2.下半部分表格详解.

上面的部分是针对我们还原做的.下半部分主要就是找我要快速定位这个异常是谁接受的,那个catch块处理的.

第一个表  异常抛出表,重要字段catch数组表

第二个表是个数组表,一个throw对应多个catch,所以有个数组,这个数组是异常匹配表.表明了有多少个catch可以匹配.

一个记录个数,第二个成员则是二级指针.其内容是一个地址,其地址是一个cathc信息块的结构.

实战演练.

关于异常抛出表要怎么寻找,还记得的我们的高级代码有一个 throw吗?,其位置就是抛出异常表的位置.

关于抛出异常,我们需要了解的知识.当我们抛出一个常量或者变量的时候,不管怎么样,都会建立一个内存单元来接受我们抛出的值.所以别看你抛出的是常量,其实也成为内存单元了,也相当于一个变量了.

1.找到异常信息表.

最后一个成员是catch表.这个表保存了可以匹配的catch有多少个.

2.找到catch异常信息匹配表.

可以看出,值为1,下面是一个catch表,表明了有一个匹配的.

3.找到catch信息表.

通过异常信息表的第二个参数,也就是类型表,可以看是哪个匹配的.而且对类型表做一个引用,看谁引用类类型表,则能找到catch的函数地址.当然这一步是还原的动作.

4.找到类型表.对类型表做一个交叉引用.

如果引用显示的太少了,可以自己百度,  IDA引用数量调整.看怎么设置的,或者当前位置按  x键查看.

如果按x,跳过去的是try块表,你需要通过try块表可以直接查看.那个catch信息表.

 

今天讲的主要是表结构.如果想对每一个成员都了解,并且想知道怎么跟出来了. 可以看一下书籍  <<C++反汇编与逆向分析揭秘>>也就是一本小黄书.

 

发表于 2017-12-15 09:27 iBinary 阅读() 评论() 编辑 收藏

 

版权声明:本文为iBinary原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/iBinary/p/8041341.html

C++反汇编第六讲,认识C++中的Try catch语法,以及在反汇编中还原的更多相关文章

  1. 逆向知识十三讲,汇编中数组的表现形式,以及还原数组

                逆向知识十三讲,汇编中数组的表现形式,以及还原数组 讲解数组之前,要了解数组的特性   […]...

  2. 逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值.

            逆向知识十一讲,识别函数的调用约定,函数参数,函数返回值. 在反汇编中,我们常常的会看到各种的 […]...

  3. C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址

    C++反汇编第三讲,反汇编中识别虚表指针,以及指向的虚函数地址       C++反汇编第三讲,反汇编中识别虚 […]...

  4. C++反汇编第二讲,不同作用域下的构造和析构的识别

                   C++反汇编第二讲,不同作用域下的构造和析构的识别 目录大纲:   1.全局(静 […]...

  5. C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象

    C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象                 C++反汇编第 […]...

  6. 逆向知识第十二讲,识别全局变量,静态全局变量,局部静态变量,以及变量.

               逆向知识第十二讲,识别全局变量,静态全局变量,局部静态变量,以及变量. 一丶认识全局的 […]...

  7. 逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式

                    逆向知识第十四讲,(C语言完结)结构体在汇编中的表现形式 一丶了解什么是结构体 […]...

  8. C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.

    C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.         C++反汇编第 […]...

随机推荐

  1. 分享一些对IT人员非常好用的资源

    前言 分享一下本人工作至今整理的一些好用的资源,这些资源主要是一些工作和生活中用到的文档、软件和网站。 文档主 […]...

  2. tensorflow源码解析之common_runtime-executor-下

    tensorflow源码解析之common_runtime-executor-下 目录 核心概念 execut […]...

  3. 依赖倒转原则

    1.定义           依赖倒转原则(Dependence Inversion Principle ,D […]...

  4. win10安装Tensorflow

    win10安装Tensorflow 2018-01-12 12:55 by 一截生长, … 阅读, […]...

  5. Mybatis分页插件PageHelper使用

    MyBatis分页插件 Author:SimpleWu 在mybatis中我们需要实现分页功能,如果我们连接的 […]...

  6. Ubuntu18.04通过网线共享网络

    Ubuntu18.04通过网线共享网络 这几天要给实验室一个新电脑装系统,但是实验室路由器好像有点问题,所以决 […]...

  7. Dubbo源码笔记-服务注册

    Dubbo源码笔记-服务注册 今天来简单做一下Dubbo服务注册部分源码学习手记。 一、Dubbo配置解析 目 […]...

  8. JPA Hibernate应用实例

    1.配置文件:persistence.xml 1 <?xml version="1.0" encodin […]...

展开目录

目录导航