关于各类压缩算法的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

希望能帮到大家。(转发请注明来源)


关于各类压缩算法的Head特征探究
http://spiderx.cc/2024/07/29/关于各类压缩算法的Head特征探究/
作者
Li Pengbo
发布于
2024年7月29日
许可协议