IDA静态分析介绍

http://gslab.qq.com/article-156-1.html

工欲善其事,必先利其器”。IDA Pro就是逆向分析人员手中最锋利的武器之一,在开始学习逆向分析时有必要先掌握IDA Pro工具的使用。
 

一、IDA Pro简介

IDA Pro全称是交互式反汇编器专业版(Interactive Disassembler Professional),简称IDA,它是一种典型的递归下降反汇编器。IDA并非免费软件,但Hex-Rays公司提供了一个功能有限的免费版本[1],该免费版本为IDA 5.0(当前版本为6.8)的简化版,用户可以通过该免费版本大致了解IDA的基本功能。

下面章节将结合一个简单的程序实例来讲解IDA静态分析,代码如下所示,将该程序编译生成共享库文件libDebugTest.so。


二、IDA PRO界面窗口

2.1 启动IDA

启动IDA后会显示如上图所示的对话框,用户可以选择点击New按钮打开一个新的文件开始分析过程,也可以点击Go按钮,IDA会打开一个空白的工作区,将需要分析的文件拖放进来打开或通过菜单栏的File->Open打开。除此之外,在对话框下方还会显示最近打开的文件,点击Previous按钮会直接打开最近一次使用IDA加载的文件。

使用IDA打开需被分析的文件后,会出现如下图所示的加载对话框,IDA会自动识别打开的文件格式,一般情况下保持默认选项即可。打开被分析文件后会在原目录下生成四个文件,这是IDA创建的数据库文件,扩展名分别为.id0、.id1、.nam与.til(在6.5版本后新增了扩展名为.id2的文件),这些文件均为IDA专用,在IDA环境以外很难对它们编辑。

2.2 IDA界面

IDA的主工作界面如下图所示,笔者将IDA的主界面分成了六个部分,下面将对每个部分进行单独地介绍。当然这里读者可能会注意到最上方的菜单栏和最下方的输入框,由于篇幅所限菜单栏中的菜单项在本文中不作详细介绍,详细使用可以参考IDA的官方文档[2]。最下方的输入框用于执行IDC脚本命令,对IDC脚本感兴趣的读者可以学习IDA提供的IDC语法文档[3]

 工具栏包括一些分析过程中经常使用的工具,一般情况下基本工具栏能满足用户的需要,当然还可以通过菜单栏的View->Toolbats->Advanced mode选项打开高级模式工具栏,高级模式工具栏包含更加丰富的工具。

② 导航栏是被加载文件地址空间的线性视图,不同的颜色代表不同类型的文件内容,在导航栏下方列出了不同颜色所代表的文件内容。可以放大或缩小导航带,点击导航栏可以在反汇编窗口或十六进制窗口中跳转到对应选中的位置。

③ 反汇编窗口也称IDA View窗口,它显示了被加载文件的反汇编代码,是我们静态分析过程中最主要的窗口。该窗口有两种显示格式,分别为文本视图和图形视图。很多时候我们会根据分析的需要在文本视图和图形视图之间切换。

文本视图如下所示,左边部分显示了所在区域名称+文件地址,例如光标所在处为.text:000000BDC,表示地址0x00000BDC处代码位于.text段,右边部分为反汇编代码或者数据内容。

图形视图能够清晰地显示一个函数的控制流程,可以通过CTRL +鼠标滑轮来缩放图形显示的大小。但对于大型或者复杂的函数可能会导致图形视图变得极为杂乱,此时可以通过IDA在图形视图下默认打开的图形概况窗口来定位需要查看的图形区域。

④ 标签栏主要用于切换窗口,在笔者使用的版本(v6.5)中IDA默认打开的是反汇编窗口、十六进制窗口、导出函数窗口、导入函数窗口、结构体窗口以及联合体窗口,除了反汇编窗口外,其他次要显示窗口在IDA分析过程中同样具有重要的作用。如下图所示,用户还可以通过菜单栏的View->Open Subviews选项打开需要的其他窗口。下面将逐一介绍在静态分析过程中经常使用的一些次要显示窗口。

Hex_View窗口也称十六进制窗口,相当于一个十六进制的编辑器,可以直接对代码和数据进行修改,用户可以同时打开多个十六进制窗口。

Exports窗口为导出函数窗口,列出了被载入文件的所有导出函数,若载入文件没有抹去符号,很多时候用户可以直接在导出函数列表中找到入口函数,如下图所示,可以在导出函数窗口中定位到main函数的地址为0x00000BDC。

Imports窗口为导入函数窗口,它会列出被分析的二进制文件导入的所有函数。

Structures窗口,在分析阶段,IDA会查询它的函数类型签名扩展库,设法将函数的参数类型和程序使用的内存匹配起来。但在实际分析过程中经常会遇到IDA无法自动识别的数据结构,此时就需要用户自己判断内存结构的类型,若该数据为结构体,可以在Structures窗口创建一个自定义结构体,然后将对应内存数据解析成该结构体,方便后续地分析。如下图所示为Structures窗口中列出的一些快捷键用来创建结构体。

在创建结构体后,可以在需要应用该结构体的数据地址处,使用ALT + Q快捷键列出 创建的自定义的结构体,如下图所示,选择其中一个结构体,可将对应的数据解析成结 构体,并将所有相关内存引用重新格式化成结构体引用。更加详细地创建和使用结构体 的方法可以参见《IDA Pro权威指南(第2版)》的第8章。

Enums 窗口,枚举窗口与结构体窗口类似,用户同样可以创建自定义联合体。如下图所示为Enums 窗口中列出的一些快捷键用来创建联合体。

Strings窗口显示了从被分析的二进制文件中提取出的字符串以及字符串所在的地址。在静态分析过程中,分析人员经常使用的一种方法就是字符串定位法,通过在Strings窗口中搜索一些特定的字符串,然后通过字符串的引用能够快速定位到关键的代码逻辑。

⑤ 函数窗口列举出了IDA识别出的所有函数,双击选定函数条目,反汇编窗口会跳转到选定函数所在的起始地址处,在分析过程中能够快速定位到指定函数。

⑥ 输出信息窗口,输出窗口将输出你所执行的各种操作的状态。

2.3 关闭IDA

在完全关闭IDA程序或者打开另外的数据库时,IDA都会弹出下图所示的保存数据库的对话框。

若勾选Pack database (Store),会将之前分析过程中生成的四个数据库组件文件打包生成一个idb文件,并且删除四个数据库组件文件,若原目录下已有该分析文件对应的idb文件,会直接覆盖。在下次继续分析该文件时可以直接用IDA打开该idb文件。

当用户不需要保存数据库时,可以勾选DONT SAVE the database选项,此时仍然会删除四个数据库组件文件,但不会生成或者覆盖idb文件。

三、IDA Pro常用功能及快捷键

IDA工具提供了丰富的快捷键功能,在使用IDA进行静态分析时,熟悉一些常用的快捷键能提高我们分析的效率。下面将简单介绍静态分析工作中经常使用的快捷键,更多快捷键功能可以参考官方提供的文档[4]

空格键 在反汇编窗口中用于切换文本视图和图形视图。

Esc 在反汇编窗口中使用为后退到上个操作的地址处。

G键 跳转到指定地址,在反汇编窗口中单击G键会弹出一个输入对话框,如下图所示,可以在输入框中输入地址或者符号,当前光标会跳转到指定的地址处。

N键 可以对符号进行重命名,如下图所示为对CalFunc函数重命名。在分析没有symbol的二进制文件过程中,对函数或变量重命名有助于更加直观和清晰地了解其作用。

冒号键:和分号键; 在光标所在处添加常规注释和可重复注释。在分析过程中给汇编程序添加注释是一个良好的习惯,有助于更好地理解和掌握程序,且以后重新分析程序时能够根据注释快速回忆已分析的内容。

ALT + M在当前光标所在地址处添加标签,如下图所示。

CTRL + M 列举出当前已经添加的标签,如下图所示,笔者使用ALT + M快捷键分别在main函数和CalFunc函数开始处添加了两个标签,双击栏目可以快速跳转到添加标签的地址处。在分析过程中可以在重要位置添加标签,跳转到其他地址后通过设置的标签快速跳转回来。

CTRL + S 列举出二进制程序的段的开始地址、结束地址、权限等信息,如下图所示,.text段的起始地址为0x00000BCC,结束地址为0x00002128。双击栏目可以跳转到对应段的起始地址,在分析过程中能够快速地定位到段的起始地址。

代码数据切换,当IDA自动识别的内容无法满足要求时,用户可以自己控制IDA对文件内容的解析。快捷键C表示将光标所在地址处的内容解析成代码,快捷键D表示解析成数据,快捷键A表示解析成ascll码字符串,快捷键U表示解析成未定义内容。

X 交叉引用。IDA提供了大量显示和访问交叉引用数据的机制,它以更加直观的方式显示代码和数据之间的关系。如下图所示,为对CalFunc函数的交叉引用,可以看到在main函数+8的地方调用了CalFunc函数。

F5 能够将ARM汇编或X86汇编代码生成类似C语言的伪代码,如下图所示为使用F5生成CalFunc的伪代码,基本还原了源代码。但当分析过程中遇到一些复杂的函数,此时F5生成的伪代码可能会存在一些问题,建议结合汇编代码进行阅读和分析。

搜索功能 IDA提供了丰富地搜索功能,如下图所示,在菜单栏Search选项下,可以在数据库中搜索文本、立即数、十六进制字节序列等。

其中Alt + T快捷键可以在数据库中搜索文本字符串或正则表达式格式的字符串。

 

Alt + B 快捷键用于搜索十六进制字节序列,通常在分析过程中可以用来搜索opcode。

四、总结

IDA Pro是非常复杂的软件,如果想要继续深入一步学习,推荐阅读Chris Eagle撰写,石华耀与段桂菊翻译的《IDA PRO权威指南》(第二版)。当然除了理论上的学习,最重要的就是多加实践,在实践中逐渐加深对IDA工具的理解。

发表评论