2016-11-16 151 views
0

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

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

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

有没有一种方法可以让我在C或Python中做到这一点,而不需要重新发明轮子?

回答

1

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

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

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

  • 文件名(可变大小)

  • 额外字段(可变大小)

希望能帮到一点点:)

2

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

搜索中央目录结尾标题,使用它来查找中央目录并使用它来查找本地标题和条目会更可靠。这需要注意细节,非常仔细阅读描述zip格式的PKWare appnote。您还需要处理Zip64格式,它具有额外的标题和字段。

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