安卓APK如何防止二次打包?

安卓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加固全面、安全编译器易用、行业覆盖度最广等优势。