c ++编译的DLL可以在代码上有所不同而没有大小差异吗?

时间:2014-05-25 17:39:53

标签: c++ dll

我用来交付我的软件的供应商部分,它们是封闭源代码并在DLL中编译,我通常将文件属性(以字节为单位)(实际文件大小)与之前的文件属性进行比较。

如果我对文件进行哈希处理,由于版本标题,它们总是会有所不同,你能否回答; 我可以依赖得出结论,例如DLL中的源是一样的,一旦字节大小显示为两者匹配吗?

或者有更好的方法来检查是否有变化?我正在谈论定期更新的网络模块,有时大小会发生变化,我当然可以说它的源代码已经完成修复,因此最终编译的DLL的大小不同,但是对源代码进行了简单的修改在查看已编译的DLL时,Windows可以在属性中识别的大小差异吗?

目标是知道某些内容是否在较新版本中发生了变化,而供应商DLL是封闭源代码并且它们不提供源代码。

我想再澄清一下这个问题:如果文件大小(字节)没有差异,是否可以添加代码? (因为更改/替换相同数量的相同代码字符会产生相同的最终大小),或者,如果源包含更多字符,它肯定会转换为大小吗?

2 个答案:

答案 0 :(得分:4)

仅按文件大小比较二进制文件是荒谬的。您可以简单地生成两个完全不同的程序,这些程序具有相同的文件大小。您应该按字节比较文件,而不是按大小比较。

也就是说,判断程序的语义是否已经改变的唯一可靠方法 - 通过错误修复或新功能 - 是阅读产品的更改日志,或检查其源代码

答案 1 :(得分:4)

PE文件具有指定的文件对齐,用零填充它们。这意味着DLL总是这个大小的倍数。这使得类似但不同的DLL更可能在磁盘上具有相同的大小。

显而易见的是,将内部常量从4更改为5不会改变文件大小,但会对代码的运行方式产生深远的影响。

最好的办法是生成 hash ,如文件的MD5或SHA1,并比较它们的哈希值。

除了Lightness所说的,还有 一些工具会尝试比较部分级别的可执行文件,目标是确定两个文件具有尽管元数据存在差异,但代码相同。但是,它们肯定被认为是逆向工程工具,并且可能难以使用。为了在这条道路上走得很远,你需要对PE文件结构有一个深刻的理解,也可能需要一些x86组件。

向上游供应商询问要容易得多。即使是闭源软件也可以拥有彻底的更改日志。