由于经常分析apk,apk的格式就是zip,遇到了一些关于zip格式的问题,所以记录一下zip格式相关的问题,具体格式解析到处都有
附上官方文档:https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt
1 加了密码的的APK
apk有密码肯定是无法安装的,所以用解压缩工具打开apk文件时,提示要密码,肯定是密码标志位被修改了。
正常的标志位在504b0102后面第5、6个字节
十六进制
50 4B 01 02 0A 00 0A 00 00 00
-- -- -- -- -- -- -- -- ^^ ^^ 箭头所指的两个字节
最简单的方法就是搜索50 4B 01 02
直接吧后面这两个字节改为00 00
真正标记是否加密只用到了一个bit,两个字节共16个bit,最低位表示是否加密
二进制
0000 0000 0000 0000
---- ---- ---- ---^ 1表示加密了
2 multi disk
zip格式很老,很久以前用软盘、光盘存数据时,由于容量限制,一个zip可能要分几个软盘存储,所以文件格式中有记录当前磁盘序号的内容
官方文档搜索06054b50(zip文件尾部的标记),可以看到紧接着的两个字节就是number of this disk
,标记了当前是第几个磁盘,接下来的两个字节标记了zip文件是从第几个磁盘开始的。
现在已经不需要分磁盘存储zip了,所以一般的zip文件这里都是00 00 00 00
,有些apk为了对抗分析,就吧这个值修改一下,部分分析工具使用的是专门解析zip格式(没有专门针对apk优化过)的库来解压apk,就没法正常分析了。
搜索50 4B 05 06
吧后面的这几个字节改成00 00 00 00
就行了
3 Entries数量不对
有些apk用jeb打开后,无法正常解析,报错Expected an int at offset 336020Fh
而这个offset,就是apk的末尾,用010打开后用zip模板解析,最后的zip尾部结构如下图,第4,5个数字都是Entries数量,OnDisk可以猜出是在当前软盘的Entries数量(参见上面的multi disk),但是现在已经不用软盘,zip都是在一个硬盘中存储,所以这个数量与下面的InDirectory的数量应该保持一致。EntriesOnDisk数量修改成2322后即可正常解析apk。