2016-11-16 104 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文件。