基本上,有 5 种方法可以保护您的 APK 被破解/逆向/重新打包:
1. 隔离Java程序
最简单的办法就是让用户无法访问Java Class程序。这是最根本的方式,它有多种具体的实现方式。例如,开发人员可以将关键的Java Class放在服务器上,客户端通过访问服务器的相关接口来获取服务,而不是直接访问Class文件。所以黑客是没有办法反编译Class文件的。目前,通过接口提供服务的标准和协议越来越多,例如HTTP、Web Service、RPC等,但有很多应用并不适合这种保护。例如,独立程序中的Java程序是无法隔离的。
2. 加密类文件
为了防止Class文件被直接反编译,很多开发者都会对一些关键的Class文件进行加密,比如注册号、序列号管理等相关类。在使用这些加密的类之前,程序需要先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。
开发人员经常通过自定义的ClassLoader类来加载加密类(Applet出于安全原因不支持自定义的ClassLoader)。自定义的类加载器将首先找到加密类,然后解密它们。最后将解密后的类加载到 JVM 中。自定义的ClassLoader是这个protect方法中非常重要的一个类。由于它本身没有加密,因此可能成为黑客的第一个目标。如果相关的解密密钥和算法被攻克,那么加密的类就可以很容易地被解密。
3. 转换为本机代码
将程序转换为本机代码也是防止反编译的有效方法。因为本机代码通常很难被反编译。开发人员可以将整个应用程序转换为本机代码,也可以仅转换关键模块。如果只是转换模块的关键部分,那么Java程序在使用这些模块时就需要JNI技术来调用。使用这种方法来保护Java程序就放弃了Java的跨平台特性。针对不同的平台,我们需要维护不同版本的原生代码,这会增加软件支持和维护工作量。但对于一些关键模块,有时往往需要这种解决方案。为了保证这些原生代码不被修改或替换,开发人员常常需要对这些代码进行数字签名。在使用这些原生代码之前,开发者往往需要对这些本地代码进行认证,以确保这些代码没有被黑客更改。如果签名检查通过,那么开发者就可以调用相关的JNI方法了。
4. 代码混淆
代码混淆就是对Class文件进行重新组织和处理,使经过处理的代码与未经处理的代码完成相同的功能(语义)。但混淆后的代码很难被反编译,即反编译后的代码非常难以理解,因此反编译人员很难理解真正的语义。理论上,如果黑客有足够的时间,混淆后的代码仍有可能被破解。甚至有些人正在开发反混淆工具。但从实际情况来看,自从混淆技术多元化发展以来,混淆理论日趋成熟,混淆后的Java代码可以很好地防止反编译。
5. 在线加密
APK保护 https://twitter.com/apkprotect是一个 APK 在线加密网站,但活动显然自 2013 年左右以来已停止。提供Java代码和C++代码保护,达到反调试、反编译的效果。
我最初建议您使用最后一种方法,因为它可以节省您更多时间。根据我的经验,操作非常简单,而且不会花很长时间。