c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA

时间:2023-02-11 23:33:02

        所谓“静态分析”,是相对于前面提到的“动态分析”而言的。在“动态分析”过程中,调试器加载程序,并以调试模式运行起来,分析者可以在程序的执行过程中观察程序的执行流程和计算记过。但是,在实际分析中,很多场合不方便运行目标,比如软件的某一模块(无法单独运行)、病毒程序、设备环境不兼容导致的无法运行……那么,在这个时候,需要直接把程序的二进制代码翻译程汇编语言,方便程序员阅读。想这样由目标软件的二进制代码到汇编代码的翻译过程,我们称之为”反汇编”。OllyDBG也有反汇编功能。但OllyDBG是调试工具,其反汇编辅助分析功能有限,不适合静态分析。

       下面介绍辅助功能极其强大的反汇编静态分析工具—IDA。据说它的图标是被称为“世界上第一位程序员”的Ada Lovelace的头像,中文名为阿达。书中使用IDA版本为5.5英文版。为了减少学习的干扰因素,我也使用的5.5英文版。成功安装IDA后,会出现两个可执行程序图标,一个是黑白的阿达头像,另一个是在阿达头部写有”64”字样的头像,分别对应32位和64位程序的分析。

       IDA快捷键使用说明

编号       快捷键    功能说明

01   Enter            跟进函数实现,查看标号对应的地址

02   Esc         返回跟进处

03   A            解释光标处的地址为一个字符串的首地址

04   B            十六进制数与二进制数转换

05   C            解释光标处的地址为一条指令

06   D           解释光标出的地址为数据,每按一次将会转换这个地址的数据长度

07   G            快速查找到对应地址

08   H           十六进制与十进制转换

09   K            将数据解释为栈变量

10   ;             添加注释

11   M           解释为枚举成员

12   N           重新命名

13   O           解释地址为数据段偏移量,用于字符串标号

14   T            解释数据为一个结构体成员

15   X            转换视图到交叉参考模式

16   Shift+F9       添加结构体

 

       我们可以通过分析上一节中的”HelloWorld”程序来进一步学习IDA的基本使用方法。

(1)加载分析文件

IDA加载分析文件后,会询问分析的方式,有3中分析方案供选择

       1>  Portableexecutable for 80386(PE)[pe.ldw]:分析文件为一个PE格式的文件(想要了解PE文件格式可以去看《程序员的自我修养》这本书,很经典)

       2>  MS-DOSexecuteble(EXE)[dos.ldw]:分析文件为DOS控制台下的一个文件

       3>  Binaryfile:分析一个二进制文件

(2)各视图功能

       1>IDAView-A:分析视图窗口,用于显示分析结果,可选用流程图或代码形式

       2>HexView-A:二进制视图窗口,打开一个文件的二进制信息。

3>Exports:分析文件中的导出函数信息窗口。

4>  Imports:分析文件中的导入函数信息窗口。

5>  Names:名称窗口,分析文档中用到的标号名称

6>  Functions:分析文件中的函数信息窗口。

7>  Structures:添加结构体信息窗口。

8>  Enums:添加枚举信息窗口。

(3)查看分析结果

        上一节中的“Hello world”程序反汇编分析示例如图所示。

c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA

IDA的数据查询非常简单,只需要双击标号,即可跟踪到该数据的定义处。查看函数实现的方式也是如此,比如,如果需要返回调用处,只需按Esc键即可返回。有了IDA的帮助,使得将一个二进制文件还原成等价的C\C++代码的难度大大降低。通过图示我们可以看到IDA并没有识别出整个”第一个Win32程序”字符串,而是只显示”第一?”我们双击跟进这个字符串,找到一连串的db “…”,这就是我们要找的整个字符串,用鼠标选中这些内容,按a键(或鼠标右键里的<s”第一个Win32程序”>选项)。IDA立即把这些数据理解为一整个字符串,很方便有木有。

c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA


c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA



c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA


(4)切换反汇编视图和流程视图

       反汇编代码是从IDA的反汇编视图中提取的。在函数体内,右击选择Text view进入反汇编视图,右击选择Graph view进入流程视图。流程视图使得程序的流程结构和工作量的分析变得异常容易。

(5)IDA函数名称的识别

       IDA可以识别出函数MessageBoxA及其各参数的信息。IDA是通过SIG文件来识别已知的函数信息。安装IDA的时候,已将常用库制作成SIG文件放置在IDA安装目录中的SIG文件夹下。利用此功能可识别出第三方提供的库函数,从而简化分析流程。

       附:SIG文件制作步骤(使用前需要设置环境变量).

1>  从LIB文件提取出OBJ文件:可以在控制台下使用link.exe链接器将从LIB文件生成OBJ文件。在控制台下使用link命令,link –lib /extract:[File name][Libname].lib 

2>  将每个OBJ文件制作程PAT文件:OBJ文件中包含函数的名称和对应代码的二进制机器码。在PAT文件的制作过程中,会提取出这些二进制机器码的特征,并将二进制机器码的特征码及对应函数的名称保存到PAT文件中。OBJ生成PAT时使用的pcf.exe。在控制台下使用pcf命令,pcf  [Obj name].obj

3>  多个PAT文件联合编译SIG文件:一个SIG文件是由一个或多个PAT文件编译而成的。在生成SIG的过程中,如果多个PAT文件中两个或两个以上的函数特征码相同,将会过滤掉重复特征,只保存一份。在控制台下使用sigmake.exe将PAT文件编译成为SIG文件, sigmake [Pat name].pat [Sig name].sig(注:可用*代替名称,将编译该目录想所有后缀为.pat的文件).

4>  将生成后的SIG文件放置在IDA的安装目录SIG文件夹下。使用快捷键Shift+F5添加SIG文件到分析工程中。

另外,书中还给出一段开源的反汇编引擎的代码,用于介绍反汇编引擎的工作原理。这些内容过于理论,目前我们只要会用这些工具就好,所以这里就不贴出了,感兴趣的朋友可以去看原书。