我正在使用IDA反转应用程序。
我的VM崩溃了,并且IDA数据库处于损坏的未压缩状态。

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

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

我已经尝试了以下操作:


Zynamics Bindiff(无法打开IDB,说它可能是在另一个IDA实例中打开的,我想是数据损坏的结果)
手动十六进制比较-我只是无法解释输出。

此时,我正在考虑以某种方式解析IDB,然后比较该输出

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

相关。

评论

在这种情况下,我要做的第一件事是:取消。之后,我将备份打包的和未打包的IDB,然后继续进行IDA提供的选择之一,然后回溯并使用另一个选择(如果前者不起作用)。如果您的VM崩溃,则数据库的状态可能处于不一致状态,因此最好的选择是与support@hex-rays.com联系。否则,您可以使用SDK和IDA书籍找出IDB格式的详细信息,并提取可以挽救的详细信息。

openrce.org/forums/posts/917

@VitalyOsipov:我时不时遇到这种情况。尽管请求Hex-Rays支持很有意义,但询问公钥也同样有意义。例如,IDB可能包含敏感数据,在任何情况下都不得将其发送给任何第三方。因此,我认为无论背景如何,这都是一个有效且有价值的问题。我希望能够看到一个指向这种公开可用工具的答案。即使它只是满足我对IDB格式的好奇心而没有深入研究netnode.hpp;)

如果有人给出了指向公开可用的开源工具的答案,我将在Dominik的赏金之外再额外获得150个声誉点。

回答这个问题的最佳人选是Ilfak G.本人。

#1 楼

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

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

评论


我们需要的英雄来了! :)

–多米尼克·安塔尔(Dominik Antal)
17-6-28在12:37



值得注意的是,还有一个新的工具/框架可用于IDB文件:github.com/williballenthin/python-idb

–安东·科赫科夫(Anton Kochkov)
18年8月20日在12:24

#2 楼

不幸的是,当您的数据库已损坏时,我无法提供答案。那就是专有二进制数据库的本质:如果被束缚了,就必须保留所有内容。

但是我建议您应该预见并准备应对IDA数据库损坏,这是迫在眉睫,几乎每个人迟早都会发生。因此:


更喜欢使用解压缩的数据库(IDA中触发的错误更少)。
及早并经常备份二进制数据库文件。
将数据库另存为经常使用IDC文件(文件->生产文件->将数据库转储到IDC文件)。

请特别注意第3步-IDC文件是您出入IDA围墙花园的门票。众所周知,它不包含IDA存储在数据库中的所有信息,但是它是最重要的,它是一个文本文件,您可以将其重新导入IDA以仅使用可执行文件重新开始分析,或者使用总体来说,只有使用以开放格式使用数据库的开放工具,才能解决数据库损坏的问题。

作为一个无耻的插件,我致力于交互式反汇编程序,该程序以简单的文本格式-ScratchABit存储数据库。迟早会为它编写IDC导入脚本。

#3 楼

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

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

我所做的是用新数据库的.til文件替换了损坏的数据库的.til文件,该数据库已打开并且断点是完整的。

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