记录一下一些东西咯(指搞MISC太难了,只能慢慢来~~

zip 格式说明


zip 官方文档

​ 该文参考了关于官方在 2004.04.26 发布的 6.2.0 版本的zip格式(地址:https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt)

​ emmm,表格似乎看不清啊!问题不大我弄了一个pdf的链接:http://175.24.114.225/2020-12-16.pdf

​ 首先看以下的摘录:

Overall .ZIP file format:

Overall .ZIP file format:

    [local file header 1]
    [file data 1]
    [data descriptor 1]
    . 
    .
    .
    [local file header n]
    [file data n]
    [data descriptor n]
    [archive decryption header] (EFS)
    [archive extra data record] (EFS)
    [central directory]
    [zip64 end of central directory record]
    [zip64 end of central directory locator] 
    [end of central directory record]

​ 对应的指代分别为

[local file header 1]	->	文件标头
[file data 1]	->	文件数据
[data descriptor 1]	->	数据描述符
. 
.
.
[local file header n]	->	第n个文件标头
[file data n]	->	第n个文件数据
[data descriptor n]	->	第n个数据描述符
[archive decryption header] (EFS)	->	存档解密头(EFS)
[archive extra data record] (EFS)	->	存档额外数据记录(EFS)
[central directory]	->	中心目录
[zip64 end of central directory record]	->	zip64中心目录记录结尾
[zip64 end of central directory locator] 	->	zip64中心目录定位器结尾
[end of central directory record]	->	中心目录记录结尾

​ 其中,[local file header][file data]以及[data descriptor]都是可以重复多次的(理论上说每压缩一个文件,这 3个 片段都会重复一遍)。

​ 而在咱们的操作系统上,一个简单的 .zip 格式实际上为 [local file header] + [file data] + [data descriptor] + [central directory] + [end of central directroy record],对没错就是这些emmm:

  • 文件标头

  • 文件数据

  • 数据描述符(于标识该文件压缩结束,该结构只有在相应的header中通用标记字段的第3位设为1时才会出现,紧接在压缩文件源数据后。这个数据描述符只用在不能对输出的 ZIP 文件进行检索时使用。例如:在一个不能检索的驱动器(如:磁带机上)上的 ZIP 文件中。如果是磁盘上的ZIP文件一般没有这个数据描述符。)

  • 中心目录

  • 中心目录记录结尾

​ 然后现在来简单的说一下这四个格式呗。


简单的 .zip 格式

[local file header] -> 文件标头:

Local file header:

        local file header signature     4 bytes  (0x04034b50)	->	文件标头,占用4个字节 (在winhex中相当于 504B0304)
        version needed to extract       2 bytes	->	解压所需 `pkware` 最低版本,占用2个字节
        general purpose bit flag        2 bytes	->	通用位标记符,占用2个字节(一般用作判断是否加密)
        compression method              2 bytes	->	压缩方法,占用2个字节
        last mod file time              2 bytes	->	文件最后修改时间,占用2个字节(24小时制)
        last mod file date              2 bytes	->	文件最后修改日期,占用2个字节
        crc-32                          4 bytes	->	校验码,占用4个字节
        compressed size                 4 bytes	->	压缩后的大小,占用4个字节
        uncompressed size               4 bytes	->	压缩前的大小,占用4个字节
        file name length                2 bytes	->	文件名长度,占用2个字节
        extra field length              2 bytes	->	扩展区长度,占用2个字节

        file name (variable size)	->	存文件名的位置,占用 [文件名长度] 的字节
        extra field (variable size)	->	存扩展内容的位置,占用 [扩展区长度] 的字节
Offset Bytes Description
0 4 Local file header signature = 0x04034b50 (read as a little-endian number) 文件头标识,值固定(0x04034b50)
4 2 Version needed to extract (minimum) 解压文件所需 pkware 最低版本
6 2 General purpose bit flag 通用比特标志位(置比特0位=加密,详情见后)
8 2 Compression method 压缩方式
10 2 File last modification time 文件最后修改时间
12 2 File last modification date 文件最后修改日期
14 4 CRC-32 CRC-32校验码
18 4 Compressed size 压缩后的大小
22 4 Uncompressed size 压缩前的大小
26 2 File name length (n) 文件名长度
28 2 Extra field length (m) 扩展区长度
30 n File name 文件名
30+n m Extra field 扩展区

[file data] -> 文件数据:

Immediately following the local header for a file
      is the compressed or stored data for the file. 
      The series of [local file header][file data][data
      descriptor] repeats for each file in the .ZIP archive. 
      
# emmm,姑且当作是文件压缩的内容或存储的内容好了

[data descriptor] -> 数据描述符:

data descriptor:
    
		data descriptor signature     4bytes	(0x08074b50)	->	数据描述符标头,占用4个字节 (在winhex中相当于 504B0708)
        crc-32                          4 bytes	->	校验码,占用4个字节
        compressed size                 4 bytes	->	压缩后的大小,占用4个字节
        uncompressed size               4 bytes	->	压缩前的大小,占用4个字节
        
Offset Bytes Description
0 4 crc-32 CRC-32校验码
4 4 compressed size 压缩后的大小
8 4 uncompressed size 压缩前的大小

[central directory] -> 中心目录:

Central directory structure:

     [file header 1]	->	这里相当于说,有多少个文件被压缩,就有多少个 [file header](相对于 [central directory] 来说的标头)
     .
     .
     . 
     [file header n]
     [digital signature]	->	emmm,这应该是6.2新引入的对中心目录结构的压缩加密存储的签名记录吧,不是很清楚,总之简单的zip文件是没有这玩意的

     File header:

       central file header signature   4 bytes  (0x02014b50)	->	中心目录文件标头,占用4个字节(在winhex中相当于 504B0201)
       version made by                 2 bytes	->	压缩所用的 pkware 版本,占用2个字节
       version needed to extract       2 bytes	->	解压所需 pkware 的最低版本,占用2个字节
       general purpose bit flag        2 bytes	->	通用位标记符,占用2个字节(一般用作判断是否加密)
       compression method              2 bytes	->	压缩方法,占用2个字节
       last mod file time              2 bytes	->	文件最后修改时间,占用2个字节(24小时制)
       last mod file date              2 bytes	->	文件最后修改日期,占用2个字节
       crc-32                          4 bytes	->	校验码,占用4个字节
       compressed size                 4 bytes	->	压缩后的大小,占用4个字节
       uncompressed size               4 bytes	->	压缩前的大小,占用4个字节
       file name length                2 bytes	->	文件名长度,占用2个字节
       extra field length              2 bytes	->	扩展区长度,占用2个字节
       file comment length             2 bytes	->	文件注释长度,占用2个字节
       disk number start               2 bytes	->	文件开始位置的磁盘编号,占用2个字节
       internal file attributes        2 bytes	->	内部文件属性,占用2个字节
       external file attributes        4 bytes	->	外部文件属性,占用2个字节
       relative offset of local header 4 bytes	->	本地文件标头即是[local file header]相对偏移量,占用4个字节

       file name (variable size)	->	存文件名的位置,占用 [文件名长度] 的字节
       extra field (variable size)	->	存扩展内容的位置,占用 [扩展区长度] 的字节
       file comment (variable size)	->	存文件注释的位置,占用 [文件注释长度] 的字节

     Digital signature:

       header signature                4 bytes  (0x05054b50)	->	数字签名标头,占用4个字节(在winhex中相当于 504b0505)
       size of data                    2 bytes	->	数字签名长度,占用2个字节
       signature data (variable size)	->	存数字签名的位置,占用 [数字签名长度] 的字节

     With the introduction of the Central Directory Encryption 
     feature in version 6.2 of this specification, the Central 
     Directory Structure may be stored both compressed and encrypted. 
     Although not required, it is assumed when encrypting the
     Central Directory Structure, that it will be compressed
     for greater storage efficiency.  Information on the
     Central Directory Encryption feature can be found in the section
     describing the Strong Encryption Specification. The Digital 
     Signature record will be neither compressed nor encrypted.
Offset Bytes Description
0 4 Central directory file header signature = 0x02014b50 中心目录文件header标识=(0x02014b50)
4 2 Version made by 压缩所用的 pkware 版本
6 2 Version needed to extract (minimum) 解压所需 pkware 的最低版本
8 2 General purpose bit flag 通用位标记
10 2 Compression method 压缩方法
12 2 File last modification time 文件最后修改时间
14 2 File last modification date 文件最后修改日期
16 4 CRC-32 CRC-32校验码
20 4 Compressed size 压缩后的大小
24 4 Uncompressed size 压缩前的大小
28 2 File name length (n) 文件名长度
30 2 Extra field length (m) 扩展区长度
32 2 File comment length (k) 文件注释长度
34 2 Disk number where file starts 文件开始位置的磁盘编号
36 2 Internal file attributes 内部文件属性
38 4 External file attributes 外部文件属性
42 4 relative offset of local header 本地文件标头即是[local file header]相对偏移量
46 n File name 目录文件名
46+n m Extra field 扩展区
46+n+m k File comment 文件注释内容

[end of central directroy record] -> 中心目录记录结尾:

End of central directory record:

        end of central dir signature    4 bytes  (0x06054b50)	->	中心目录结尾标头,占用4个字节(在winhex中相当于 504B0605)
        number of this disk             2 bytes	->	当前的磁盘号,占用2个字节
        
        number of the disk with the
        start of the central directory  2 bytes	->	中心目录开始位置的磁盘号,占用2个字节
        
        total number of entries in the
        central directory on this disk  2 bytes	->	该磁盘上所记录的中心目录数量,占用2个字节
        
        total number of entries in
        the central directory           2 bytes	->	中心目录实体总数,占用2个字节
        
        size of the central directory   4 bytes	->	中心目录的大小,占用4个字节
        
        offset of start of central
        directory with respect to
        the starting disk number        4 bytes	->	中心目录起始位置相对于起始磁盘号的偏移量,占用4个字节
        
        .ZIP file comment length        2 bytes	->	.zip文件注释长度,占用2个字节
        .ZIP file comment       (variable size)	->.zip文件注释的位置,占用 [.zip文件注释长度] 的字节
        
Offset Bytes Description
0 4 End of central directory signature = 0x06054b50 中心目录结束标记(0x06054b50)
4 2 Number of this disk 当前磁盘编号
6 2 number of the disk with the start of the central directory 中心目录开始位置的磁盘编号
8 2 total number of entries in the central directory on this disk 该磁盘上所记录的中心目录数量
10 2 total number of entries in the central directory 中心目录结构总数
12 4 Size of central directory (bytes) 中心目录的大小
16 4 offset of start of central directory with respect to the starting disk number 中心目录起始位置相对于起始磁盘号的偏移量
20 2 .ZIP file comment length(n) 注释长度
22 n .ZIP Comment 注释内容

​ (表格摘自:https://blog.csdn.net/a200710716/article/details/51644421


简单的实例:

压缩 yyds.txt 以及 trytry.txt(未加密):

​ 文件内容如下图:

image-20201226125903450.png

​ 将这两个文件压缩好了,然后使用 010 edior 来查看,得到如下图:

image-20201226130222027.png

​ 那么,用简单的表格来分析一下:

Offset Start End Bytes Content Description
Local File Header
LOCAL FILE HEADER 1
0000h 0000h 0004h 4 50 4B 03 04 (trytry.txt) 文件标头
0004h 0005h 0006h 2 14 00 解压文件所需 pkware 最低版本
0006h 0007h 0008h 2 00 00 通用位标记符
0008h 0009h 000Ah 2 08 00 压缩方式
000Ah 000Bh 000Ch 2 3C 67 文件最后修改时间
000Ch 000Dh 000Eh 2 9A 51 文件最后修改日期
000Eh 000Fh 0012h 4 6C 84 7D BE crc-32校验码
0012h 0013h 0016h 4 06 00 00 00 压缩后的大小
0016h 0017h 001Ah 4 09 00 00 00 压缩前的大小
001Ah 001Bh 001Ch 2 0A 00 文件名长度
001Ch 001Dh 001Eh 2 00 00 扩展区长度
001Eh 001Fh 0027h 10 74 72 79 74 72 79 2E 74 78 74 文件名内容
0027h 0027h 0027h 0 Null 扩展区内容
FILE DATA 1
0027h 0028h 002Dh 6 2B 29 AA 84 20 00 (trytry.txt) 文件数据
DATA DESCRIPTOR 1
002Dh 002Dh 002Dh 0 Null (trytry.txt) 数据描述符
LOCAL FILE HEADER 2
002Eh 002Eh 0031h 4 50 4B 03 04 (yyds.txt) 文件标头
0031h 0032h 0033h 2 14 00 解压文件所需 pkware 的最低版本
0033h 0034h 0035h 2 00 00 通用位标记符
0035h 0036h 0037h 2 08 00 压缩方式
0037h 0038h 0039h 2 37 67 文件最后修改时间
0039h 003Ah 003Bh 2 9A 51 文件最后修改日期
003Ch 003Ch 003Fh 4 D3 4F 70 57 crc-32校验码
003Fh 0040h 0043h 4 0A 00 00 00 压缩后的大小
0043h 0044h 0047h 4 16 00 00 00 压缩前的大小
0047h 0048h 0049h 2 08 00 文件名长度
0049h 004Ah 004Bh 2 00 00 扩展区长度
004Bh 004Ch 0053h 8 79 79 64 73 2E 74 78 74 文件名内容
0053h 0053h 0053h 0 Null 扩展区内容
FILE DATA 2
0053h 0054h 005Dh 10 CB 48 84 42 30 51 91 09 81 00 (yyds.txt) 文件数据
DATA DESCRIPTOR 2
005Dh 005Dh 005Dh 0 Null (yyds.txt) 数据描述符
Central Directory Header
FILE HEADER 1
005Eh 005Eh 0061h 4 50 4B 01 02 (trytry.txt) 中心目录文件标头
0061h 0062h 0063h 2 3F 00 压缩所用的 pkware 版本
0063h 0064h 0065h 2 14 00 解压所需 pkware 的最低版本
0065h 0066h 0067h 2 00 00 通用位标记
0067h 0068h 0069h 2 08 00 压缩方法
0069h 006Ah 006Bh 2 3C 67 文件最后修改时间
006Bh 006Ch 006Dh 2 9A 51 文件最后修改日期
006Dh 006Eh 0072h 4 6C 84 7D BE crc-32校验码
0072h 0073h 0075h 4 06 00 00 00 压缩后的大小
0075h 0076h 0079h 4 09 00 00 00 压缩前的大小
0079h 007Ah 007Bh 2 0A 00 文件名长度
007Bh 007Ch 007Dh 2 24 00 扩展区长度
007Dh 007Eh 007Fh 2 00 00 文件注释长度
007Fh 0080h 0081h 2 00 00 文件开始位置的磁盘编号
0081h 0082h 0083h 2 00 00 内部文件属性
0083h 0084h 0087h 4 20 00 00 00 外部文件属性
0087h 0088h 008Bh 4 00 00 00 00 本地文件标头即是***[LOCAL FILE HEADER 1]相对偏移量(offset值)*
008Bh 008Ch 0095h 10 74 72 79 74 72 79 2E 74 78 74 文件名内容
0095h 0096h 00B9h 36 0A 00 20 00 00 00 00 00 01 00 18 00 02 E7 7A AC 43 DB D6 01 16 37 CE AC 43 DB D6 01 91 A8 31 A8 43 DB D6 01 扩展区内容
00B9h 00B9h 00B9h 0 Null 文件注释内容
FILE HEADER 2
00BAh 00BAh 00BDh 4 50 4B 01 02 (yyds.txt) 中心目录文件标头
00BDh 00BEh 00BFh 2 3F 00 压缩所用的 pkware 版本
00BFh 00C0h 00C1h 2 14 00 解压所需 pkware 的最低版本
00C1h 00C2h 00C3h 2 00 00 通用位标记
00C3h 00C4h 00C5h 2 08 00 压缩方法
00C5h 00C6h 00C7h 2 37 67 文件最后修改时间
00C7h 00C8h 00C9h 2 9A 51 文件最后修改日期
00C9h 00CAh 00CDh 4 D3 4F 70 57 crc-32校验码
00CDh 00CEh 00D1 4 0A 00 00 00 压缩后的大小
00D1 00D2 00D5h 4 16 00 00 00 压缩前的大小
00D5h 00D6h 00D7h 2 08 00 文件名长度
00D7h 00D8h 00D9h 2 24 00 扩展区长度
00D9h 00DAh 00DBh 2 00 00 文件注释长度
00DBh 00DCh 00DDh 2 00 00 文件开始位置的磁盘编号
00DDh 00DEh 00DFh 2 00 00 内部文件属性
00DFh 00E0h 00E3 4 20 00 00 00 外部文件属性
00E3h 00E4h 00E7h 4 2E 00 00 00 本地文件标头即是***[LOCAL FILE HEADER 2]相对偏移量(offset值)*
00E7h 00E8h 00EFh 8 79 79 64 73 2E 74 78 74 文件名内容
00EFh 00F0h 0113h 36 0A 00 20 00 00 00 00 00 01 00 18 00 FC D9 0F A6 43 D8 D6 01 CE C7 48 B2 43 DB D6 01 48 1E AE 67 43 DB D6 01 扩展区内容
0113h 0113h 0113h 0 Null 文件注释内容
end of central directroy record
END
0114h 0114h 0117h 4 50 4B 05 06 中心目录结束标头
0117h 0118h 0119h 2 00 00 当前磁盘号
0119h 011Ah 011Bh 2 00 00 中心目录开始位置的磁盘编号
011Bh 011Ch 011Dh 2 02 00 该磁盘上所记录的中心目录实体数量
011Dh 011Eh 011Fh 2 02 00 中心目录实体总数
011Fh 0120h 0123h 4 B6 00 00 00 中心目录的大小
0123h 0124h 0127h 4 5E 00 00 00 中心目录起始位置相对于初始磁盘号的偏移量
0127h 0128h 0129h 2 00 00 .zip文件注释长度
0129h 0129h 0129h 0 Null .zip文件注释内容

​ 后边再把加密补上吧!!!