使用基于 dwarf 调试信息的 Ghidra+Bindiff 比较 ELF 文件

逆向工程 吉德拉 bin-diffing 工具bindiff
2021-06-21 03:10:06

所以这不是严格意义上的逆向工程问题,但由于这里有很多人使用 Ghidra 和 Bindiff,我无论如何都会尝试询问。

我有一个嵌入式 ARM cortex-M C++ 项目,我想比较两个不同编译器生成的 ELF 文件。

我使用这些说明将数据从 Ghidra 导出到 Bindiff:https ://reverseengineering.stackexchange.com/a/24636/34300

我用 debuginfo 构建了 ELF 文件。我希望 Ghidra 和 Bindiff 会使用 debuginfo 来识别函数,但事实并非如此。对于 700 个功能中的大约 100 个,工具无法匹配新旧功能。

我自己做了一些实验,我为 strcat 和 strcpy 编写了一些简单的实现,然后切换了名称,但随后 Ghidra 和 Bindiff 能够看到程序集已更改,即它不只是尝试根据内容匹配函数. 所以并不是 Ghidra + Bindiff 总是忽略函数名。 在此处输入图片说明

我看到的是预期的行为吗?在查找用于比较的函数时,Bindiff 确实使用了自己的启发式方法而不是信任调试信息?

如果是这样:有没有办法强制 Ghidra 和 Bindiff 在查找函数时信任矮人信息?


更新: Bindiff 手册列出了许多用于函数匹配的算法。有一个配置文件 .bindiff/bindiff.xml,您可以在其中修改 0.0 和 1.0 之间的置信度。看起来名称哈希匹配是我想要的,而且我可能想降低对其他算法的信心。

尽管我猜想单独查看每个函数有点幼稚,因为编译器可以在版本之间更改它们的内联选择:

0个回答
没有发现任何回复~