#Android防二次打包 懂得攻才能防
###如何二次打包
-
二次打包工具
反编译工具
apktool 反编译利器
dex2jar 将dex文件反编译成jar文件(java代码)工具,用于解读代码
gui 打开jar文件工具签名工具
apksign 给java程序签名的工具
testkey.pk8 teskkey.x509.pem用于签名的文件 -
二次打包原理
利用上面反编译工具可以看到apk中dex文件的汇编源码,也可以用apktool反编译出Smali(Dalvik识别的寄存器语言)源代码,篡改Smali源码之后重新打包之后,变成了一个全新的app。
具体实现可参考:二次打包实践 https://www.zhihu.com/question/41368839
###如何防止二次打包
完全杜绝二次打包基本是不可能,但是可以提升别人二次打包的难度
一. 验证签名文件
-
验证签名信息,由于验证签名信息的代码放在java文件里会被反编译修改,将验证签名的逻辑代码编译成so文件
-
若只是本地验证签名,依然会被反编译修改代码,所以建议加上一步服务端校验的步骤,例如:上传随时变更的加密签名
(注:可以现在客户端做一次验证;之后服务器配合验证,主要验证逻辑放在服务端。)
加密的签名中可以加入时间戳,DeviceID,这样每次加密只有的值不是固定的,别人无法模仿,也方便服务端做校验
校验之后的操作很重要:
服务端校验失败:
1. 不下发任何数据
2. 下发通知客户端,当前App已被二次打包
客户端被通知失败:
1. 服务端不下发任何数据时:
2. 服务端下发通知:客户端提醒用户,当前使用的App不是官方版本有危险。
二. 验证dex文件是否被修改
步骤:
-
应用正式打包待发布,对应用的.dex文件进行MD5,获取MD5之后的值
-
在App运行后,动态获取当前App的.dex文件的MD5值,并与发布App的.dex文件的MD5值进行比较,如果不相同表示App被人反编译修改了代码
-
运行时获取dex文件的MD5值并进行比较的逻辑需要放入so库中
(注:运行时获取apk的资源文件需要借助libzip库支持)