安卓APK被二次打包是开发者经常碰到的安全危险,本文介绍了几种常见的APK对抗二次打包的方案。
首先需要通过对二次打包流程的了解,知道二次打包是怎么做的。APK二次打包流程:破解者需要对APK文件做反编译分析,反编译为smali代码,并对某些关键函数或者资源进行修改,再回编译为apk文件并重签名。
对开发者来说有以下几种常见的对抗二次打包的方案:
1.签名校验
原理:二次打包会篡改签名,通过签名前后的变化可以检测是否被二次打包;
实现形式:
(1)本地校验(将APK原始签名的值保存在代码或者资源中,运行时本地代码里校验,不相等则证明被二次打包,最好放到jni层实现)
(2)联网校验(联网时获取服务端签名值,如果校验不成功则证明被二次打包)
缺点:容易被HOOK patch掉
2.文件校验
原理:二次打包前后apk关键文件hash值比较,判断是否被修改;
实现形式:也可以对应像签名校验一样有本地校验和联网校验两种形式;
缺点:容易被HOOK patch掉。
3.核心函数转为jni层实现
原理:java层代码转为jni层实现,jni层代码相对而言篡改难度更大;
实现形式:需要开发者自行在jni层实现代码。替代java层逻辑;
缺点:jni层代码开发效率较低,可能会写大量反射代码降低了开发效率。
4.APK加固+核心方法保护
原理:通过对APK加固增加反编译难度,对核心函数进行保护隐藏具体实现,同时可以应用以上三种对抗二次打包的形式
实现形式:
(1)DEX整体加固,对dex文件加壳并做指令抽取处理;
(2)使用vmp或者java2c方案,实现方法级加密,被保护的方法运行于被保护的so中。
最后,如果需要专业的Android防止二次打包服务, 可以使用网易易盾移动加固服务。网易易盾拥有业内领先的加固技术,加固精度细化至函数级,针对全网以及市面上各种各样的破解技术,易盾投入大量的研发精力不断迭代加固技术。易盾的加固具有兼容性高、性能影响小、安全度高、防反编译强度高、SDK加固全面、安全编译器易用、行业覆盖度最广等优势。