关于各类压缩算法的Head特征探究
本文最后更新于 2024年7月31日 上午
背景
在一年多以前,我在公众号发过一个简单的文件头和对应压缩算法的标示,这次一方面进行勘误,一方面进行扩展说明。
为什么我们需要了解文件头的特征,也是为了我们在爬虫/逆向过程中对数据足够敏感,当看见特征数据时第一时间猜想到数据来源而不用继续逆向研究。
勘误
这是我之前发在公众号的图片:

以下是这次最新的结果,欢迎保存:

详细过程
lzma
其中有错误的是lzma算法的文件头,这次我重新进行了校验。
根据lzma压缩接口得知,首先lzma支持两种常见的模式:FORMATALONE和FORMATXZ(FORMAT_RAW因需要特指filter暂不讨论),以下是校验结果。

可知,对于lzma压缩而言,FORMATXZ模式下会有明显的7zXZ字符头,FORMATALONE则是5D 00开头,并未发现之前的6C 00的文件头(如有不详欢迎讨论)。
gzip
对于gzip原标示是准确的,如下:

对于不同的压缩级别,文件头均为1F 8B。
zlib
之前写的zlib的文件头为78 9C,这是没错却不全面的,最近研究才发现,zlib压缩支持比较多的压缩模式、策略,我测试过之后总结了28种文件头,这显然不是我们希望的,如果这样就失去了记忆文件头的意义。所以我还是建议大家记忆78 9C,对于其他非默认的压缩,则通过了解其压缩解压参数之后灵活应对。
解压时,我们需要着重关注两个参数:

data是我们bytes类型的待解压字节流,wbits则是支持各类压缩的控制参数,使用如下:

简单记忆为,+9~+15时用于解压zlib压缩格式,这也是默认的参数,这时zlib会判断data的头是否包含特定格式,如果不包含则报错。-9~-15时,压缩结果不包含特定的头,这时一般用于解压Deflater压缩。+25~+31时,用于解压gzip压缩。如下。

如此。就有了开头那张图。
END
希望能帮到大家。(转发请注明来源)