-
24-10-2019 - |
题
如何区分两个二进制文件?
我有两个程序版本,版本1和版本2。我在两个版本之间进行了少量更改,但不幸的是没有定期备份,因此,尽管我有版本2的来源,我只有版本1的二进制文件。我需要找出两个版本之间的更改。我已经尝试创建两个版本的objdump,然后使用diff查找更改,但是由于偏移是不同的,这是行不通的,因此diff几乎考虑了几行更改。
例如,一行可能是 bgez v0,4074d0<daemonize+0xd4>
在版本1中,以及 bgez v0,4073d4<daemonize+0xd4>
在版本2中。这些是直接从转储文件复制的 - 您可以看到两行执行相同的操作,但是DIFF无法区分它们。这些文件太大了,我无法手动检查每一行;如何检测功能变化,同时忽略偏移的差异?
解决方案 2
最终,我通过删除原始指令和偏移标记来解决此问题,因此我只有组件,然后使用SED剥离每个数字,然后过滤Diff以忽略仅包含1行的更改。我有点惊讶,但确实如此。
其他提示
有可能的。我目前正在研究一个能够从新/修改的二进制文件中搜索功能和内存指针地址的项目。它支持X86和X86_64上的Windows PE和精灵二进制文件。还有一篇论文描述了方法。它适合我的倒车项目,在进行二进制更新时,我必须经常更新所有挂钩和内存地址。但是还有其他用例。
诀窍是它不依赖弱文本比较,而是通过使用代码指标来测量它们之间的几何距离来分解二进制文件并比较所有功能。
简短答案:你不能。
长答案:编写自己的差异,如果它们是数值的直接值,则可以忽略一个或任何操作数。
您可以使用SED或尴尬(或Perl或...)编写过滤器,以使所有偏移量在运行diff之前相同。写这样的过滤器作为练习留给读者。 :p
当然可以 BSDIFF 会做这份工作吗?