解析/拯救损坏的 IDA 数据库

逆向工程 艾达 二元分析 文件格式 结构 十六进制
2021-07-06 02:44:58

我正在使用 IDA 逆向应用程序。我的 VM 崩溃并让 IDA 数据库处于损坏的解压状态。

下次我尝试重新加载它时,IDA 给了我以下错误消息:The input database is corrupted: CRC32 mistmatch. Continue?几次,然后它以错误退出bTree error: index file is bad谷歌搜索这些错误消息没有给出有用的结果,这是不寻常的。

我想恢复数据库,或者至少以某种方式提取数据。

我已经尝试过以下方法:

  • Zynamics bindiff(无法打开IDB,说它可能是在另一个IDA实例中打开的,我猜这是数据损坏的结果)
  • 手动十六进制差异 - 我无法解释输出。

在这一点上,我正在考虑以某种方式解析 IDB,然后手动比较该输出。

那么,如何从 IDB 文件中解析/提取数据?

有关的。

3个回答

我在 github 上发布了一些可以做到这一点的工具:https : //github.com/nlitsme/pyidbutilhttps://github.com/nlitsme/idbutil第一个是用 python 编写的,第二个是用 C++ 编写的,两者都有相似的功能。

pyidbutil提供最低级别的恢复选项:使用--pagedump您可以转储文件中的每个页面,而无需完整的逻辑文件结构。

不幸的是,当您的数据库已损坏时,我无法提供答案。这就是专有二进制数据库的本质:如果你被灌水,你必须保留所有的部分。

但是我可能建议您应该预见并准备好 IDA 数据库损坏,这种损坏迫在眉睫,迟早会发生在几乎每个人身上。所以:

  1. 更喜欢使用未打包的数据库(在 IDA 中触发的错误更少)。
  2. 尽早并经常备份二进制数据库文件。
  3. 尽早并经常将数据库另存为 IDC 文件(文件 -> 生成文件 -> 将数据库转储到 IDC 文件)。

特别注意第 3 步 - IDC 文件是您离开 IDA 围墙花园的门票。众所周知,它不包含 IDA 存储在数据库中的所有信息,但它最重要的是,它是一个文本文件,您可以将其重新导入 IDA 以重新启动分析,只需一个可执行文件,或使用一个简单的脚本来过滤掉所需的数据等。

总的来说,数据库损坏的问题只能通过使用开放格式数据库的开放工具来解决。作为一个无耻的插件,我从事交互式反汇编程序,它以简单的文本格式存储数据库 - ScratchABit迟早会为它编写IDC导入脚本。

在我的实例中,错误是“读取错误:读取文件末尾(文件位置 0x0,想要 0x20X 字节,读取 0x0 ”。

在尝试了一段时间之后,我意识到 .id2、.nam 和 .til 解压后的数据库文件的大小都是 0KB。打开与新数据库相同的可执行文件,关联的 .id2、.nam 和 .til 文件具有确定的大小。

我所做的是用新数据库的 .til 文件替换损坏数据库的 .til 文件数据库打开,断点完好无损。

唯一的问题是名称窗口变空了。但是通过数据库查看,我意识到我手动输入的名称仍然存在,但以灰色文本显示。但在此阶段,使用脚本恢复名称并不困难,因为名称及其地址是数据库文本的一部分