【问题标题】:compare two binary files比较两个二进制文件
【发布时间】:2011-06-14 15:35:25
【问题描述】:

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

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

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

【问题讨论】:

  • 这听起来像是一个现实世界的 NP 完全问题。 ;-)
  • 不是 NP 完全的,因为它可以通过 DFA 解决。
  • NP和DFA是什么意思?

标签: assembly binary diff decompiling objdump


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    Check it out here.

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

    【讨论】:

    • asmDIFF 是否有可能以独立形式发布?据我所知,asm_hint_C 和 asm_search_C 非常紧密地耦合到 mmBBQ 和 lua 中......这不一定是坏事,但很难独立使用。
    【解决方案3】:

    简短的回答:你不能。

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 您已经通过说“可以做到”来回答“我该怎么做”这个问题。虽然在技术上是正确的,但这完全没用。 -1
      【解决方案5】:

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

      【讨论】:

      • 我试图找出这两个程序之间的变化——我可能用错了,但 bsdiff 似乎没有多大帮助。你会怎么做?
      • @Benubird:bsdiff 在代码级别而不是字节级别上进行二进制差异,chrome courgette 通过添加(很好地删除)差异中的可重定位跳转/偏移量来更进一步,留下真正改变的代码部分,而不仅仅是移动。认为它链接差异和补丁,但在程序集级别而不是文本级别
      猜你喜欢
      • 2017-07-26
      • 1970-01-01
      • 2011-12-10
      • 2016-06-29
      • 2013-11-28
      • 2020-12-19
      • 2015-05-20
      • 1970-01-01
      • 2017-02-01
      相关资源
      最近更新 更多