zip伪加密

0x01、原理

zip伪加密是在文件头的加密标志位做修改,进而再打开文件时识被别为加密压缩包。

0x02、zip结构

一个 ZIP 文件由三个部分组成:

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志

1、压缩源文件数据区
在这个数据区中每一个压缩的源文件/目录都是一条记录,记录的格式如下:

文件头+ 文件数据 + 数据描述符

a、文件头结构

   组成                     长度
文件头标记                   4 bytes  (0x04034b50)
解压文件所需 pkware 版本      2 bytes
全局方式位标记                2 bytes
压缩方式                     2 bytes
最后修改文件时间              2 bytes
最后修改文件日期              2 bytes
CRC-32校验                  4 bytes
压缩后尺寸                   4 bytes
未压缩尺寸                   4 bytes
文件名长度                   2 bytes
扩展记录长度                 2 bytes                                文件名                     (不定长度)
扩展字段                   (不定长度)

b、文件数据

c、数据描述符

   组成              长度
CRC-32校验          4 bytes
压缩后尺寸           4 bytes
未压缩尺寸           4 bytes

2、压缩源文件目录区

在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据

   组成                长度
  目录中文件文件头标记             4 bytes  (0x02014b50)
  压缩使用的 pkware 版本          2 bytes
  解压文件所需 pkware 版本         2 bytes
  全局方式位标记                   2 bytes
  压缩方式                        2 bytes
  最后修改文件时间                 2 bytes
  最后修改文件日期                 2 bytes
  CRC-32校验                 4 bytes
  压缩后尺寸                      4 bytes
  未压缩尺寸                      4 bytes
  文件名长度                      2 bytes
  扩展字段长度                    2 bytes
  文件注释长度                    2 bytes
  磁盘开始号                      2 bytes
  内部文件属性                    2 bytes
  外部文件属性                    4 bytes
局部头部偏移量                  4 bytes
  文件名                       (不定长度)
  扩展字段                     (不定长度)
文件注释                     (不定长度)

3、压缩源文件目录结束标志

 组成                          长度
目录结束标记                    4 bytes  (0x02014b50)
当前磁盘编号                    2 bytes
目录区开始磁盘编号              2 bytes
  本磁盘上纪录总数                 2 bytes
  目录区中纪录总数                 2 bytes
  目录区尺寸大小                   4 bytes
  目录区对第一张磁盘的偏移量        4 bytes
  ZIP 文件注释长度                 2 bytes
  ZIP 文件注释                   (不定长度)

0x03、实例分析

压缩源文件数据区: 
50 4B 03 04:这是头文件标记(0x04034b50) 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密) 
08 00:压缩方式 
9D AE:最后修改文件时间 
25 49:最后修改文件日期 
F2 EC 52 25:CRC-32校验(1480B516) 
4D 03 00 00:压缩后尺寸(25) 
69 06 00 00:未压缩尺寸(23) 
10 00:文件名长度 
00 00:扩展记录长度 
6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500 

压缩源文件目录区:

50 4B 01 02:目录中文件文件头标记(0x02014b50) 
3F 00:压缩使用的 pkware 版本 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改为09 00打开就会提示有密码了) 
08 00:压缩方式 
1C 51:最后修改文件时间 
08 49:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
24 00:扩展字段长度 
00 00:文件注释长度 
00 00:磁盘开始号 
00 00:内部文件属性 
20 00 00 00:外部文件属性 
00 00 00 00:局部头部偏移量 
B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001

压缩源文件目录结束标志:

50 4B 05 06:目录结束标记 
00 00:当前磁盘编号 
00 00:目录区开始磁盘编号 
01 00:本磁盘上纪录总数 
01 00:目录区中纪录总数 
63 00 00 00:目录区尺寸大小 
2B D8 05 00:目录区对第一张磁盘的偏移量 
00 00:ZIP 文件注释长度

0x04、结果

所以如果把一个zip文件的文件头或者加密标志位进行适当修改,那就可能会改变文件的可读性
在压缩源文件目录区,将全局方式位标记的数字进行修改,偶数为未加密模式,奇数为伪加密模式。