这篇文章来自天猫无线-基础业务团队童鞋的投稿。
他们之前投稿过一篇《Android App 安全的 HTTPS 通信》,建议大家到历史记录看看。
Android 使用的 Apk 包的压缩方式是 zip,与 zip 有相同的文件结构,在 zip 文件的末尾有一个 Central Directory Record 区域,其末尾包含一个 File comment 区域,可以存放一些数据,所以 File comment 是 zip 文件一部分,如果可以正确的修改这个部分,就可以在不破坏压缩包、不用重新打包的的前提下快速的给 Apk 文件写入自己想要的数据。
comment 是在 Central Directory Record 末尾储存的,可以将数据直接写在这里,下表是 header 末尾的结构。
从表中可以看到定义 comment 长度的字段位于 comment 之前,当我们从文件最后开始读取时,由于 comment 数据是不确定的,我们无法知道它的长度,从而也无法从 zip 中直接获取 Comment length。
这里我们需要自定义 comment,在自定义 comment 内容的后面添加一个区域储存 comment 的长度,结构如下图。
这里可以将一个固定的结构写在 comment 中,然后根据自定义的长度分区获取每个部分的内容,还可以添加其它数据,如校验码、版本等。
return null;
}
获取 Apk 路径之后就可以读取 comment 的内容了,这里不能直接使用 ZipFile中的getComment() 方法直接获取 comment,因为这个方法是 Java7 中的方法,在 android4.4 之前是不支持 Java7 的,所以我们需要自己去读取 Apk 文件中的 comment。
首先根据之前自定义的结构,先读取写在最后的 comment 的长度,根据这个长度,才可以获取真正 comment 的内容,代码如下:
安装这个 Apk 之后运行,让 comment 显示在屏幕上,运行结果如下。
运行结果符合预期,安装包也没有被破坏,可以正常安装。
微信扫一扫
关注该公众号