创建一个flag.txt,内容为blog.yakumoran.top,并用7z压缩为zip,密码为123546,以下学习内容均以该zip为对象,以下学习内容适用于单个原文件大小不超过4g
zip实体文件头(Local File Header)
以下为实体文件头内容
| 偏移 | 偏移(hex) | 字节数 | 字段名称 |
|---|---|---|---|
| 0 | 0 | 4 | 签名 |
| 4 | 0x4 | 2 | 版本 |
| 6 | 0x6 | 2 | 通用位标志 |
| 8 | 0x8 | 2 | 压缩方法 |
| 10 | 0xA | 2 | 文件最后修改时间 |
| 12 | 0xC | 2 | 文件最后修改日期 |
| 14 | 0xE | 4 | CRC32校验 |
| 18 | 0x12 | 4 | 压缩后大小 |
| 22 | 0x16 | 4 | 压缩前大小 |
| 26 | 0x1A | 2 | 文件名称长度(n) |
| 28 | 0x1C | 2 | 扩展字段长度(m) |
| 30 | 0x1E | n | 文件名称 |
| 30+n | 0x1E+n | m | 扩展字段 |
以flag.zip为例

0~3字节固定为50 4B 03 04
4~5字节为14 00,为最低解压所需zip版本,这里为1.4
6~7字节为01 00通用位标识符,按小段存储转为二进制为 0000 0000 0000 0001,其中每一位二进制都代表一种信息,详细可以参考下表。示例zip只有bit0有内容为1意思就是压缩包加密
| 位编号(bit) | 含义 | 说明 |
|---|---|---|
| 0 | 加密标志 | 1为加密,0为未加密 |
| 1–2 | 压缩选项 | 对应压缩算法的附加选项 |
| 3 | 数据描述符标志 | 1 = CRC32、大小字段在数据后(Data Descriptor)而不是头部 |
| 4 | 增强压缩标志 | 仅用于 Deflate,指示采用更高的压缩算法 |
| 5 | 压缩方式 | 由特定算法定义 |
| 6 | 压缩方式 | 由特定算法定义 |
| 7 | 保留 | 未使用 |
| 8 | 文件名编码标志(UTF-8) | 1 = 文件名与注释字段使用 UTF-8 编码 |
| 9 | 强加密标志 | 1 = 使用 PKWare Strong Encryption |
| 10–11 | 压缩选项扩展 | 与压缩方式相关(如 AES) |
| 12 | 压缩补充标志 | 与 bzip2 等算法相关 |
| 13 | 加密头数据存在 | 一般在 AES 加密时设置 |
| 14–15 | 保留 | 通常为 0 |
8~9字节为00 00表示压缩算法,0为不压缩,常见的压缩算法包括:8 (Deflate)最常用的 ZIP 压缩方式,9 (Deflate64)改进版 Deflate,12 (BZIP2)压缩率较高,速度较慢,14 (LZMA)高压缩率,7-Zip 使用的核心算法,20 (Zstandard)现代高性能算法,ZIP 6.3+ 引入
A~B字节为3A 83表示文件最后修改时间,使用DOS 时间格式,这里为16时25分52秒
C~D字节为59 5B表示文件最后修改日期,使用DOS 时间格式,这里为2025.10.25
E~11字节为F4 25 20 07为压缩前源文件的crc32校验
12~15字节为26 00 00 00为压缩后大小0x26字节
16~19字节为1A 00 00 00为压缩前大小0x1A字节
1A~1B字节为08 00 为文件名称长度
1C~1D字节为00 00 为拓展字段长度
1E~25字节为66 6C 61 67 2E 74 78 74,共8字节,即为1A~1B所表示的长度,内容按ASCII进行转义极为flag.txt
之后的内容就是文件压缩后的内容
中心目录区(Central Directory)
以下为中心目录区的内容
目录结束标识