5

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

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

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

4

5 回答 5

4

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

在这里查看。

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

于 2011-08-08T16:49:45.767 回答
4

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

于 2011-01-25T09:28:19.750 回答
1

简短的回答:你不能。

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

于 2011-01-24T16:58:36.990 回答
0

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

于 2011-01-24T16:59:22.530 回答
0

确定像bsdiff这样的东西可以完成这项工作吗?

于 2011-01-25T10:07:53.403 回答