原文:https://blog.csdn.net/hp910315/article/details/77717746
我们知道android的apk文件实质就是一个zip文件,所以对于zip文件的研究是非常有必要的。
一、Zip文件结构
1、Zip文件可以包含多个使用不同压缩方式甚至不压缩的文件。
2、File Entry表示一个文件实体,一个压缩文件中有多个文件实体
3、文件实体由一个头部、文件数据和数据描述符组成(压缩后的,压缩算法在头部有说明)
4、Central Directory由多个File header组成,每个File header都保存一个文件实体的偏移
5、文件最后由一个叫End of central directory的结构结束
从上面可以知道可以通过Central Directory中的File header确定每个文件实体的位置,并且可以通过遍历Central Directory获取File header的个数来确定文件实体的个数。
---------------------------------------
[local file header 1] |
[file data 1] File Entry 1
[data descriptor 1] |
---------------------------------------
.
.
.
---------------------------------------
[local file header n] |
[file data n] File Entry n
[data descriptor n] |
---------------------------------------
[File header 1] |
[central directory]
[File header n] |
---------------------------------------
[end of central directory record]
---------------------------------------
1.1. File Entry结构
1.1.1. local file header 文件头
1.1.2.file data 文件数据
记录了相应压缩文件的数据
1.1.3.data descriptor 数据描述符
用于标识该文件压缩结束,该结构只有在相应的local file header中通用标记字段的第3bit设为1时才会出现,紧接在压缩文件源数据后。
1.2. Central Directory
1.2.1. File Header
1.3. End of central directory record
参考文章:
Zip文件结构
ZIP文件格式分析
二、Zip伪加密
Zip伪加密就是修改Central Directory中的文件的文件头File Header的标志位,如下图所示。
50 4B 01 02:目录中文件文件头标记(0x02014b50)
1F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
00 00:全局方式位标记(有无加密,00 00 改为09 00或者01 00即可完成伪加密)
08 00:压缩方式
07 76:最后修改文件时间
F2 48:最后修改文件日期
......
......
在Android应用保护中之前被用到,因为Android系统对于Apk的解析中跳过了文件头,所以当这个字段修改为加密的时候,就可以防止apk被人解压,但是不会影响apk的安装。但是这个漏洞的利用在android4.3之后就不行了
参考文章:
Apk伪加密实现与破解JAVA源码
APK伪加密制作和解密
classes.dex有密码保护,无法解压出来
zip相关加密破解总结
三、zip注释字段的利用
在zip文件的文件末尾有两个字段Comment length和Comment,分别表示注释长度和注释内容,在我们的apk中Comment length为0,Comment为空,我们可以在Comment中追加我们需要的内容,例如渠道号,但是它不会对apk造成破坏,下图所示。
全面K歌app的增量升级方案使用的就是这个来为apk添加渠道号,这样就可以在一个apk写入不同的渠道号进行下发而不需要编译多个apk下发。
参考文章:
全民K歌增量升级方案