所谓“静态分析”,是相对于前面提到的“动态分析”而言的。在“动态分析”过程中,调试器加载程序,并以调试模式运行起来,分析者可以在程序的执行过程中观察程序的执行流程和计算记过。但是,在实际分析中,很多场合不方便运行目标,比如软件的某一模块(无法单独运行)、病毒程序、设备环境不兼容导致的无法运行……那么,在这个时候,需要直接把程序的二进制代码翻译程汇编语言,方便程序员阅读。想这样由目标软件的二进制代码到汇编代码的翻译过程,我们称之为”反汇编”。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”程序反汇编分析示例如图所示。
IDA的数据查询非常简单,只需要双击标号,即可跟踪到该数据的定义处。查看函数实现的方式也是如此,比如,如果需要返回调用处,只需按Esc键即可返回。有了IDA的帮助,使得将一个二进制文件还原成等价的C\C++代码的难度大大降低。通过图示我们可以看到IDA并没有识别出整个”第一个Win32程序”字符串,而是只显示”第一?”我们双击跟进这个字符串,找到一连串的db “…”,这就是我们要找的整个字符串,用鼠标选中这些内容,按a键(或鼠标右键里的<s”第一个Win32程序”>选项)。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文件到分析工程中。
另外,书中还给出一段开源的反汇编引擎的代码,用于介绍反汇编引擎的工作原理。这些内容过于理论,目前我们只要会用这些工具就好,所以这里就不贴出了,感兴趣的朋友可以去看原书。
参考:
- 《ida pro代码**揭秘》
- 《c++反汇编与逆向分析技术揭秘》
- 《ida pro权威指南》
- 《加密与解密》
- 《逆向:****揭秘》
- C++反汇编-继承和多重继承
- android逆向之旅--《动态方式**apk IDA调试so文件》
- 使用IDA初步调试一个C/C++的exe文件
- IDA调试so文件
转载地址: http://blog.csdn.net/kyt511/article/details/44889327