android代码一直有一个安全的问题,android2.2之后自带的proguard进行的混淆打包可以比较方便的解决这个问题,那么就先来说说混淆打包的方式吧。
系统环境
mac os x 10.9.4
android sdk版本
android4.2.2
一、混淆打包
1、混淆打包概念
Java代码编译成二进制class 文件,这个class 文件可以被反编译成源代码,proguard混淆工具就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 它还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
在android项目中可以看到proguard-project.txt文档,它可以进行混淆的配置。
2、混淆打包步骤
(1)修改项目中的project.properties文件,在新一行添加
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
老版本可以改为添加proguard.config=proguard.cfg
(2)按照正常流程导出apk即可
二、反编译
1、工具下载
(1)apktool下载最新版本apktool1.5.2.tar.bz2和apktool-install-macosx-r05-ibot.tar.bz2即可,apktool主要是为了获得AndroidManifest.xml和res,不过直接将jar包改后缀名为zip解压也可以得到。
(2)dex2jar为了将dex文件反编译成jar包,得到class代码字节码。
(3)jd-gui则是可以反编译字节码,查看源码的可视化工具。
2、步骤
(1)打开mac 命令行输入命令
echo $PATH
该地址类似windows的系统变量中的path路径,查看是否有/usr/local/bin,如果没有则创建一个,然后将apktool下载的两个tar.bz2解压,可以看到里面有3个文件apktool.jar,aapt,apktool,全部拷贝到/usr/local/bin路径下,需要使用到sudo,这个时候就能不用填写路径就能使用到它们了;
(2)下面开始反编译apk
a、命令行cd到所需反编译的apk文件的目录下,
b、调用命令
apktool d xxx.apk
其中xxx.apk即是你的apk文件名,这个时候会得到文件夹xxx,里面既有所需的AndroidManifest.xml和res;
c、将apk后缀名改成zip,并解压
d、进入该解压文件夹,可以看到class.dex文件,命令行输入
sh 你下载的dex2jar-0.0.9.15的路径/dex2jar.sh classes.dex
这个时候可以看到class.dex所在目录生成新文件classes_dex2jar.jar文件即是我们所需要的代码字节码jar包;
e、打开jd-gui,使用它打开classes_dex2jar.jar就可以看到相应的源码了。
三、混淆打包与常规打包反编译后的效果
常规打包反编译后可以看到删除注释的源码,findViewById函数的参数被值替代,但是也相对容易阅读;混淆打包后,大部分类名和包名等变成了a,b,c等特殊字符,较难解读。所以混淆打包在安全性上的提高还是不错的。