2011-01-24 81 views
4

如何区分两个二进制文件?比较两个二进制文件

我有两个版本的程序,版本1和版本2.我做了两个版本之间的少量变化,但不幸的是没有定期备份,所以虽然我已经得到了版本2的源代码,我只有版本1的二进制文件。我需要了解两个版本之间的变化。我已经尝试创建两个版本的objdump,然后使用diff来查找更改,但这不起作用,因为偏移量不同,所以diff差不多认为每条线都发生了更改。

例如,一条线可能是bgez v0,4074d0<daemonize+0xd4>版本1和bgez v0,4073d4<daemonize+0xd4>在第2版。这些都是直接从转储文件复制的 - 你可以看到两行做同样的事情,但差异不能区分它们。这些文件对我来说太大了,无法手动检查每一行;如何检测功能更改,同时忽略偏移量的差异?

+0

这听起来像是一个现实世界的NP完全问题。 ;-) – 2011-01-24 16:48:25

+0

不是NP完整的,因为它可以通过DFA解决。 – Benubird 2011-01-25 09:19:02

+0

NP和DFA的含义是什么? – 2016-02-11 14:45:15

回答

3

我最终通过删除原始指令和偏移标记来解决此问题,所以我只有程序集,然后使用sed去除每个数字,并过滤差异以忽略仅包含1行的更改。我有点惊讶,它的工作,但它确实。

1

简答:你不能。

长答案:编写自己的diff,可以忽略操作码的一个或两个操作数,如果它们是数值立即值的话。

0

您可以使用sed或awk(或perl或...)编写过滤器,以在运行diff之前使所有偏移量相同。写这样一个过滤器留给读者来练习。 :-P

+0

你已经回答了'我该怎么做'的问题,说'它可以完成'。虽然技术上正确,但这完全没用。 -1 – Benubird 2011-01-25 09:23:03

4

这是可能的。我目前正在开发一个项目,该项目能够从新的/修改的二进制文件中的已编译文件中搜索函数和内存指针地址。它支持x86和x86_64上的windows PE和ELF二进制文件。还有一篇论文描述了这种方法。它适用于我的反转项目,在进行二进制更新时,我必须经常更新所有钩子和内存地址。但也有其他用例。

Check it out here.

诀窍在于,它不依赖于弱文本比较,它拆卸二进制文件,并通过使用代码度量测量它们之间的几何距离的所有功能进行比较。