逆向C++(中文版).pdf
文本预览下载声明
逆向 C++
这些年来,逆向工程分析人员一直是凭借着汇编和 C的知识对大多数软件进行逆向工程的,
但是,现在随着越来越多的应用程序和恶意软件转而使用 C++语言进行开发,深入理解 C++
面向对象方式开发的软件的反汇编技术就显得越发的必要。本文试图通过分析在反汇编时如
何手工识别 C++对象,进而讨论如何自动完成这一分析过程最终介绍我们自己开发的自动化
工具,一步一步的帮助读者掌握逆向 C++程序的一些方法。
作者:Paul Vincent Sabanal
Mark Vincent Yason
译者:Hannibal509@
逆向C++1
I.引言和必要性 3
II.手工方法 3
A. 识别类及其构造函数3
B. 识别类10
1) 识别构造函数和析构函数10
2) 利用RTTI识别多态类12
C. 判别类与类之间的关系18
1.通过分析构造函数来分析类与类之间的关系18
2.通过RTTI分析类与类之间的关系19
D.辨别类的成员21
III.自动化 21
A. OOP_RE21
B. 为什么选择静态分析的方式?22
C. 自动化分析的策略22
通用算法22
1. 利用RTTI识别多态类23
2.利用虚函数表识别多态类(不使用RTTI)24
3.通过搜索构造/析构函数来识别类25
4.识别类与类之间的继承关系28
5.类的成员的识别29
D.显示结果29
1.注释各种结构体29
2.改进过的调用图表30
E.分析结果可视化:UML图30
IV.小结 32
I.引言和必要性
对于逆向工程分析人员来说,能从一个二进制可执行文件中识别出C++程序
的结构,并且能标识出各个主要的类,以及这些类之间的关系(继承、派生等)
是非常重要的。为了能做到这一点,逆向工程分析人员就必须要(1)能识别出
这些类(2)能识别出这些类之间的关系(3)识别出类中的各个成员。本文就是
要教大家能做到上述三点。首先我们先来讨论如何手工的分析一个C++程序编译
的二进制可执行文件,从中提取出有关的类的信息。然后我们再来讨论如何自动
化这一手工分析的过程。
当然,要做到这一点需要你花上不少的功夫学习很多技巧,但是为什么我们
要学习并掌握这些东西呢?我认为有下面这三点理由要求我们这么做:
1)用C++开发的恶意软件越来越多了
跟据我们分析恶意软件的经验,现在我们要分析的恶意软件中使用C++开发
的恶意软件越来越多了。你知道,把这些恶意软件扔到IDA里去进行静态分析的
难度会比较大,因为相对于C中的直接函数调用而言,静态分析C++中的虚函数
调用就比较困难,因为C++中的调用虚函数是采用间接调用的方式,有时你甚至
都能难确定某个函数是否被调用过。比如臭名昭著的 Agobot 病毒就是用 C++写
的,另外我自己的蜜罐里最近也捕获了一些新的C++写的恶意软件。
显示全部