如何获取不带0x08074b50签名的12字节数据描述符真实ZIP文件
无0x08074b50签名的12字节数据描述符ZIP文件获取方法
工具生成方案
- Java内置
java.util.zip包生成:Java内置的ZIP输出流在未预设置文件大小、CRC值的场景下,触发写入的数据描述符默认不带0x08074b50签名,仅输出12字节的标准字段。可通过以下极简代码生成测试样本:
import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; public class NoSigZipGen { public static void main(String[] args) throws Exception { ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("no_sig_test.zip")); ZipEntry entry = new ZipEntry("demo.txt"); // 不提前设置大小、CRC,自动触发数据描述符写入 zos.putNextEntry(entry); zos.write("sample content for test".getBytes()); zos.closeEntry(); zos.close(); } }
- 旧版Info-ZIP命令行工具生成:3.0版本之前的Info-ZIP
zip命令,添加-fd参数强制启用数据描述符时,默认不会写入0x08074b50签名,直接输出12字节数据描述符,执行命令zip -fd test.zip test.txt即可生成样本。 - Python
zipfile库自定义生成:可手动修改zipfile库的写入逻辑,在写完文件压缩数据后,直接按顺序写入4字节CRC、4字节压缩后大小、4字节未压缩大小,跳过签名写入步骤即可得到符合要求的文件。
真实场景样本获取方案
- 收集旧版系统生成的ZIP文件:Windows XP自带的压缩文件夹功能、旧版本安卓系统内置压缩工具输出的流式ZIP,大多遵循原始ZIP规范,不带数据描述符签名。
- 筛选嵌入式/IoT设备生成的压缩包:很多低算力的IoT设备、嵌入式设备输出的日志压缩包、固件升级包,为了简化实现会直接使用无签名的12字节数据描述符结构。
- 开源软件旧版本发布包:部分早年的开源软件发布包使用旧压缩工具生成,也会出现无签名数据描述符的结构,你可以通过十六进制校验筛选:确认文件数据段结束后,后续12字节后紧跟下一个文件头
50 4B 03 04或中央目录头50 4B 01 02,且中间无50 4B 07 08序列即可。
校验提示:生成或找到样本后,建议用十六进制编辑器打开确认结构:数据描述符区域仅12字节,字段顺序符合
CRC32(4字节) → 压缩后大小(4字节) → 未压缩大小(4字节)的规范要求,无前置签名。
内容的提问来源于stack exchange,提问作者Michal Charemza
相关产品推荐
相关产品推荐

