恶意代码分析实战_05 IDA Pro

0. 概述

交互式反汇编器专业版(IDA Pro)是一款由Hey-Rays发布的极其强大的反汇编器。尽管IDA Pro并不是唯一的反汇编器,但它是许多恶意代码分析师、逆向工程师和漏洞分析师的首选。

有两个商业可用的IDA Pro版本。这两个版本都支持x86架构,高级版比标准版支持更多的处理器,最值得称道的是x64。IDA Pro也支持多种文件格式,比如可移植可执行文件(PE)、通用对象文件(COFF)、可执行与链接格式(ELF)。这里,我们主要围绕x86、x64架构和PE文件格式就行探讨。

IDA Pro除了反汇编整个程序外还可以执行查找函数、栈分析、本地变量标识等更多的任务。IDA Pro在它的快速库标记和识别技术(FLIRT)中包含了可扩展的代码特征,这让它能够识别并标记一个被反汇编的函数,尤其是编译器添加的库代码。

IDA Pro生来就是交互式的,并且反汇编过程所有属性都可用被修改、操作、重新安排或重新定义。IDA Pro最大的优势是它具有保存分析过程的能力,你可以添加注释、标记数据及函数名,然后将你的工作保存到一个IDA Pro数据库(idb)中,留作下次使用。IDA Pro也对插件提供了鲁棒的支持,这样你可用编写自己的扩展,或是利用别人的成果。

1. 加载一个可执行文件

当你加载一个可执行文件时,IDA Pro会尝试识别这个文件的格式以及处理器架构。本例中,文件是Intel x86架构上运行的PE格式文件

当加载一个文件到IDA Pro时,IDA Pro像操作系统加载器一样将文件映射到内存中。要让IDA Pro将文件作为一个原始二进制文件进行反汇编,选择界面顶部的二进制选项。这个选项是非常有用的,因为恶意代码有时会带有shellcode、其他数据、加密参数。甚至在合法的PE文件中带有可执行文件,并且当包含这些附加数据的恶意代码在Windows上运行或被加载到IDA Pro时,它并不会被加载到内存中。

PE文件被编译加载到内存中一个首选的基地址,如果Windows加载器无法将它加载到它的首选地址(因为这个地址已经被使用),加载器会执行一个叫做基地址重定向的操作。这在DLL中经常发生,因为它们经常被加载到与它们首选地址不同的位置。如果你遇到进程中加载的一个DLL的位置与你在IDA Pro中看到的不一样,这可能是这个文件被基地址重定向的结果。这种情况下,需要选择手动加载来指定文件要加载的新的虚拟基地址。

图1. 在IDA Pro中加载一个文件

在默认情况下,IDA Pro的反汇编代码不包含PE头或资源节,因为这些地方经常被恶意代码用来隐藏恶意指令。如果你指定手动加载,IDA Pro会询问你是否要逐个地加载每一个节。

2. IDA Pro接口

加载一个程序到IDA Pro中后,你会看到反汇编窗口。这里是你操作和分析二进制地主要位置,并且它也是反汇编代码所在的地方。

2.1 反汇编窗口模式

图形模式

在图形模式中,箭头的颜色和方向帮助你在分析时显示程序的流程。箭头的颜色告诉你这条路径是否是基于一个反汇编器的特定决策:红色表示一个条件跳转每一被采用,绿色表示这个条件跳转被采用,蓝色则便是一个无条件跳转被采用。箭头的方向显示了程序的流程,向上的箭头通常表示一个循环条件。在反汇编窗口中图形模式的高亮文本功能会高亮显示该文本的每个实例。

图2. 在IDA Pro反汇编窗口的图形模式

文本模式

反汇编窗口的文本模式是一个比较传统的视图模式,并且你必须使用它来查看一个二进制的数据区。文本模式显示了节名(.text)和内存地址,在这个节中操作码会驻留在内存中。

文本模式显示的左侧部分被称为箭头窗口,显示了程序的非线性流程。实现标记了无条件跳转,虚线标记了条件跳转,朝上的箭头表示一个循环。除此之外,IDA Pro会自动生成一些注释。

图3. 在IDA Pro反汇编窗口的文本模式

2.2 对分析有用的窗口

其他一些IDA Pro窗口高亮显示了一个可执行文件中的特定条目。下面这些是对我们分析最有帮助的。

  • 函数窗口:列举可执行文件中的所有函数,并显示每个函数的长度。你可以根据函数长度来排序,并过滤出哪些规模庞大复杂的可能很有意思的函数,并排除进程中规模很小的函数。这个窗口也对每一个函数关联了一些标志(F、L、S等),这其中最有用的L,指明库函数。L标志可以在分析时节省你很多时间,因为你可以识别并跳过这些编译器生成的函数。
  • 命名窗口:列举每个地址的名字,包括函数、命名代码、命名数据和字符串。
  • 字符串窗口:显示所有的字符串。默认情况下,这个列表只显示长度超过5个字符的ASCII字符串。
  • 导入表窗口:列举一个文件的所有导入函数。
  • 导出表窗口:列举一个文件的所有导出函数。
  • 结构窗口:列举所有活跃数据结构的布局。这个窗口也提供用自己创建的数据结构作为内存布局模板的能力。

这些窗口还提供了交叉引用的特性,这个特性在定位有意义代码时十分有用。例如,要找到调用一个导入函数的所有代码位置,你可以使用导入窗口,双击感兴趣的导入函数,然后使用交叉引用特性,来定位代码清单中的导入调用。

2.3 返回到默认视图

IDA Pro接口如此丰富,以至于在按一些键或单击一些项之后,你可能发现它无法进行进一步浏览了。要返回到默认视图,选择窗口→重置窗口。需要注意,选择这个选项不会撤销你已经完成的任何标记或者反汇编工作,它只会简单地恢复任何窗口和GUI元素到它们的默认位置。

2.4 导航IDA Pro

IDA Pro有很多浏览技巧,很多窗口都链接到反汇编窗口。例如,双击一个导入表窗口或字符串窗口中的项,会把你直接带到这个项的使用位置。

使用链接和交叉引用

另一种浏览IDA Pro的方式,是使用反汇编窗口内的链接。双击这些链接中的任何一个,都会在反汇编窗口中显示目标的位置。常见的链接类型包括:

  • 子链接是一个函数开始的链接
  • 本地链接是跳转指令目的地址的链接
  • 偏移链接是内存偏移的链接

浏览历史

IDA Pro的向前和向后按钮,使得你再历史视图中来回移动变得简单,就像你会使用浏览器在网页访问历史中来回移动一样。每一次你在反汇编窗口中浏览到一个新位置,那个位置就会被添加到你的浏览历史中。

导航栏

在工具栏底部的水平色带是导航栏,它展示了一个以颜色为代号被加载二进制地址空间的线性视图。这些颜色的含义如下:

  • 浅蓝色是被FLIRT识别的库代码
  • 红色是编译器生成的代码
  • 深蓝色是用户编写的代码

跳转到位置

要跳转到任意虚拟内存地址,在反汇编窗口中按键盘上的G键。此时会出现一个对话框询问要跳转的虚拟内存地址或命名的位置。

要跳转到一个原始的文件偏移,选择Jump→Jump to File Offset。例如,你正在十六进制编辑器中查看一个PE文件,并且你看到了一些有意思的东西,比如一个字符串或shellcode,因为当文件被加载到IDA Pro中时,它会被操作系统加载器加载一样被映射,因此你可以使用这个特性来达到原始偏移。

2.5 搜索

从顶部的菜单中选择搜索,会在反汇编窗口中显示很多用来移动光标的选项:

  • Next Code:移动光标到包含你所指定的指令的下一个位置。
  • Text:在整个反汇编窗口中搜索一个指定的字符串。
  • Sequence of Bytes:在十六进制视图窗口中对一个特定字节序列执行二进制搜索。

3. 使用交叉引用

交叉引用在IDA Pro中被称为xref,可以告诉你一个函数在何处被调用,或者一个字符串在何处被使用。如果你识别了一个有用的函数,并且想知道它被调用时用了哪些参数,你可以使用一个交叉引用,来快速浏览这些参数被放在栈上的什么位置。基于交叉引用关系也可以生成有趣的图形,对于分析来说很有帮助。

3.1 代码交叉引用

代码交叉引用告诉我们函数在内存中被调用的位置。默认情况下,IDA Pro只显示少数几个交叉引用,尽管有时有很多调用发生。要查看一个函数的所有交叉引用,单击函数名并按X键。弹出的窗口会列举整个函数被调用的所有位置。

3.2 数据交叉引用

数据交叉引用被用来追踪一个二进制文件中的数据访问。数据引用可以通过内存引用关联代码中引用数据的任意一个字节。如果你看见一个有意思的字符串,使用IDA Pro的交叉引用通信,来查看这个字符串具体在哪里以及如何在代码中被使用。

4. 分析函数

IDA Pro的一个最强大的功能是识别函数、标记函数,并且划分出局部变量和参数。IDA Pro会告诉我们栈帧如何在函数中使用,这意味着整个函数中局部变量和参数都通过寄存器来引用。IDA Pro已经将局部变量用前缀var_进行标记,而参数用前缀arg_进行标记,将局部变量和参数用相对偏移量作为后缀来进行命名。

图4. 函数和栈的例子

5. 使用图形选项

IDA Pro支持5中图形选项,可以通过视图→图表来进行访问,这些图标包括:

  • 对当前函数创建一个流程图
  • 对整个程序创建函数调用图
  • 对当前选择的交叉引用,生成所有指向这一引用的链接图
  • 从当前选择的符号开始,生成所有交叉引用的链接图
  • 创建一个用户指定的交叉引用图

6. 增强反汇编

IDA Pro的一个最好的特性是它运行你修改它的反汇编,来达到你的目标。你做的修改能极大地增加你能分析一个二进制文件的速度。

6.1 重命名位置

IDA pro在自动化命名虚拟地址和栈变量方面做的很好,但是为了让它们更有意义,你可以修改这些名字。自动化生成的名字不能为你提供很多有用的信息,通过重命名可以提供更多的有用信息,避免重复的逆向工程。

6.2 注释

IDA Pro让你可以在整个反汇编过程中手工嵌入注释,并且它也会自动地添加许多注释。要添加你自己的注释,将光标放在反汇编的某行上,并按冒号(:)键会带起一个注释窗口。要插入一个跨反汇编窗口,并且在任何时候只要存在对你添加注释的地址的交叉引用就重复回显的注释,按分号(;)键。

6.3 格式化操作数

反汇编时,IDA Pro会决定对反汇编的每一条指令的操作数如何进行格式化。除非有上下文,否则通常情况下,被现实的数据会被格式化为十六进制的值。IDA Pro允许你修改这个数据来使它更容易理解。

6.4 使用名命的常量

恶意代码编写者经常在它们的代码中使用命名常量,命名常量为程序员提供了一个简单易记的名字,但是在二进制文件中它们用一个整数来存储。不幸的是,一旦编译器对源代码编译完成,要判断源代码使用的是一个常量符号还是一个数字就不可能了。

有时,你要查看的某个标准符号常量不会现实,这时你需要手动加载有关的类型库。要这样做,选择视图→子视图→类型库。通常mssdk和vc6win会自动被加载,但如果没有的话,你可以手动加载它们。要获取本地API的符号常量,加载ntapi。同理,分析一个Linux二进制时,你可能需要手动加载gnuunx库。

6.5 重新定义代码和数据

当IDA Pro对一个程序进行初始反汇编时,字节偶尔会被错误地分类,代码可能被定义为数据,数据也可能被定义为代码。在反汇编窗口中最常用地重新定义代码地方式,是按U键来取消函数、代码或数据的定义。当你取消代码定义时,后续字节会被重新格式化为一个原始字节列表。

可以按C键定义原始字节为代码,按D键定义原始字节为数据,按A键定义原始数据为ASCII字符串。

7. 使用IDA插件

你可以用多种方法来扩展IDA Pro的功能,通常通过它的脚本功能。脚本的潜力在使用能力是无限的,从最简单的标记代码,到像在IDA Pro数据库文件之间指向差异比较这样复杂的功能。

7.1 使用IDC脚本

IDA Pro内建了一个被称为IDC的脚本语言,这个脚本语言的历史早于像Python或Ruby这些广泛普及的脚本语言。在IDA安装目录中的IDC子目录包中,包含了多个IDA Pro用来分析反汇编文本的IDC脚本示例。

7.2 使用IDAPython

IDAPython已经完全被集成到当前版本的IDA Pro中了,支持Python编程为二进制分析带来了遍历。IDAPython提供了一大堆IDA Pro的SDK功能,提供了比IDC强大许多的脚本化功能。IDAPython提供了3个模块来访问IDA  API(idaapi)、IDC接口(idc)以及IDAPython工具函数(idautils)。

7.3 使用商用插件

掌握使用IDA Pro的扎实经验之后,你可以考虑购买一些商业插件,如Hex-Ray反编译器和zynamics Bindiff等。Hex-Rays反编译器是一个有用的插件,它将IDA Pro反汇编转换为可读的类C伪代码,通过ctrl+F5生成伪代码。

zynamics BinDiff是比较两个IDA Pro数据库的有用工具。它可以让你找出恶意代码变种之间的不同点。在分析两个恶意代码时,它还提供了相似度评分的能力。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值