代码编译-反编译-解混淆

介绍
Java的字节码一般是非常容易反编译的, 而android采用java编写, 生成的apk安装文件实际上就是一个压缩包, 可以将其解压缩, 再借用其他工具就能被反编译出来. 为了能对源代码就行一些必要的保护, 我们可以对编译好的class文件进行混淆处理. ProGuard的就是一个混淆器, 混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆, 混淆后的结果是一个比较小的.apk文件, 该文件比较难进行逆向工程.
ProGuard是一个SourceForge上非常知名的开源项目. 官网网址是:http://proguard.sourceforge.net/

方法
根据 SDK 的版本不同有 2 中不同的代码混淆方式,以上的 proguard.cfg 参数详解中所涉及到的信息是在较低版本 SDK 下的混淆脚本,事实上在高版本的 SDK 下混淆的原理和参数也与低版本的相差无几,只是在不同 SDK 版本的环境下引入混淆脚本的方式有所不同。具体方法如下:

低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。
高版本 SDK 下,项目中同时包含 proguard-project.txt 和 project.properties 文件,这时需要在 proguard-project.txt 文件中进行如下信息的配置,然后再将项目 Export 即可。下面以真实的文件进行演示说明。

特殊类的混淆

解码混淆过的堆栈跟踪信息
当混淆后的代码输出一个堆栈信息时,方法名是不可识别的,这使得调试变得很困难,甚至是不可能的。幸运的是,当ProGuard运行时,它都会输出一个<project_root>/bin/proguard/mapping.txt文件,而这个文件中包含了原始的类,方法和字段名被映射成的混淆名字。

retrace.bat脚本(Window)或retrace.sh脚本(Linux,Mac OS X)可以将一个被混淆过的堆栈跟踪信息还原成一个可读的信息。它位于<sdk_root>/tools/proguard文件夹中。执行retrace工具的语法如下:

retrace.bat|retrace.sh [-verbose] mapping.txt [<stacktrace_file>]

例如:

retrace.bat -verbose mapping.txt obfuscated_trace.txt

如果你没有指定<stacktrace_file>,retrace工具会从标准输入读取。
当然 你也可以使用工具 在tools/proguard/bin/ 下面 运行proguardGUI.bat 会运行一个GUI页面,操作方式很简单的 就选择这三个红款里面的东西就可以了。






posted @ 2016-10-01 22:24  杨伟乔  阅读(2755)  评论(0编辑  收藏  举报