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

时间:2016-11-16 12:04:29

标签: python zip gzip

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

我想提取所有这些zip文件(不需要解压缩它们)。由于神奇的数字('PK'),我能够找到每个块的偏移量(起始点),但是我找不到计算每个块的长度的方法(例如,将这些zip文件从大块中雕刻出来)二进制文件)。

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

有没有办法让我用C或Python做到这一点而不重新发明轮子?

2 个答案:

答案 0 :(得分:2)

允许zip条目不包含本地标头中的压缩大小。有一个标志位具有压缩大小的描述符,未压缩的大小,CRC跟随压缩数据。

搜索中心目录末端标头,使用它来查找中心目录,并使用它来查找本地标头和条目会更可靠。这需要注意细节,仔细阅读描述zip格式的PKWare appnote。您还需要处理Zip64格式,它还有其他标题和字段。

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

答案 1 :(得分:1)

例如,有一些标准方法可以处理zip files in python但据我所知(不是我是专家),您首先需要以某种方式提供实际文件。我建议查看zip file format specification

您应该能够根据幻数的相对位置找到您需要的其他信息。如果我没有弄错CRC-32是神奇的数字,那么向前跳4个字节将使你达到压缩大小,另外8个字节应该得到你的文件名。

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

  • 文件名(可变大小)

  • 额外字段(可变大小)

希望至少有所帮助:)