中文站

android混淆原理是什么?android混淆方法有哪些?

Java代码是非常容易反编译的,作为一种跨平台的、解释型语言,Java 源代码被编译成中间字节码存储于class文件中。由于跨平台的需要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者往往会对编译好的class文件进行混淆处理。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。ProGuard就是一个混淆代码的开源项目,能够对字节码进行混淆、缩减体积、优化等处理。

Proguard处理流程图如下所示,包含压缩、优化、混淆、预检四个主要环节:

 


 

压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);

优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;

混淆(Obfuscate):使用abcd这样简短而无意义的名称,对类、字段和方法进行重命名;

预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。

利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:

 


Proguard处理后

 


 

Proguard混淆器不仅能够保护代码,而且能够精简编译后的程序大小,减少内存占用。

混淆代码逆向分析

如果想要反编译混淆代码,可以尝试国外的工具DEGUADR,它能够通过统计的方式来解混淆。虽然这个工具的正确率达不到100%,但是能在一定程度上帮助反编译代码。

 


 

使用DEGUADR解混淆的示例:

 


 

com.xxxxx.common.util.CryptoUtil网站也提供了一种反编译服务,如下所示:

 

java.lang.String a(byte[]) -> encodeToString

java.lang.String a(byte[],boolean,java.lang.String) -a

byte[] a(byte[],byte[]) -encrypt

byte[] b(byte[]) -getKey

byte[] b(byte[],byte[]) -decrypt

byte[] d(java.lang.String) -getKey

java.lang.String a(byte,char[]) -a

java.lang.String a(java.io.File) -getHash

java.lang.String a(java.lang.String) -c

java.lang.String b(java.lang.String) -encode