准备一个APK
用于反编译和混淆的APK来自于《即拿即用-横向滚动+转场动画+GridView和RecyclerView动态添加》的Demo,地址:https://github.com/mocn26169/MultiViewpager
首先我我们将apk签名并打包:
密码都是123456789
反编译代码
1、下载工具
dex2jar 这个工具用于将dex文件转换成jar文件
下载地址:http://sourceforge.net/projects/dex2jar/files/
jd-gui 这个工具用于将jar文件转换成java代码
下载地址:http://jd.benow.ca/
2、取出classes.dex文件
将APK压缩,取出classes.dex这个文件,因为代码都在这个文件里面。
拷贝到dex2jar解压后的目录下。
3、在cmd中执行命令
cmd中进入到同样的目录,然后执行:
d2j-dex2jar classes.dex
发现dex2jar-2.0目录下多出来了一个classes-dex2jar.jar文件
4、使用jd-gui工具打开classes-dex2jar.jar文件
对比一下
可以看到,基本上还原了大部分的代码。
反编译资源
如果去打开所有的xml文件,包括AndroidManifest.xml文件发现都是不能直接看到的:
所以我们需要用其他的方法还原这些资源文件
1、下载apktool工具
apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
下载地址:http://ibotpeaches.github.io/Apktool/install/
需要的就是apktool.bat和apktool.jar这两个文件
将Demo.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下
在cmd中执行如下命令:
apktool.bat d -f aaa.apk
至此就完成了资源和代码的反编译,如果要知道如何去修改代码,重新打包,请去看《Android安全攻防战,反编译与混淆技术完全解析(上)》
混淆代码
一个APK如果没有混淆,那么就会很容易被反编译代码、反编译资源、以及重新打包。
混淆代码并不是让代码无法被反编译,而是将代码中的类、方法、变量等信息进行重命名,把它们改成一些毫无意义的名字。
打出正式版的APK才会进行混淆,Debug版的APK是不会混淆的。
混淆步骤
借助SDK中自带的Proguard工具,只需要修改build.gradle中的一行配置即可。可以看到,现在build.gradle中minifyEnabled的值是false,这里我们只需要把值改成true,打出来的APK包就会是混淆过的了。如下所示:
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
重新签名打包,并用dex2jar工具再次打开
对比一下
可以看到,大部分代码都被混淆了,那么我们想让这个类不被混淆呢应该怎么做?
任何一个Android Studio项目在app模块目录下都有一个proguard-rules.pro文件,这个文件就是用于让我们编写只适用于当前项目的混淆规则的,那么接下来我们就利用刚才学到的所有知识来对混淆规则做修改吧。
不对DetailActivity这个类进行混淆
-keep class com.bourne.multiviewpager.DetailActivity {
*;
}
重新打包编译
可以看到这个类很神奇地被完整地保留下来
混淆的规则也有很多,对某个类,某个方法,某个包混淆等等,可以自行查看《 Android安全攻防战,反编译与混淆技术完全解析(下)》
参考
- 《Android安全攻防战,反编译与混淆技术完全解析(上)》
- 《 Android安全攻防战,反编译与混淆技术完全解析(下)》