1.6 反汇编静态分析工具IDA

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

本节将介绍辅助功能极为强大的反汇编静态分析工具IDA。它的图标是被称为“世界上第一位程序员”的Ada Lovelace的头像,可译为阿达。本书使用的IDA版本为7.0英文版。成功安装IDA后,会出现两个可执行程序图标,一个是黑白的阿达头像,另一个是在阿达头部写有“64”字样的图像,它们分别对应32位程序和64位程序的分析,本节分析的程序全部为32位。

IDA窗口中的工具条、菜单选项较多,初学IDA时只要掌握基本操作即可。IDA的常用快捷键使用说明如表1-3所示。

表1-3 IDA的常用快捷键使用说明

下面我们使用IDA静态分析1.1节的调试程序“Hello world”,通过实例进一步学习IDA的基本使用方法。

1. 加载分析文件

IDA加载分析文件后,会询问分析的方式。有3种分析方式供选择,如图1-29所示。

图1-29 IDA加载分析文件

  • Portable executable for 80386(PE)[pe.ldw]:分析文件为PE格式。
  • MS-DOS executable(EXE)[dos.ldw]:分析文件为DOS控制台下的一个文件。
  • Binary file:分析文件为二进制格式。

根据分析文件的格式进行选择,本示例为一个PE格式文件,故选择第一种分析方式,单击“确定”,分析结束后,IDA默认情况下会显示流程视图窗口。

2. 认识各视图功能

视图窗口如图1-30所示,说明如下。

图1-30 IDA的各视图窗口

  • IDA View-A:分析视图窗口,用于显示分析结果,可选用流程图或代码形式。
  • Hex View-1:二进制视图窗口,打开文件的二进制信息。
  • Exports:分析文件中的导出函数信息窗口。
  • Imports:分析文件中的导入函数信息窗口。
  • Names Window:名称窗口,分析文档用到的标称。
  • Functions Window:分析文件中的函数信息窗口。
  • Structures:添加结构体信息窗口。
  • Enums:添加枚举信息窗口。

3. 查看分析结果

“Hello world”反汇编分析示例如图1-31所示,图中为IDA分析后的反汇编代码,将其复制到汇编IDE中,只要稍加修改,就可以进行编译和连接。IDA的数据查询非常简单,只需要双击标号,即可跟踪到该数据的定义处。查看函数实现的方式也是如此,如果需要返回调用处,按Esc键即可返回。由于有IDA的帮助,将一个二进制文件还原成等价的C\C++代码的难度大大降低了。

图1-31 “Hello world”反汇编分析示例

4. 切换反汇编视图与流程视图

图1-31中的反汇编代码是从IDA的反汇编视图中提取的。IDA的默认视图为流程视图,需要进行转换。在函数体内,选择Text view。同理,如果要从反汇编视图切换回流程视图,可选择Graph view(流程视图),使分析程序的流程结构和工程量变得更加容易。

5. IDA函数名称识别

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

制作SIG文件有如下两个步骤(使用前须设置环境变量路径)。

(1)将每个OBJ或者LIB文件制作成PAT文件

OBJ文件中包含函数的名称和对应实现代码的二进制机器码,LIB文件包含OBJ文件(见图1-32)。

图1-32 LIBC.lib中包含的部分OBJ信息

在制作PAT文件的过程中,会提取出这些二进制机器码的特征,将二进制机器码的特征码及对应函数的名称保存在PAT文件中。特征码就好像是人的五官,我们可以通过五官特征来识别一个人,将函数比作独立的人,它们有各自不同的特点。如果某个文件拥有这些特征信息,便可确认此文件使用了这个OBJ,并可以借此识别函数名称。OBJ生成PAT时使用的是pcf.exe或者pelf.exe(见随书文件1.2[1])。其中pcf.exe用于制作COFF文件格式(.obj、.lib库文件)、pelf用于制作ELF文件格式(.o、.a库文件)。在控制台下使用如下pcf命令。

pcf [Obj name].obj
pcf [Lib name].lib

指令说明如下。

  • [Obj name]:OBJ文件名称。
  • [Lib name]:LIB文件名称。

(2)多PAT文件联合编译SIG文件

SIG文件是由一个或多个PAT文件编译而成的。在生成SIG文件的过程中,如果多个PAT文件中有两个或两个以上的函数特征码相同,将会过滤掉重复特征,只保存一份。在控制台下使用sigmake.exe将PAT文件编译成SIG文件,格式如下所示。

sigmake [Pat name].pat [Sig name].sig

指令说明如下。

  • [Pat name]:PAT文件名称。当多个PAT文件参与编译时,用*代替名称,将所选目录下所有后缀名为pat的文件编译为一个后缀名为sic的文件。
  • [Sig name]:编译后生成的SIG文件的名称。

在制作SIG文件的过程中,如果包含的LIB文件过多,如何快速将所有LIB文件生成SIG文件呢?我们可根据SIG文件的制作流程编写程序,将LIB文件逐个提取出来,生成对应的PAT文件,再将所有PAT文件编译为SIG文件;也可以编写批处理文件快速生成SIG文件。将生成后的SIG文件放置在IDA的安装目录SIG文件夹下。使用快捷键Shift+F5添加SIG文件到分析工程中,如图1-33所示。

图1-33 SIG文件的签名窗口

图1-33显示了当前分析工程中使用到的SIG文件。使用Insert键可加载SIG文件用于此工程;也可以在视图中单击Apply new signature添加SIG文件。SIG解析前后对比如图1-34所示。

图1-34 SIG解析对比

通过图1-34可知,IDA已经成功解析出函数sub_40505A对应名称为__cexit,同时将参数解析出来。有了SIG文件的帮助,分析工作将更为简单。SIG文件制作批处理文件的过程如代码清单1-1所示。

代码清单1-1 SIG文件制作批处理文件的过程

if %1==""  goto end
for %%i in (*.lib,*.obj) do (pcf %%i)
sigmake -r *.pat %1.sig
del *.pat
:end

代码清单1-1说明了如下几个问题。

  • if %1=="" goto end检查命令行参数。
  • 在当前目录下循环遍历所有LIB和OBJ文件,并逐一通过PCF转换成对应的PAT文件。
  • 通过sigmake工具将所有PAT文件打包为一个SIG文件。
  • 删除生成的所有PAT文件。

将代码清单1-1保存为“lib2sig.bat”,放置在自己创建的目录下,将第三方库或者编译器的库复制到此目录下,在控制台下使用此批处理文件,“lib2sig.bat”的使用方法如下。

lib2sig  [ 生成SIG文件名称 ]

设置环境变量时,需要获取pcf.exe、sigmake.exe的路径,即依次选择“我的电脑”→“属性”→“高级”→“环境变量”→“新建系统变量”→“变量名path”→“变量值”。

在使用这些指令的过程中,如果出现“不是内部或外部命令,也不是可运行的程序”的提示,请检查环境变量是否设置正确。每次修改pcf.exe、sigmake.exe的路径时,都需要重新设置环境变量,否则只能在对应目录中使用它们。读者可以使用此批处理文件将编译器自带的所有32位库和64位库分别制作成SIG文件。


[1]登录www.hzbook.com下载随书文件。