如何知道2 exe是否有不同的代码?

时间:2013-01-04 07:01:40

标签: c checksum

我有一个特定程序的工作exe,它是在一个月前建成的。我不小心删除了开发环境中的exe,所以我编译了一个新的exe。但是,我在uat环境中有一个工作exe的副本,它的校验和与新的exe不同。

2 exe具有相同的大小:

  

---------- + 1 raymond1 Domain Users 623616 1月3日16:47 A.EXE; 24

     

---------- + 1 raymond1 Domain Users 623616 Jan 4 11:11 A.EXE; 25

但他们得到了不同的校验和:

$ sha1sum "A.EXE;24"
cb87ec4b746677903969ba61361a60c14461b5e0 *RIIB.EXE;24
$ sha1sum "A.EXE;25"
09453f40e53e280abbb98bd0013f1ddf312706b8 *RIIB.EXE;25

所以我想知道我生成新exe的方式是否有任何问题,也许我忘了编译它依赖的程序。

无论如何,我使用与版本25完全相同的方式编译了另一个exe。它与其他两个exe的大小相同。我刚刚把它联系起来。但是版本26也得到了不同的校验和。

$ sha1sum "RIIB.EXE;26"
e2378544a91db49927738fd0135181b9daf125be *RIIB.EXE;26

所以我想知道我是否能找出它们之间有什么不同。

P.S。 exe是在OpenVms中生成的,我将它运行到我的机器上进行校验和(WIN 7中的CYGWIN)。

编辑:

我按照评论中的建议进行了二元差异。

结果如下:

$ xxd "A.EXE;24" > b24.hex
$ xxd "A.EXE;25" > b25.hex
$ xxd "A.EXE;26" > b26.hex

$ diff b24.hex b25.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 6ff8 42de 9b2c 0100  ...`....o.B..,..
< 0088210: 3500 0060 0000 0000 8c6f f842 de9b ac00  5..`.....o.B....
---
> 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100  ...`....b....,..
> 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00  5..`.....b......
38862c38862
< 0097cd0: 4950 462f 564d 5300 8c6f f842 de9b ac00  IPF/VMS..o.B....
---
> 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
38868c38868
< 0097d30: 0100 0000 0300 0000 8c6f f842 de9b ac00  .........o.B....
---
> 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00  .........b......
38872c38872
< 0097d70: 4950 462f 564d 5300 8c6f f842 de9b ac00  IPF/VMS..o.B....
---
> 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......    

$ diff b25.hex b26.hex
34849,34850c34849,34850
< 0088200: 1900 0060 0000 0000 62b3 87f4 cd2c 0100  ...`....b....,..
< 0088210: 3500 0060 0000 0000 0b62 b387 f4cd ac00  5..`.....b......
---
> 0088200: 1900 0060 0000 0000 10a5 1c14 ce2c 0100  ...`.........,..
> 0088210: 3500 0060 0000 0000 e710 a51c 14ce ac00  5..`............
38862c38862
< 0097cd0: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
---
> 0097cd0: 4950 462f 564d 5300 e710 a51c 14ce ac00  IPF/VMS.........
38868c38868
< 0097d30: 0100 0000 0300 0000 0b62 b387 f4cd ac00  .........b......
---
> 0097d30: 0100 0000 0300 0000 e710 a51c 14ce ac00  ................
38872c38872
< 0097d70: 4950 462f 564d 5300 0b62 b387 f4cd ac00  IPF/VMS..b......
---
> 0097d70: 4950 462f 564d 5300 e710 a51c 14ce ac00  IPF/VMS.........

他们在同一行中有不同之处。也许是造成问题的时间戳?

1 个答案:

答案 0 :(得分:2)

就程序功能而言,两个版本之间没有区别,因为您使用完全相同的参数编译完全相同的代码(除非您有一些非常奇怪的编译器错误)。注意,您可能还会对代码中的环境设置有所依赖,例如日期或时间编译器生成的常量 - 这对于每个编译自然会有所不同。

签名是并且应该是不同的,因为还有其他因素影响实际生成的二进制文件,例如编译时间,环境,编译器元数据或编译期间的天气状态。事实上,如果签名相同,那就意味着sha1毫无价值。

修改

编译器生成的常量,例如__LINE__(例如,预构建脚本可能会将一些#define注入到代码分析工具的代码中),__DATE__和{{1}可能会从一个编译变为另一个编译。

如果编译器认为__TIME__是最新的,那么编译器可能会选择不重新编译某些文件(并且这并不总是正确的,特别是如果使用了预编译的头文件,但不仅仅是 - 导致无效的.exe文件) 。此外,由于速度或优化或任何其他原因,链接器可能具有关于链接顺序的内部考虑。