Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 比较两个二进制文件_Assembly_Binary_Diff_Decompiling_Objdump - Fatal编程技术网

Assembly 比较两个二进制文件

Assembly 比较两个二进制文件,assembly,binary,diff,decompiling,objdump,Assembly,Binary,Diff,Decompiling,Objdump,如何区分两个二进制文件 我有两个版本的程序,版本1和版本2。我在两个版本之间做了少量更改,但不幸的是,我没有定期备份,因此尽管我有版本2的源代码,但我只有版本1的二进制代码。我需要弄清楚我在两个版本之间到底改变了什么。我尝试过创建两个版本的objdump,然后使用diff查找更改,但这不起作用,因为偏移量不同,因此diff认为几乎每一行都已更改 例如,版本1中的一行可能是bgez v04074d0,版本2中的一行可能是bgez v04073d4。这些是直接从转储文件复制的-您可以看到这两行执行相

如何区分两个二进制文件

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


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

简短回答:您不能


详细回答:编写您自己的diff,如果操作码的一个或任意一个操作数是数字立即数,则可以忽略它们。

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

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

确定类似的东西能起作用吗?

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


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

这听起来像是一个现实世界的NP完全问题。;-)不是NP完全的,因为它可以通过DFA解决。NP和DFA是什么意思?你回答了“我怎么做”的问题,说“它可以做到”。虽然在技术上是正确的,但这是完全无用的-1我试图找出这两个程序之间的变化——我可能用错了,但bsdiff似乎没有多大帮助。你会怎么做?@Benubird:bsdiff在代码级而不是字节级上进行二进制差分,chrome courgette通过在差分中添加(很好地删除)可重新定位的跳转/偏移,将真正改变的代码部分留在后面,而不仅仅是移位。想想看,它是link diff&patch,但是在程序集级别而不是文本级别。asmDIFF是否有可能以独立的形式发布?从我所看到的,asm_hint_C和asm_search_C与mmBBQ和lua紧密耦合。。。这并不一定是件坏事,但却使得它很难独立使用。