安卓加固APK防破解常用技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

APK防破解常用技术汇总

引言

防破解技术汇集

关键逻辑放服务端

用 native code 替代 Java 代码

代码混淆

Java 代码混淆

native code混淆

运行前做完整性校验,防止重打包

zip 加密位法

dex 加密隐藏

dex 嵌入异常汇编法

资源混淆法

禁止调试与模拟器检测

附录资料

安卓破解常用工具软件

加固 apk 实例

引言

安卓应用防止破解和重打包可以选择梆梆加固、阿里聚安全、爱加密等成熟解决方案,他们的加固比较彻底,使用的技术也比较深层次,所以破解难度也很大,但是有可能带来应用不稳定的问题,所以周期长。

如果不选择梆梆加固等的成熟方案,那么可以选择将一些防破解和重打包的对抗技术组合使用,虽然不如成熟方案层次深,但是使用简单,周期短,防住普通破解者也有不错的效果。

这里将一些这样的防破解技术整理如下,仅供参考。

每个技术都标注了易用性和防破解效果,易用性越高表明越容易实现,防破解效果越高表明攻击者越难破解。其中易用性越高表明越容易开发实现,防破解能力越高表明攻击者越难破解。

防破解技术汇集

关键逻辑放服务端

尽可能将关键的逻辑代码放在服务端运行,减少敏感代码暴露在客户端。让客户端只做一些 API 请求和界面交互。

易用性:高

防破解能力:中

用 native code 替代 Java 代码

将一部分关键的或者计算密集型的代码用 native code (Android NDK)来编写,不仅能提高运行效率,也能增加攻击者的逆向难度。

易用性:中

防破解能力:高

代码混淆

Java 代码混淆

安卓标配了 proguard,推荐使用。

易用性:高

防破解能力:中

native code混淆

对 native code 做混淆,开源工具有:https:///obfuscator-llvm/obfuscator/wiki

根据经验,这会让破解难度大大增加。

易用性:中

防破解能力:高

运行前做完整性校验,防止重打包

事先打包完成后,计算 dex 等文件的 hash 值,后续再植入原生代码进行校验,如果 hash 值不相等,那么程序一定被重打包执行。

易用性:中(每次更新发布需要修改)

防破解能力:低/中

zip 加密位法

讲 apk 的 zip 加密位置 1,在 android 解析 apk 时,由于忽略了加密 zip,直接跳过了加密头部的解析,因此通过修改 zip格式的加密标识,可以实现伪加密。

易用性:低

防破解能力:低/中

dex 加密隐藏

类似于梆梆加固类的方法,将 dex 文件加密隐藏,在程序加载之后,再从内存加载 dex 文件。

易用性:低,需要开发大量代码

防破解能力:高

dex 嵌入异常汇编法

这个方法主要目标就是让 apktool 或 dex2jar 等工具不能正常工作。举例如下:

在最终 smali 汇编中嵌入如下函数,会让 dex2jar 工具崩溃,无法解析。

.method public testdex2jarcrash(Ljava/lang/String;Ljava/lang/String;)V .registers 3

.param p1, "test1"# Ljava/lang/String;

.param p2, "test2"# Ljava/lang/String;

.annotation build Lcom/system/TestA;

.end annotation

.end param # 这里是引起崩溃的关键,注释掉就可以正常解析

return-void

.end method

易用性:较低

防破解能力:高

资源混淆法

通过一定的方法构造资源文件,使 apktool 自动打包和解包失败。(目前已经具有相关能力)

禁止调试与模拟器检测

在安卓程序中禁止调试选项,主要有两个点需要覆盖。

一,设置 AndroidManifest.xml 中的 android:debuggable="true", 则 ApplicationInfo().flags 被设置为true。使用 android.content.getApplicationInfo () 可以获取 AndroidManifest.xml 文件的信息。

样例代码如下:

if(getApplicationInfo().flags &ApplicationInfo().FLAG_DEBUGGABLE !=0) { // some cracker is cracking this apk

}

二,检测调试器是否连接

在较隐蔽的代码处,调用如下函数获取是否被调试信息。

if(Android.os.Debug.isDebuggerConnected()) {

// some cracker is debugging this apk

}

为了达到更隐蔽的效果,可以使用 Java 的反射机制来动态找到这些方法调用,而不是直接调用,调用之后也不要直接退出程序,而是设置变量让后续逻辑知晓,这都可以让破解难度变大。

三,模拟器检测

公开发布版本不在运行在模拟器中执行,一旦发现就立刻退出。模拟器检测方法有很多,常见的如:模拟器的操作系统 code name 为 generic,可以通过以下几种方法来检测。

直接代码方法,android.os.Build类中。包括了这样的一些信息。可以直接调用而不需要添加任何的权限和方法。直接检测Landroid/os/Build;->MODEL 是否为“sdk”,如果是,则为模拟器。

使用系统工具方法,如下表:

$ adb shell getprop

[ro.kernel.qemu]:[1]

[ro.hardware]:[goldfish]

[ro.build.tags]:[test-keys]

[ro.product.model]:[sdk]

[ro.product.brand]:[generic]

[]:[sdk]

[ro.product.device]:[generic]

[ro.product.board]:[]

[ro.product.manufacturer]:[unknown]

[ro.board.platform]:[]

[ro.build.product]:[generic]

[ro.build.fingerprint]:[generic/sdk/generic:2.3.1/GSI11/93351:eng/test-keys]

易用性:高

防破解能力:中

附录资料

安卓破解常用工具软件

1. apktool

2. dex2jar

3. smali/baksmali

相关文档
最新文档