3月17日,网易资深安全工程师钟亚平在安卓巴士全球开发者论坛上作了《安卓APP逆向与保护》的演讲。其中就谈到了关于代码混淆的问题。现摘取部分重点介绍以下:html
Java代码是很是容易反编译的,做为一种跨平台的、解释型语言,Java 源代码被编译成中间“字节码”存储于class文件中。因为跨平台的须要,这些字节码带有许多的语义信息,很容易被反编译成Java源代码。为了很好地保护Java源代码,开发者每每会对编译好的class文件进行混淆处理。java
混淆就是对发布出去的程序进行从新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即便反编译成功也很可贵出程序的真正语义。ProGuard就是一个混淆代码的开源项目,可以对字节码进行混淆、缩减体积、优化等处理。android
Proguard处理流程图以下所示,包含压缩、优化、混淆、预检四个主要环节:ios
1. 压缩(Shrink):检测并移除代码中无用的类、字段、方法和特性(Attribute);安全
2. 优化(Optimize):对字节码进行优化,移除无用的指令。优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码;工具
3. 混淆(Obfuscate):使用a、b、c、d这样简短而无心义的名称,对类、字段和方法进行重命名;post
4. 预检(Preveirfy):在Java平台上对处理后的代码进行预检,确保加载的class文件是可执行的。优化
在分享中,钟亚平展现了利用Proguard,对Dex2jar进行反编译处理后的Apk效果示例:网站
Proguard混淆器不只可以保护代码,并且可以精简编译后的程序大小,减小内存占用。url
混淆代码逆向分析
若是想要反编译混淆代码,钟亚平分享了一个国外的工具DEGUADR,它可以经过统计的方式来解混淆。虽然这个工具的正确率达不到100%,可是能在必定程度上帮助反编译代码。
使用DEGUADR解混淆的示例:
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
完整演讲内容请见这里:一文了解安卓App逆向分析与保护机制
相关阅读:一文读懂加固apk的开发者是怎么想的
安卓App逆向保护做为开发工做中的重要内容,一直是网易云易盾致力于提供的应用服务。
网易云为您提iOS应用加固、 Android应用加固服务,点击都可免费体验