如何检查两个可执行二进制文件是否来自同一源代码?

4
例如,我有两个C语言二进制可执行文件。如何确定这两个文件是否是使用相同的源代码生成的?

4
通常情况下你做不到。即使同一个文件编译两次,也可能会生成不同的代码,因为C语言编译在大多数平台上是非确定性的。你可以计算哈希值并比较文件以查看它们是否匹配。即使它们不匹配,它们仍然可能来自同一源代码。 - Tanveer Badar
1
Q: 出于好奇,你为什么想要这样做呢? Q: 你考虑过在构建过程中添加版本戳吗? PS:你可以使用像cksummd5sum这样的工具来检查两个二进制文件是否相同。 - FoggyDay
幼儿,正如FoggyDay所暗示的那样,退一步并解释你想通过这样做实现什么可能会有所帮助。我们可能正在看一个https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem - Yunnosch
@klutt 是的,有点。 - Toddler
1
你可以查看C++中的确定性构建 https://dev59.com/CWUq5IYBdhLWcg3wQ-NF 和 https://blog.conan.io/2019/09/02/Deterministic-builds-with-C-C++.html - Rishikesh Raje
显示剩余4条评论
1个回答

8
一般来说,这是完全不可能做到的。
  • 您可以从同一源代码中生成不同的二进制文件
  • 可以从不同的源代码生成两个相同的二进制文件

可以通过不同的方式添加版本信息。但是,如果你想要的话,你可以很容易地愚弄所有这些方法。

这里有一个简短的脚本可以帮助你。请注意,它可能存在缺陷。它只是为了展示这个想法。不要只是复制这个脚本用于生产代码。

#!/bin/bash 

STR="asm(\".ascii \\\"$(md5sum $1)\\\"\");"
NEWNAME=$1.aux.c
cp $1 $NEWNAME
echo $STR >> $NEWNAME
gcc $NEWNAME

它的作用基本上是确保源代码的md5sum作为字符串包含在二进制文件中。这是特定于gcc的,您可以在此处阅读更多有关该想法的信息:通过标头嵌入无法优化的字符串

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接