比较两个二进制文件

时间:2011-01-24 16:45:46

标签: assembly binary diff decompiling objdump

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

我有一个程序的两个版本,版本1和版本2.我在两个版本之间做了少量更改,但遗憾的是没有定期备份,所以虽然我有源代码对于版本2,我只有版本1的二进制文件。我需要找出两个版本之间的确切变化。我已经尝试创建两个版本的objdump,然后使用diff来查找更改,但这不起作用,因为偏移量不同,因此diff几乎考虑每一行都已更改。

例如,版本1中的一行可能是bgez v0,4074d0<daemonize+0xd4>,版本2中可能是bgez v0,4073d4<daemonize+0xd4>。这些行直接从转储文件中复制 - 您可以看到两行执行相同的操作,但是差异无法区分它们。文件太大,我无法手动检查每一行;如何检测功能更改,同时忽略偏移的差异?

5 个答案:

答案 0 :(得分:4)

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

Check it out here.

诀窍在于它不依赖于弱文本比较,它反汇编二进制文件并通过使用代码度量来测量它们之间的几何距离来比较所有函数。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

简短回答:你不能。

长答案:编写自己的差异,如果它们是数字立即值,则可以忽略操作码中的一个或任一个操作数。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

当然bsdiff之类的东西会起作用吗?

相关问题