RAR

实例: enter image description here 标记块

5261     HEAD_CRC    所有块或块部分的 CRC 
72       HEAD_TYPE   块类型
21 1A    HEAD_FLAGS  块标记
07 00    HEAD_SIZE   块大小

压缩文件头

enter image description here

HEAD_CRC        2字节     HEAD_TYPE 到 RESERVED2 的 CRC 结构
HEAD_TYPE       1字节     头类型:0x73
HEAD_FLAGS      2字节     位标记:
                0x0001  - 卷属性(压缩文件卷)
                0x0002  - 压缩文件注释存在
                          RAR 3.x 使用分开的注释块,不设置这个标记。
                0x0004  - 压缩文件锁定属性
                0x0008  - 固实属性 (固实压缩文件)
                0x0010  - 新的卷命名法则 ('volname.partN.rar')
                0x0020  - 用户信息存在
                          RAR 3.x 不设置这个标记。
                0x0040  - 恢复记录存在
                0x0080  - 块头被加密
                0x0100  - 第一卷(只有 RAR 3.0 及以后版本设置)
                其中的其它位为内部使用保留
HEAD_SIZE       2字节     压缩文件头总大小(包括压缩文件注释)
RESERVED1       2字节     保留
RESERVED2       4字节     保留
此处头类型是73表示是压缩文件头块,位标记为00 00未有位被置1,如果块头被加密则位标记应为80 00,通过修改标记位为80 00可实现伪加密的功能

文件头 enter image description here

HEAD_CRC        2 字节        从 HEAD_TYPE 到 FILEATTR 的 CRC 结构和文件名
HEAD_TYPE       1 字节        头类型: 0x74
HEAD_FLAGS      2 字节        位标记:
                                0x01 - 文件在前一卷中继续
                                0x02 - 文件在后一卷中继续
                                0x04 - 文件使用密码加密
                                0x08 - 文件注释存在
                                RAR 3.x 使用分开的注释块,不设置这个标记。
                                0x10 - 前一文件信息被使用(固实标记)
                                (对于 RAR 2.0 和以后版本)
                                7 6 5 位(对于 RAR 2.0 和以后版本)
                                0 0 0    - 字典大小   64 KB
                                0 0 1    - 字典大小  128 KB
                                0 1 0    - 字典大小  256 KB
                                0 1 1    - 字典大小  512 KB
                                1 0 0    - 字典大小 1024 KB
                                1 0 1    - 字典大小 2048 KB
                                1 1 0    - 字典大小 4096 KB
                                1 1 1    - 文件作为字典
                                0x100 - HIGH_PACK_SIZE 和 HIGH_UNP_SIZE 结构存在。这些结构仅
                         用在非常大(大于 2GB)的文档,对于小文件这些结构不存在。[9]
                                0x200 - FILE_NAME 包含用 0隔开的普通的和 Unicode 编码的文件名。
                  所以 NAME_SIZE 结构长度等于普通文件名的长度加 Unicode 
                  编码文件名的长度再加1。
                  如果此标记存在,单 FILE_NAME 不包含 0 字节,它意味文件
                  使用 UTF-8 编码。[10]
                                0x400 - 头在文件名后包含附加的8位,它对于增加加密的安全性是必需
                  的。(所谓的'Salt')。
                                0x800 - 版本标记。他是老文件版本,版本号作为';n'附加到文件名后。
                                0x1000 - 扩展时间区域存在。
                                0x8000 -此位总被设置,所以完整的块的大小是HEAD_SIZE+ PACK_SIZE
                                (如果 0x100 位被设置,再加上 HIGH_PACK_SIZE)
HEAD_SIZE       2字节     文件头的全部大小(包含文件名和注释)
PACK_SIZE       4字节     已压缩文件大小
UNP_SIZE        4字节     未压缩文件大小
HOST_OS         1字节     保存压缩文件使用的操作系统
                            0 - MS DOS
                            1 - OS/2
                                2 - Win32
                                3 - Unix
                                4 - Mac OS
                                5 - BeOS
FILE_CRC        4字节     文件 CRC
FTIME           4字节     MS DOS 标准格式的日期和时间
UNP_VER         1字节     解压文件所需要最低 RAR 版本
                         版本编码方法 10 * 主版本 + 副版本。
METHOD          1字节     压缩方式
                    0x30 - 存储
                    0x31 - 最快压缩
                    0x32 - 快速压缩
                    0x33 - 标准压缩
                    0x34 - 较好压缩
                    0x35 - 最好压缩
NAME_SIZE       2字节     文件名大小
ATTR                4字节     文件属性
HIGH_PACK_SIZE      4字节
压缩文件大小 64 位值的高4字节。可选值,只有 HEAD_FLAGS 中的0x100 位被设置才存在。[11]
HIGH_UNP_SIZE       4字节
未压缩文件大小64位值的高4字节。可选值,只有 HEAD_FLAGS 中的0x100 位被设置才存在。
FILE_NAME       文件名 - NAME_SIZE 字节大小字符串
SALT[12]            8字节     如果 (HEAD_FLAGS & 0x400) != 0 则存在
EXT_TIME            可变大小    如果 (HEAD_FLAGS & 0x1000) != 0 则存在
文件头的头类型为74,修改其为任意数值可达到在压缩包内隐藏相应文件的目的

在这个块中,存在两个crc值,一个是文件头块中从位标记到文件名这42个字节的校验,后一个则是压缩包中所含文件的crc校验,解压时,会计算解压后生成文件的crc值,如果等于这里的crc,则解压完成,如果不同,则报错中断

结尾块

C4 3D           HEAD_CRC        2字节     从HEAD_TYPE到HEAD_SIZE的crc校验值
7B              HEAD_TYPE       1字节     头类型
00 40           HEAD_FLAGS      2字节     位标记
07 00           HEAD_SIZE       2字节     注释头大小