Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何验证VB6可执行文件的两个副本来自同一个代码库?_Vb6_Md5_Hash_Md5sum_Binary Reproducibility - Fatal编程技术网

如何验证VB6可执行文件的两个副本来自同一个代码库?

如何验证VB6可执行文件的两个副本来自同一个代码库?,vb6,md5,hash,md5sum,binary-reproducibility,Vb6,Md5,Hash,Md5sum,Binary Reproducibility,我有一个在版本控制下的程序,它经历了多个版本。今天出现了一种情况,有人不知何故设法指向了程序的一个旧副本,因此遇到了后来被修复的bug。我想回去删除程序的所有旧副本(保留它们是公司的一项政策,可以追溯到版本控制普及之前,应该不再需要),但我需要一种方法来验证我是否可以生成完全相同的可执行文件,这比说“旧的一个来自于这个承诺,所以这个应该是一样的。” 我最初的想法是简单地对可执行文件进行MD5散列,将散列文件存储在源代码管理中,然后处理它,但我遇到了一个我甚至无法解析的问题 似乎每次生成可执行文件

我有一个在版本控制下的程序,它经历了多个版本。今天出现了一种情况,有人不知何故设法指向了程序的一个旧副本,因此遇到了后来被修复的bug。我想回去删除程序的所有旧副本(保留它们是公司的一项政策,可以追溯到版本控制普及之前,应该不再需要),但我需要一种方法来验证我是否可以生成完全相同的可执行文件,这比说“旧的一个来自于这个承诺,所以这个应该是一样的。”

我最初的想法是简单地对可执行文件进行MD5散列,将散列文件存储在源代码管理中,然后处理它,但我遇到了一个我甚至无法解析的问题

似乎每次生成可执行文件时(方法:Open Project.File>Make X.exe)它的散列方式不同。我注意到每次以看似随机的方式打开项目时,Visual Basic都会弄乱文件,但我不认为这会使其成为可执行文件,也没有任何证据表明确实发生了这种情况。为了避免这种情况,我尝试在sam中多次生成可执行文件e IDE会话和检查哈希,但每次都不一样

这就是:

  • 生成可执行文件
  • 生成MD5校验和:
    md5sum X.exe>X.MD5
  • 验证当前可执行文件的MD5:
    md5sum-c X.MD5
  • 生成新的可执行文件
  • 验证MD5是否有新的可执行文件:
    md5sum-c X.MD5
  • 验证失败,因为计算的校验和不匹配
  • 我不了解MD5或VB6生成可执行文件的方式,但我也不赞成使用MD5。如果有更好的方法来验证两个可执行文件是否确实相同,那么我洗耳恭听


    提前感谢您的帮助!

    这几乎是不可能的。请继续阅读原因

    编译器将赢得这场比赛,每次……

    连续编译同一个项目两次,即使不更改源代码或项目设置,也会生成不同的可执行文件

    原因之一是Windows用于EXE文件的PE(可移植可执行文件)格式包含一个时间戳,指示生成EXE的日期和时间,每当您生成项目时,VB6编译器都会更新该时间戳。除了整个EXE的“主”时间戳外,EXE中的每个资源目录(其中图标、位图、字符串等存储在EXE中)还有一个时间戳,编译器在生成新的EXE时也会更新该时间戳。此外,EXE文件还有一个校验和字段,编译器会根据EXE的原始二进制内容重新计算该校验和字段。由于时间戳会更新到当前日期/时间,因此每次重新编译项目时,EXE的校验和也会更改

    但是,但是……我发现了这个非常酷的EXE编辑工具,可以撤销这个编译器的诡计!

    有一些EXE编辑工具,例如,声称能够将EXE文件中的所有时间戳调整为固定时间。乍一看,您可能认为您可以将EXE的两个副本中的时间戳设置为相同的日期,并最终生成等效的文件(假设它们是从相同的源代码生成的),但事情要比这复杂得多:每次编译代码时,编译器都可以自由地以不同的顺序写出资源(字符串、图标、文件版本信息等),而您无法真正防止这种情况发生。资源存储为独立的“块”可以在结果EXE中重新排列而不影响程序运行时行为的数据

    如果这还不够,编译器可能正在未初始化内存的区域中构建EXE文件,因此EXE的某些部分可能包含编译器运行时内存中的任何内容的位和段,从而产生更多的差异

    至于MD5…

    您没有误解MD5哈希:对于相同的输入,MD5将始终生成相同的哈希。这里的问题是,本例中的输入(EXE文件)一直在更改

    结论:源代码管理是你的朋友

    至于解决您当前的困境,我将留给您一个问题:将特定的EXE与特定版本的源代码相关联更像是一个策略问题,必须以某种方式强制执行,而不是其他任何事情。在没有任何上下文的情况下,试图找出哪个EXE来自哪个版本是不可靠的。您需要跟踪在其他工具的帮助下。例如,确保每个生成为您的EXE生成不同的版本号,并且该版本可以轻松地与版本控制系统中的特定修订版/分支/标记/任何内容配对。为此,“免费”情况下,一些开发人员使用源代码管理,而其他人使用“我把1997年的源代码副本保存在我的网络文件夹中,因为它是我的代码,而且源代码管理是为娘娘腔们准备的”,这无助于让这一切变得更容易。我会让每个人都喝源代码管理Kool Aid,并立即遵守创建版本的标准策略

    每当我们构建项目时,我们的构建服务器(我们使用)都会确保已编译的EXE版本被更新以包含当前的构建编号(我们使用和自定义构建脚本来完成此操作),当我们发布版本时,我们会在Subversion中使用版本号作为标记名创建标记。版本服务器会存档发布版本,因此我们可以始终获取提供给客户的特定EXE(和安装程序)。对于内部测试,我们可以选择从版本服务器中提取存档的EXE,