从大型二进制文件中提取 zip 文件

Extracting zip files from a large binary file

我正在处理一个有点大的二进制文件 (717M)。此二进制文件包含一组(未知数量!)完整的 zip 文件。

我想提取所有这些 zip 文件(无需明确解压缩它们)。多亏了幻数('PK'),我能够找到每个块的偏移量(起点),但我找不到计算每个块长度的方法(例如,将那些 zip 文件从大二进制文件)。

阅读一些文档 (http://forensicswiki.org/wiki/ZIP),给我的印象是解析 zip 文件很容易,因为它包含每个压缩文件的 compressed size

有没有办法让我在 C 或 Python 中做到这一点而无需重新发明轮子?

有一些标准方法可以处理 zip files in python for example but as far as i know (not that i'm an expert) you first need to supply the actual file somehow. I suggest looking at the zip file format specification

您应该可以根据与幻数的相对位置找到您需要的其他信息。如果我没记错的话,CRC-32 是神奇的数字,所以向前跳 4 个字节会让你得到压缩后的大小,另外 8 个字节应该得到文件名。

  • 本地文件头签名4字节(0x04034b50)
  • 提取 2 个字节所需的版本
  • 通用位标志 2 字节
  • 压缩方式2字节
  • 最后mod 文件时间 2 字节
  • 最后一个 mod 文件日期 2 个字节
  • crc-32 4字节
  • 压缩大小 4 字节
  • 未压缩大小 4 字节
  • 文件名长度2个字节
  • 额外字段长度 2 字节

  • 文件名(可变大小)

  • 额外字段(可变大小)

希望至少能有所帮助:)

允许 zip 条目不包含本地 header 中的压缩大小。有一个标志位,用于在压缩数据后有一个描述符,其中包含压缩大小、未压缩大小和 CRC。

搜索 end-of-central-directory header 会更可靠,用它来查找中央目录,然后用它来查找本地 header 和条目。这需要注意细节,非常仔细地阅读描述 zip 格式的 PKWare appnote。您还需要处理 Zip64 格式,它有额外的 headers 和字段。

可能会存储一个 zip 条目,即逐字复制到 zip 文件中的该位置,并且该条目本身可能是一个 zip 文件。因此,请确保处理嵌入 zip 文件的情况,仅提取最外层的 zip 文件。