前言
众所周知,50 4B 03 04
是zip文件的十六进制标志头,然鹅,zip的乐趣不止于此。
实验引入
- 我们先创建一个空文件压缩成zip拖进010观察
仔细观察能够发现,右边有很多PK
头,而这些PK似乎顺序对应着50 4B 03 04
、50 4B 01 02
和50 4B 05 06
-
我们再在不同时间创建两个相同的同名空文件,拖到010中观察
对比发现0x0A和0x2B偏移处两字节数据不同
利用010 发现0x0A 0x0B处代表着某个时间,究竟是什么呢,我们深入学习
ZIP
ZIP是一种支持无损数据压缩的存档文件格式。一个ZIP文件可能包含一个或多个可能已被压缩的文件或目录。ZIP文件格式允许多种压缩算法,但DEFLATE是最常见的。这种格式最初创建于 1989 年,最初是在 PKWARE, Inc. 中实现的。
历史版本
- 2.0-(1993)[1] 文件条目可以使用 DEFLATE 压缩并使用传统的 PKWARE 加密 (ZipCrypto)。
- 2.1-(1996) Deflate64 压缩
- 4.5-(2001)[12] 记录了 64 位 zip 格式。
- 4.6-(2001) BZIP2 压缩(在 APPNOTE 5.2 发布之前未在线发布)
- 5.0-(2002)SES:支持加密的DES、Triple DES、RC2、RC4(在APPNOTE 5.2发布之前未在线发布)
- 5.2-(2003)[13][14] AES加密支持SES(在APPNOTE 5.1中定义,但未在线发布)和WinZip的AES(“AE-x”);更正了支持 SES 加密的 RC2-64 版本。
- 6.1-(2004)[15] 记录的证书存储。
- 6.2.0-(2004)[16] 记录的中央目录加密。
- 6.3.0-(2006)[17] 记录的 Unicode (UTF-8) 文件名存储。扩展了支持的压缩算法(LZMA、PPMd+)、加密算法(Blowfish、Twofish)和哈希列表。
- 6.3.1-(2007)[18] 更正了 SHA-256/384/512 的标准哈希值。
- 6.3.2-(2007)[19] 记录的压缩方法 97 (WavPack)。
- 6.3.3-(2012)[20] 更改了文档格式,以便于使用JTC 1/SC 34 N 1621指示的JTC 1参考解释性报告(RER)等方法从其他标准引用PKWARE应用说明。
- 6.3.4-(2014)[21] 更新了 PKWARE, Inc. 的办公地址。
- 6.3.5-(2018)[22] 记录了压缩方法 16、96 和 99、DOS 时间戳纪元和精度,添加了用于密钥和解密的额外字段,以及拼写错误和说明。
- 6.3.6-(2019)[23] 更正了印刷错误。
- 6.3.7-(2020)[24] 添加了 Zstandard 压缩方法 ID 20。
- 6.3.8-(2020)[25] 将 Zstandard 压缩方法 ID 从 20 移至 93,弃用前者。记录的方法 ID 94 和 95(分别为 MP3 和 XZ)。
- 6.3.9-(2020)[26] 更正了数据流对齐描述中的拼写错误。
- 6.3.10-(2022)[27] 为附录 B 添加了多个 z/OS 属性值。 添加了几个额外的第三方额外字段映射。
结构
zip格式压缩包主要由两大部分组成:数据区
、中央目录区
其中,中央目录区
分为中央目录文件头(Central directory file header)
和中央目录记录尾(End of central directory record)
因此,可以说.zip文件通常分为以下三部分:
-
数据区[
50 4b 03 04
] -
中央目录文件头(CDFH)[
50 4b 01 02
] -
(必需)中央目录记录尾(EOCD)[
50 4b 05 06
]
数据区
数据区是由目录下每个文件形成的一系列50 4b 03 04
开头的[本地文件头
](#本地文件头(Local File Header))+[文件数据
](#文件数据(File data))+[数据描述符
](#数据描述符(Data descriptor))组成,其中包含了压缩数据
-
本地文件头(Local File Header)
偏移量 长度/bytes 描述 0 4 本地文件头标识 50 4B 03 04
4 2 解压所需的ZIP版本(最低) 6 2 通用位标志 8 2 压缩方式 10 2 文件最后修改时间 12 2 文件最后修改日期 14 4 压缩前CRC-32校验值 18 4 压缩大小 22 4 压缩前大小 26 2 文件名长度 (n) 28 2 扩展区场长 (m) 30 n 文件名 30+n m 扩展区 -
文件数据(File data)
-
单个文件数据
压缩
或存储
后紧随[本地文件头
](#本地文件头(Local File Header))后 -
若加密,则以
加密头(encryption header)
+加密压缩数据
紧随[本地文件头
](#本地文件头(Local File Header))后 -
若文件为空即该位置为空。
-
-
数据描述符(Data descriptor)
通常为空
偏移 长度/bytes 描述[33] 0 0 或 4 可选数据描述符签名 = 0x08074b50 0 或 4 4 未压缩数据的 CRC-32 4 或 8 4 或 8 压缩大小 8 或 12 或 16 4 或 8 未压缩大小
中央目录文件头(CDFH)
中央目录文件头条目是本地头的扩展形式:
偏移量 | 长度/bytes | 描述 |
---|---|---|
0 | 4 | 中央目录文件头标识50 4B 03 04 |
4 | 2 | 压缩所用的ZIP版本 |
6 | 2 | 解压所需的ZIP版本(最低) |
8 | 2 | 通用位标志 |
10 | 2 | 压缩方式 |
12 | 2 | 文件上次修改时间 |
14 | 2 | 文件上次修改日期 |
16 | 4 | 数据压缩前CRC-32校验值 |
20 | 4 | 压缩大小 |
24 | 4 | 压缩前大小 |
28 | 2 | 文件名长度 (n) |
30 | 2 | 额外场长 (m) |
32 | 2 | 文件注释长度 (k) |
34 | 2 | 文件初始位置的磁盘号 |
36 | 2 | 内部文件属性 |
38 | 4 | 外部文件属性 |
42 | 4 | 本地文件头的相对偏移量 |
46 | n | 文件名 |
46+n | m | 扩展区 |
46+n+m | k | 文件注释 |
中央目录记录结尾(EOCD)
在所有中央目录条目之后,中央目录(EOCD)记录的结尾,它标志着ZIP文件的结尾:
抵消 | 字节 | 描述[33] |
---|---|---|
0 | 4 | 中央目录结尾标识50 4B 05 06 |
4 | 2 | 当前磁盘编号 |
6 | 2 | 中央目录开始的所在磁盘编号 |
8 | 2 | 当前磁盘上的中央目录记录总数 |
10 | 2 | 中央目录记录总数 |
12 | 4 | 中央目录的大小 |
16 | 4 | 从本地文件头开始到中央目录开始的偏移量 |
20 | 2 | ZIP文件注释长度 (n) |
22 | n | ZIP文件注释 |
ZIP文件通过位于存档结构末尾的中央目录记录末尾(EOCD)
的存在来正确识别
详细说明
-
版本
当前最低功能版本定义如下:(
压缩包记录的解压版本都是需要版本*10,比如:2.0 * 10 = 20
) 1.0 - 默认值
1.1 - 文件是一个卷标
2.0 - File是一个文件夹(目录)
2.0 -文件使用Deflate压缩进行压缩
2.0 -文件加密使用传统的PKWARE加密
2.1 - 使用Deflate64™压缩文件
2.5 - 文件被压缩使用PKWARE DCL内爆
2.7 - File是一个补丁数据集
4.5 - File使用ZIP64格式扩展名
4.6 - 文件使用BZIP2压缩*压缩
5.0 - 文件使用DES加密
5.0 - 文件使用3DES加密
5.0 - 文件使用原始RC2加密进行加密
5.0 - 文件加密使用RC4加密
5.1 - 文件加密使用AES加密
5.1 - 文件加密使用修正的RC2加密**
5.2 - 文件加密使用正确的RC2-64加密**
6.1 - 文件加密使用non-OAEP密钥封装***
6.2 - 中心目录加密
6.3 - 文件使用LZMA进行压缩
6.3 - 文件使用PPMd+压缩
6.3 - 文件加密使用Blowfish
6.3 - 文件加密使用Twofish
-
通用位标志
Bit 0 被设置(二进制最后一位为1),表示文件被加密
-
压缩方式
0 - 文件被存储(不压缩)
1 - 文件被压缩
2 - 文件压缩系数为1
3 - 文件压缩系数为2
4 - 文件压缩系数为3
5 - 文件压缩系数减小为4
6 - 文件内爆
7 - 保留用于Tokenizing压缩算法
8 - 文件被Deflated
9 - 使用Deflate64增强放气功能™
10 - PKWARE数据压缩库内爆(旧IBM TERSE)
11 - 由PKWARE保留
12 - 文件使用BZIP2算法压缩
13 - PKWARE保留
14 - 伊兹玛
15 - PKWARE保留
16 - IBM z/OS CMPSC压缩
17 - PKWARE保留
18 - 使用IBM TERSE压缩文件(新)
19 - IBM lz77z架构
20 - 已弃用(对zstd使用方法93)
93 - Zstandard (zstd)压缩
94 - MP3压缩
95 - XZ压缩
96 - JPEG变体
97 - WavPack压缩数据
98 - PPMd版本I, Rev 1
99 - AE-x加密标记
其他
.ZIP 文件的最小大小为 22 bytes。这样的空 zip 文件仅包含中央目录记录结尾 (EOCD):
[0x50,0x4B,0x05,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]
对于标准 ZIP,存档文件及其内部单个文件的最大大小为 4,294,967,295 字节(2个 32−1 字节,或 4 GB 减去 1 个字节)。对于 ZIP64,最大大小为 18,446,744,073,709,551,615 字节(264−1 字节,或 16 EB 减去 1 字节)。