ZIP文件结构解析

概述

ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip

文件创建

首先我们创建flag.txt文件,内容为flag{abcdefg}

压缩文件,分别压缩成文件flag1.zip(无密码),和flag2.zip(密码为123456

ZIP文件结构

ZIP文件大致可以分为三个部分:数据存储区(File Entry)和中心目录区(Central Directory)以及一个目录结束标识(End of central directory record)组成。

这里我们以flag1.zip文件为例

蓝色:数据存储区

数据存储区包含一个或多个文件实体。文件实体通常以标识50 4B 03 04开头,这往往也是我们判别文件是否为压缩包的重要标准。文件实体记录着文件被压缩后的各种信息,压缩包内每一个被压缩的文件都会对应一个文件实体。比如我们压缩的文件flag.txt对应着上图的一个文件实体,其中我们能够直观地看出被压缩文件的文件名flag.txt、文件内容flag{abcdefg}、是否被加密等信息。

紫色:中心目录区

主要记录文件目录的相关信息,如文件注释,大小,文件名等等。同样包含所有被压缩文件的文件头(File Head),通常是以50 4b 01 02标识开头。

黄色:目录结束标识

主要记录压缩包开始分卷号开始的偏移量,主要决定文件的目录结构,以及压缩包的相关信息,以50 4b 05 06开头(只有一个)。

从上图我们可以看到,ZIP文件各组成部分之间是有对应关系的。数据存储区包含多个文件实体(File Entry)而一个被压缩的文件对应一个文件实体,一个文件实体又对应一个文件实体头。中心目录区包含多个文件头。

各分区详细介绍

数据存储区

实体文件头(Local File Header)

实体文件头中包含着文件的各种信息,包括文件名称、解压缩版本、压缩方式、CRC等等。通常以固定值50 4B 03 04开始(图中是从高位往低位写的,在一些软件中如winhex、010editor等,会从低位往高位写)。

我们仍以上文的压缩包举例

首先是4字节的固定值50 4B 03 04,接着是解压缩版本0A 00,标志00 00,压缩方式00 00(通常代表未加密) ,最后修改时间日期3C 94 56 54,接着是4字节的CRC校验码B4 49 F2 7D,压缩前后大小都为0E 00 00 00(相同则说明压缩率较低)。然后是2字节的文件名称长度08 00(实际是00 08,8个字节,刚好对应flag.txt),然后是扩展字段长度1C 00(28字节)。往后就是8字节的文件名称和28字节的扩展字段了。

文件数据(File Data)

文件数据从66 6C开始,一直到末尾的换行符0A

数据描述符(Data descriptor)

用于表示文件压缩结束,通常以50 4B 07 08开始,只有在文件实体头中通用标记位的第3Bit位为1时才会出现。一般zip上没有这个数据描述符,对应的编码格式如下。

中心目录区

中心目录区通常由多个文件头(File Header)组成。主要记录被压缩文件的目录结构,以及被压缩文件的属性,包括文件长度,压缩之后的长度,文件注释等。一个文件实体与一个文件头相对应。

文件头(FIle Header)

文件头和实体文件头十分类似,它比实体文件头多记录了一些文件信息,通常以50 4B 01 02开始。

数字签名(Digital Signature)

通常由头标识50 4B 05 05开始,结构如下

目录结束标识

在中心目录区结束后,目录结束标识用于标记目录数据的结束,每个压缩文件有且只有一个。通常以50 4B 05 06开始,对应的编码格式如下

评论

  1. k
    Windows Chrome 83.0.4103.106
    2年前
    2022-5-25 0:40:25

    你好,想请问一下你的博客的框架能否分享指点一下,这个风格个人很喜欢

    • 博主
      k
      Windows Firefox 100.0
      2年前
      2022-5-26 20:01:02

      这个是Wordpress的Argon主题,具体的话可以下拉到最底部查看作者的Github连接。

  2. yuki
    Windows Chrome 110.0.0.0
    1年前
    2023-2-15 15:22:43

    你好,这篇文章大部分图片都加载不出来,还有写的很好通俗易懂

    • 博主
      yuki
      Windows Firefox 109.0
      1年前
      2023-2-16 0:36:17

      感谢提醒,已换源

  3. Cason
    Windows Chrome 111.0.0.0
    1年前
    2023-3-20 19:59:25

    看情况,zip中的各个子文件都是用压缩算法进行单独压缩的,子文件的字典都是独立。之前以为会有一个公用的字典区,看来是想当然了。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇