4.2 IDA 数据库文件

选择加载选项,单击 OK按钮关闭对话框后,加载文件的工作才真正开始。这时,IDA 的任务是将选定的可执行文件加载到内存中,并对相关部分进行分析。随后,IDA 会创建一个数据库,其组件分别保存在4 个文件中,这些文件的名称与选定的可执行文件的名称相同,扩展名分别为.id0 、.id1 、.nam 和.til。.id0 文件是一个二叉树形式的数据库,.id1 文件包含描述每个程序字节的标记。.nam 文件包含与IDA 的Names 窗口(将在第 5 章详细介绍)中显示的给定程序位置有关的索引信息。最后,.til文件用于存储与一个给定数据库的本地类型定义有关的信息。这些文件的格式为 IDA 专用,在 IDA 环境以外很难对它们编辑。

为了方便,在你关闭当前项目时,这4 个文件将被存档,你还可以选择将它们压缩成一个IDB文件。通常,人们说到 IDA 数据库时实际上指的是 IDB 文件。一个未压缩的数据库文件的大小一般是最初输入的二进制文件的 10 倍。如果数据库正常关闭,你绝不会在工作目录中看到扩展名为.id0 、.id1 、.nam 或.til 的文件。如果工作目录中存在这些文件,则往往表示数据库被意外关闭(例如,IDA 崩溃),这时数据库可能被损坏。

加载器警告

加载器开始分析文件后,用户可能需要输入额外的信息,以完成加载过程。例如,使用PDB 调试信息创建的 PE文件。如果 IDA 发现一个程序数据库(Program Database, PDB )文件,它会显示以下消息,询问你是否希望定位并处理相应的 PDB 文件。

“IDA Pro 已确认输入文件链接有调试信息,你希望在本地符号存储区及 Microsoft Symbol Server 中寻找相应的 PDB 文件吗?”

另外,在分析恶意软件等模糊程序时,加载器也会生成一些消息。通常,模糊技术并不严格遵循文件格式规范,如果加载器希望处理结构完整的文件,这时就会造成问题。为此,PE加载器会对导入表进行某种形式的验证,如果发现导入表没有根据约定进行格式化,IDA 将显示以下消息。

导入的文件似乎遭到破坏。这说明该文件可能被压缩或经过修改,以阻止人们对其分析。如果你希望看到原始的导入文件,请取消选择 make imports section(创建导入节)复选框,重新加载该文件。

我们将在第 21 章讨论这些错误示例及其处理方法。

值得注意的是,一旦IDA 为某个可执行文件创建数据库,它就不再需要访问这个可执行文件,除非你希望使用IDA 的集成调试器调试这个可执行文件本身。从安全角度看,这是一项有用的功能。例如,在分析一个恶意软件样本时,只需在分析人员之间传递相关数据库,而不必传递可执行的恶意文件本身。使用IDA 数据库作为恶意软件的攻击向量,这样的案例尚未出现。

就本质而言,IDA 不过是一个数据库应用程序。分析可执行文件时,IDA 会自动创建和填充新的数据库。IDA 提供的各种显示不过是各种数据库视图,以一种有利于软件逆向工程的格式发布相关信息。用户对数据库所做的任何修改都会在这些视图中反映出来,并随数据库一起保存,但这些更改并不会影响原始的可执行文件。IDA 的强大之处在于,它包含各种可用于分析和操作数据库数据的工具。

4.2.1 创建IDA 数据库

在你选择一个准备分析的文件并指定选项之后,IDA 将开始创建数据库。在这个过程中,IDA 会将控制权转交给你选定的加载器模块,该模块的工作包括:从磁盘加载文件,解析它能够识别的任何文件头信息,创建各种包含代码或数据(在文件头中指定)的程序块,最后在将控制权返还IDA 之前确定特定的代码入口点。在这方面,IDA 加载器模块的行为类似于操作系统加载器。IDA 加载器将根据程序文件头包含的信息,确定一个虚拟内存布局,并对数据库进行相应的配置。

加载器完成工作后,IDA 内的反汇编引擎将接管控制权,一次传一个地址给选定的处理器模块。处理器模块的工作包括:确定位于该地址的指令的类型、长度,以及从这个地址继续执行指令的位置(例如,是当前的指令序列还是分支)。如果 IDA 认为它已经找到了文件中的所有指令,它会第二次遍历指令地址列表,并请处理器模块将每个指令转换成汇编语言,然后将它们显示出来。

在这个反汇编完成之后,IDA 将自动对二进制文件进行额外的分析,以提取出其他可能对分析人员有用的信息。在IDA 完成初始分析后,用户可能会在数据库中发现以下一些或全部信息。

  • 编译器识别。通常,了解构建软件所使用的编译器会对我们有所帮助。识别所使用的编译器可帮助我们了解二进制文件使用的函数调用约定,并确定该二进制文件链接到哪些库。在加载文件时,IDA 会尝试确定用于创建输入文件的编译器。如果能够确定编译器,就可以在输入文件中扫描该编译器使用的样板代码序列,然后,将这些代码以彩色显示,以减少需要分析的代码的数量。

  • 函数参数和局部变量识别。对于每一个已识别的函数(其地址是调用指令的目标),IDA会详细分析栈指针寄存器的行为,以确定栈内的变量,并了解函数栈帧1的布局。然后,IDA 会根据这些变量的用途(作为函数中的局部变量,或者在函数调用过程中作为传递给函数的参数),自动为它们生成名称。

1. 第6 章将详细介绍栈帧。

  • 数据类型信息。利用对公共库函数及其所需参数的了解,IDA 会在数据库中添加注释,以指明向这些函数提交参数的位置。由于这些注释提供了需要检索各种 API 参考资料才能获得的信息,因此,它们可为分析人员节省大量时间。

4.2.2 关闭IDA 数据库

任何时候你关闭一个数据库,无论你是完全关闭 IDA ,还是切换到另一个数据库,IDA 都将显示一个 Save database (保存数据库)对话框,如图 4-6 所示。

enter image description here

图4-6 Save database 对话框

如果这是你初次保存一个新建的数据库,IDA 会用扩展名.idb 替换输入文件的扩展名,从而生成新数据库的文件名,例如,example.exe会生成名为 example.idb 的数据库。如果输入文件没有扩展名,IDA 会将.idb 附加到输入文件名称后面,构成数据库名称,如 httpd生成httpd.idb 。下面简要说明可用的保存选项及其意义。

  • Don’t pack database (不打包数据库)。这个选项仅仅刷新对 4 个数据库组件文件所做的更改,在关闭桌面前并不创建 IDB 文件。在关闭数据库时,不建议使用这个选项。

  • Pack database (Store)[打包数据库(存储)]。选择 Store选项会将4 个数据库组件文件存到一个 IDB 文件中。之前的任何 IDB 不经确认即被覆盖。Store选项不使用压缩。创建IDB 文件后,4 个数据库组件文件即被删除。

  • Pack database (Deflate)[打包数据库(压缩)]。Deflate 选项等同于Store选项,其唯一的差别在于数据库组件文件被压缩到 IDB 归档文件中。

  • Collect garbage (收集垃圾)。如果请求垃圾收集,IDA 会在关闭数据库之前,从数据库中删除任何没有用的内存页面。在选择这个选项的同时,选择 Deflate 选项可创建尽可能小的IDB 文件。通常,只有在磁盘空间不足时才选择这个选项。

  • DON’T SAVE the datebase (不保存数据库)。你可能会感到奇怪,怎么会有人不保存自己的工作呢!要知道,要想放弃你当前对数据库所做的更改(上次保存之后),使用这个选项是唯一的办法。选择这个选项时,IDA 会删除4 个数据库组件文件,保留现有的未经修改的IDB 文件。使用这个选项类似于在使用 IDA 时应用了撤销或还原功能。

4.2.3 重新打开数据库

事实上,重新打开一个现有的数据库根本与“火箭科学”(指很难做、很难懂的事情)无关2。因此,你可能会问,为什么还要讨论这个主题呢?正常情况下,要想重新打开现有数据库,只需使用IDA 的文件打开方法来选择数据库。通常,由于 IDA 不需要分析,在第二次(及随后)打开数据库文件时,它的运行速度会更快。而且,IDA 会将桌面恢复到它上次关闭时的状态。

2. 除非你打开的恰巧是rocket_science.idb 。

问题是:IDA 会不时崩溃,信不信由你。导致崩溃的原因,要么是 IDA 本身有bug,或者是你所安装的某个“风险”插件中有 bug,崩溃可能会令打开的数据库遭到破坏。一旦你重启 IDA并尝试再次打开受影响的数据库,IDA 可能会显示如图 4-7 和图4-8 所示的对话框。

enter image description here

图4-7 恢复数据库的对话框

enter image description here

图4-8 修复数据库的对话框

IDA 崩溃时,IDA 并没有机会关闭处于活动状态的数据库,也无法删除中间文件。如果你并不是第一次处理某个数据库,这可能会导致 IDB 文件和可能遭到破坏的中间文件并存。IDB 文件是你上次保存的、状态良好的数据库文件,而中间文件则包含上次保存后你做的任何更改。在这种情况下,可以选择还原上次保存的版本,或依旧使用已打开的、可能遭到破坏的版本,如图4-7所示。选择 Continue with Unpacked base (继续使用未打包的库)并不能保证可以恢复你所做的全部更改。未打包的数据库可能已遭到破坏,这会促使IDA 显示如图 4-8 所示的对话框。这时,IDA会建议你还原已打包的数据。如果你选择使用已修复的数据库,请考虑清楚其可能导致的后果。

另外,如果一个处于活动状态的数据库从未被保存过,IDA 崩溃时系统中仅存在中间文件,这时也会显示如图 4-8 所示的对话框。在这种情况下,当你再次打开原始的可执行文件时,IDA将提供修复选项。

目录