找出哪个特定程序的哪个版本创建了(部分)ZIP 存档

找出哪个特定程序的哪个版本创建了(部分)ZIP 存档

是否可以根据元数据确定哪个特定程序的特定版本创建了给定的 ZIP 档案?

此外,ZIP / RAR 压缩的结果是否会受到用于该任务的计算机的硬件/软件(操作系统版本)配置的影响?

目标:在文件共享网络上,小文件(图片、电子书……)通常以压缩档案的形式共享。随着时间的推移,这些档案的某些部分可能会变得不可用,而且由于大多数下载原始档案的人都会提取单个文件然后删除它们,因此即使拥有所有丢失文件的人也无法再共享原始档案,因此任何试图在此时下载它的人都会陷入无法使用的部分文件的困境。一些这样的档案可能有许多来源,但没有一个完整的来源。如果拥有原始档案中所有文件的人创建了一个新档案,即使它与原始档案只有一个字节的差异,它也不会被相同的哈希值识别,并且这些人不会收到通知,因此新档案无法有效地共享。

我已经成功重新创建未压缩ZIP / RAR 档案,以便再次共享它们,通过复制丢失文件的内容并编辑其元数据以匹配可用部分的文件,直到档案的哈希值与原始文件的哈希值匹配;我还设法重新创建了一些不太旧的 RAR 档案。但说到压缩的 ZIP 档案,我不知所措,因为有许多实用程序可以创建它们,每个实用程序似乎都使用自己的一套算法和参数。此外,其中一些档案是在 10 多年前创建的,这使得找出创建它们的内容变得更加棘手。如果上述第二个问题的答案是“是”,那么在我的 ~2017 年的电脑上重新创建这些 10 多年的档案几乎是不可能的;如果答案是否定的,那么我可能会尝试一下,前提是我可以实际找到相应的可执行文件(最好是 CLI,或者至少是“便携式”GUI,这是另一个警告 - 我查看了仍在 CD 上的旧版本 WinZIP,它们似乎需要完整安装才能使用,没有包含 CLI 版本,而 WinRAR 则包含 rar.exe 作为 CLI 等效项)。

示例:一个这样的不完整 ZIP 档案大小为 372MB,其中缺失 18MB。根据文件的时间戳,它可能创建于 2003 年左右。我在另一个档案的缺失部分中找到了一组图片:幸运的是,时间戳似乎完全相同,但不幸的是,压缩参数不同,压缩大小不同,二进制内容不匹配。因此,我解压缩了该图片集,并尝试使用 WinRAR 和 7-Zip(当前安装的版本)将其重新压缩为 ZIP,使用所有可用参数进行测试,并检查输出是否匹配(使用十六进制编辑器检查时,每个文件应具有完全相同的压缩大小和相同的二进制内容),但我无法获得该结果。因此,不完整的档案可能是使用不同的软件和/或版本创建的,使用了不同的压缩算法。现在,通过检查通用头文件、单个文件的头文件和其他结构,我们是否能够准确地知道创建该文件的具体应用程序是什么,以及使用了哪些确切的参数,从而重新创建原始文件?同样,硬件是否对结果有影响,例如,是使用单核还是多核 CPU,还是具有或不具有特定指令集的 CPU?
上面提到的 ZIP 文件的头文件如下:

50 4B 03 04 14 00 02 00 08 00 B2 7A B3 2C 4C
5D 98 15 F1 4F 01 00 65 50 01 00 1F 00 00 00

我尝试搜索有关 ZIP 格式标头结构的信息,但到目前为止,我还没有找到任何与我要查找的内容相关的结论。

RAR 档案的另一个缺点是,它们似乎没有在页眉或页脚中提供其内容的完整索引(与 ZIP 档案相反),如果我没有记错的话,每个文件仅由其自己的页眉引用,如果档案有点复杂并且有许多子文件夹,则更难弄清楚缺失部分中曾经是什么。

编辑:正如我在下面的评论中回复的那样,目标并不是确切地知道使用哪个程序的哪个版本来生成特定档案,而是能够从部分下载和与缺失部分相对应的单个文件中重新生成该档案。例如,如果档案是使用 WinZIP XY 创建的,但一年后发布的 7-Zip XY 恰好实现了相同版本的 ZIP 算法,同时控制产生特定压缩结果的关键设置,那么它应该也能达到同样的效果。但到目前为止,我测试的几个程序/版本都产生了不同的结果。

答案1

不可以。无法确定创建 zip 文件的版本或程序。本地文件头中有一个字段列出了要提取的最低版本。但是,这只能消除一些非常古老的版本一些程式。

至于档案输出是否受硬件影响,答案也是否定的。虽然压缩或解压的速度会受到影响,但压缩/解压算法始终相同,因为它基于软件且不会改变。

操作系统或软件会影响输出吗?可能会影响较小的输出,但影响程度不大。同样,压缩/解压缩算法是相同的。如果存在基于 Windows 的文件权限的额外元数据,则很可能(但不能保证)是由 Windows 计算机创建的。*Nix .dot 文件也是如此。这指向 *Nix 计算机,但并非总是如此。

答案2

社区为此制定了一个解决方案 - 但它是否能在你的情况下实施则取决于运气。

如果原始文件是使用 torrentzip 创建的,则文件末尾有一个校验和,您可以使用 torrentzip 重新创建该文件,确认校验和,然后将文件复制回活动共享并重新扫描。

我目前遇到过这样的情况 - 原始种子用户已经离开,而其他用户已达到 96%。我拥有所需的所有缺失文件,但需要将它们压缩以便完全匹配,然后每个人都可以继续下载。

你从一个十六进制编辑器开始(我用的是frhedhttp://frhed.sourceforge.net/en/但你可以使用你想要的)并检查 ZIP 文件的末尾。如果它有 ascii 文本 TORRENTZIPPED-xxxxxxxx,那么你可能很幸运。

如果是这种情况,请创建一个文件夹,其中包含需要包含在 ZIP 中的所有文件。使用标准 Windows zip 文件夹创建一个与文件共享同名的 ZIP 文件。此时,您将在同一文件夹中拥有所有文件和新的 ZIP 文件。从命令行运行 torrentzip zipfilename.ZIP,它将重新添加所有文件并在 ZIP 文件末尾创建校验和签名。

使用十六进制编辑器查看文件末尾。如果 8 位十六进制校验和相同,则表示成功。

我很幸运,原始 ZIP 文件是使用 torrentzip 创建的,因此我能够重新创建它们,并且一切都按您预期的那样进行。

在我最初的测试中,我通过获取一个 100% 正常的 ZIP 文件,将其解压,重新压缩,使用 torrentzip 并确认校验和,确保我理解了确切的程序。然后我使用一个实用程序对两个文件进行校验和(我使用 Implbits HashTabhttp://implbits.com/products/hashtab/) 并确认我能够重新创建一个相同的文件。然后我开始处理其他不完整的 ZIP 文件。

希望这有帮助。干杯。

相关内容