可以一个c++编译的DLL在代码上没有大小差异

Can an c++ compiled DLL differ in code without size difference?

本文关键字:代码 DLL 编译 c++ 一个      更新时间:2023-10-16

我过去常常让供应商交付我的软件部分,它们是闭源的,并在dll中编译,我通常以字节(实际文件大小)与以前的文件属性进行比较。

如果我散列的文件,他们总是不同的,因为一个版本头,你能回答;一旦字节大小显示两者匹配,我是否可以依赖于得出结论,例如dll内部的源代码是相同的?

或者是否有更好的方法来检查是否发生了变化?我说的是定期更新的网络模块,有时大小变化,我可以肯定地说一个修复已经完成了它的源代码,因此为什么最终编译的dll大小不同,但是一个琐碎的提交到源代码也翻译在大小差异,Windows可以识别在属性,当查看编译的dll ?

目标是知道在新版本中是否有更改,而供应商的dll是闭源的,他们不提供源代码。

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

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

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

最好的办法是生成一个散列,如MD5或SHA1文件,并比较它们的散列。

除了Lightness所说的,还有一些工具将尝试在级别比较可执行文件,其目标是确定两个文件具有相同的代码,尽管元数据存在差异。然而,它们绝对被认为是逆向工程工具,可能很难使用。要在这条道路上走得更远,您将需要对PE文件结构有一个牢固的理解,可能还需要一些x86汇编。

问上游供应商要容易得多。即使是闭源软件也可以有完整的变更日志。

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

也就是说,判断一个程序的语义是否被改变的唯一可靠的方法—无论是通过bug修复还是新功能。是阅读产品的变更日志,或者检查其源代码