我们知道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伪加密就是修改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歌增量升级方案