Android应用安全是应用不可缺少的一部分,稍有不慎可能会被不法分子利用,会给企业带来极大损失,因此保护Android APP不被破解和逆向分析非常重要,通过对Android代码进行混淆,可以加大Android APP反编译的成本,从而提升APP的安全性。
Java代码是相对比较容易被反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。因为跨平台的需要,这些字节码带有许多的语义信息,比较容易被反编译成Java源代码。为了较好的保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。
Android应用代码混淆的目的是使反编译工具反编译出来的代码难以阅读,从而增加代码被逆向破解的难度。常用的代码混淆方法包括:Java代码混淆、类名/方法名混淆、 字节码混淆等。
混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。
ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。Proguard处理流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:
Proguard进行代码混淆流程图
压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);
优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;
混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名;
预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。
利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:
Proguard处理后:
Proguard混淆器不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。
混淆代码是最原始也是Android应用保护最基础的保护措施,在逆向对抗中,建议开发者将核心逻辑置于native层,且借助LLVM对Native层代码进行保护;如无多余人力物力投入安全,也可直接使用第三方安全加固产品,比如说网易易盾的加固。
相关阅读: