爱收集资源网

Android防破解的思路方式:1.代码混淆的2.3个思路

网络整理 2022-05-06 02:04

我最近在做安卓应用的时候遇到了这个问题。客户要求该功能必须先注册后才能使用,程序本身不在线使用。因此,必须在程序中加入机器码注册码机制。

众所周知,Android 应用程序是基于 Java 开发的。如果不做任何处理,可以直接反编译APK看源码算法。没有难度。

关于安卓反破解,网上有价值的内容比较少。收集了一些零碎的资料,总结一下,防止破解的方法有以下几种:

1.代码混淆。 2.3 的Android SDK 已经支持直接混淆生成APK。混淆会增加反编译和破解的难度,但单靠混淆并不能解决问题。对于有经验的人来说,在混淆后的代码中找到注册校验码并强行破解是不难的。

2.签名比较。签名可以在APK中进行处理,但是APK的签名不能阻止反编译,但是反编译后不能再次使用相同的签名。虽然可以在代码中比较签名,但也可以修改比较代码本身。所以签名影响不大。

3.在线注册。程序启动后会自动连接服务器进行注册验证,并将一些核心功能放在服务器上。这种方法最安全,但不适合单机程序。您也不能要求用户在记事本程序中登录服务器。

4.dex 或类是动态加载的。这种方法理论上是好的。核心算法的一小部分做成dex或者class文件,加密成资源文件,注册成功后解密加载到内存中。但这种方法实施起来非常困难。网上好像没找到什么文章,实现后维护代码的成本也很高。另外,如果程序完全反编译调试,仍然可以通过设置断点将解密后的dex或class文件导出。

5.使用 NDK(或 JNI)原生 C/C++ 动态库。对于独立应用程序,这是一个更好的解决方案。 NDK编译的原生C/C++程序调试破解难度较大,代码维护也方便。

为了增加破解的难度,还有其他需要注意的地方:可以加密密钥内容或算法;检测算法可以分解成多个片段进行多次调用;此外,相关的敏感字符串(如“注册失败”等消息)永远不会以明文形式出现等。

我最终选择的注册机制方案是:代码混淆+NDK库+内容加密。简要说明如下:

1.混淆所有 JAVA 代码。我之前写的程序是Android2.2,不支持直接混淆;然后我下载了最新的SDK,将程序的SDK版本目标设置为13,将proguard.cfg添加到default.properties,然后在项目中右键Tools导出签名的APK,完成混淆打包过程。

2.使用NDK C语言生成机器码,检测注册码,解密内容。在JAVA界面中只做了机器码的显示、注册码的输入和加解密接口的调用,核心机器码注册码的加解密都是在C程序中完成的机器代码应与硬件 ID 结合使用。需要注意的是WIFI的MAC地址不能直接使用,因为WIFI的MAC地址可以很方便的修改;最好使用CPU序列号,如果没有,考虑使用设备ID。 IMEI或者USB MAC码,但最好不要在JAVA代码中,而是在JNI C代码中,以免反编译后被篡改。生成过程这里就不详细描述了有机器码算注册码,以后有空再写。

3.加密和解密一些资源文件。程序只能使用文件系统中的资源文件才能运行,所以我提前在PC上对这些文件进行了加密,并将解密密钥放在了注册码中。根据机器码生成注册码,生成注册码时添加解密密钥。由于解密后的密钥包含在注册码中,即使破解者绕过注册检测,文件也无法解密运行;只能获取注册码进行解密。由于注册码检测和解密过程是在NDK程序中完成的,即使有注册码,也很难得到解密后的密钥和算法。

当然,防止开裂是相对的。没有根本无法破解的程序。只是破解难度和成本都这么高,还是直接注册比较好。另一方面有机器码算注册码,如果你的程序本身价值不大或者没有多少人会使用它,那么防止破解基本上是没有必要的。

代码混淆 apk