如何最好地比较两个已编译的二进制文件?

时间:2018-11-08 19:55:57

标签: c++ c windows

我最近发现了一个出色的Visual Studio扩展,它可以在项目中查找不必要的#include语句并将其删除。我正在处理一些陈旧的遗留代码,并且剥离了很多代码。唯一的问题是我不能确定它是否以某种微妙的方式改变了构建。在我看来,一个项目可能仍会构建,但是某个地方的#define可能已经更改。

无论如何,我想到可以确定通过检查二进制文件没有进行任何重要的更改。我想知道是否有人对如何做到最好有任何建议?显而易见的问题是,二进制文件中的少量元数据将由于编译器有关构建时间等的元数据而发生变化。

到目前为止的想法:

  1. 反汇编所有二进制文件,并将反汇编与diff比较。 (尽管我不会涵盖数据部分)。
  2. 使用某种知道PE标头的二进制diff程序。

有什么想法吗?有人知道我所描述的能够理解PE标头的工具吗?

1 个答案:

答案 0 :(得分:1)

PE标头始终位于同一位置,并且范围最大为512字节(完全)。 因此只需截断前512个字节,然后比较结果即可。

我通过xxd将它们通过管道传输,以将文件转换为十六进制,然后对生成的文本文件进行diff处理(任何文本diff程序都可以,但是您需要git commandline来获取xxd)。

xxd -p -c 4 < Truncatedfile1.exe > output.diff1

tail -n -512 < File1.exe | xxd -p -c 4 > output1.hex
tail -n -512 < File2.exe | xxd -p -c 4 > output2.hex
git diff --no-index --color output1.hex output2.hex 

请注意,我使行只有4个字节长,以便有对齐(特别是在数据段中发生)对齐的机会,使我可以在两行之间插入奇数个字节时使行恢复原状。如果您幸运的话,您的代码也是DWORD对齐的,那么它也可以与您的代码一起使用。