准备一个APK

用于反编译和混淆的APK来自于《即拿即用-横向滚动+转场动画+GridView和RecyclerView动态添加》的Demo,地址:https://github.com/mocn26169/MultiViewpager

首先我我们将apk签名并打包:

Java CFR 反混淆 jar混淆反编译_混淆

密码都是123456789

Java CFR 反混淆 jar混淆反编译_Java CFR 反混淆_02

反编译代码

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解压后的目录下。

Java CFR 反混淆 jar混淆反编译_Java CFR 反混淆_03

Java CFR 反混淆 jar混淆反编译_反编译_04

3、在cmd中执行命令

cmd中进入到同样的目录,然后执行:

d2j-dex2jar classes.dex

Java CFR 反混淆 jar混淆反编译_Java CFR 反混淆_05

发现dex2jar-2.0目录下多出来了一个classes-dex2jar.jar文件

Java CFR 反混淆 jar混淆反编译_反编译_06

4、使用jd-gui工具打开classes-dex2jar.jar文件

对比一下

Java CFR 反混淆 jar混淆反编译_jar_07

Java CFR 反混淆 jar混淆反编译_反编译_08

可以看到,基本上还原了大部分的代码。

反编译资源

如果去打开所有的xml文件,包括AndroidManifest.xml文件发现都是不能直接看到的:

Java CFR 反混淆 jar混淆反编译_jar_09

所以我们需要用其他的方法还原这些资源文件

1、下载apktool工具

apktool 这个工具用于最大幅度地还原APK文件中的9-patch图片、布局、字符串等等一系列的资源。
下载地址:http://ibotpeaches.github.io/Apktool/install/

需要的就是apktool.bat和apktool.jar这两个文件

将Demo.apk拷贝到和这两个文件同样的目录当中,然后cmd也进入到这个目录下

Java CFR 反混淆 jar混淆反编译_混淆_10

在cmd中执行如下命令:

apktool.bat d -f aaa.apk

Java CFR 反混淆 jar混淆反编译_混淆_11

至此就完成了资源和代码的反编译,如果要知道如何去修改代码,重新打包,请去看《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工具再次打开

对比一下

Java CFR 反混淆 jar混淆反编译_混淆_12

Java CFR 反混淆 jar混淆反编译_Java CFR 反混淆_13

可以看到,大部分代码都被混淆了,那么我们想让这个类不被混淆呢应该怎么做?

任何一个Android Studio项目在app模块目录下都有一个proguard-rules.pro文件,这个文件就是用于让我们编写只适用于当前项目的混淆规则的,那么接下来我们就利用刚才学到的所有知识来对混淆规则做修改吧。

不对DetailActivity这个类进行混淆

-keep class com.bourne.multiviewpager.DetailActivity {
    *;
}

重新打包编译

Java CFR 反混淆 jar混淆反编译_jar_14

可以看到这个类很神奇地被完整地保留下来

混淆的规则也有很多,对某个类,某个方法,某个包混淆等等,可以自行查看《 Android安全攻防战,反编译与混淆技术完全解析(下)》

参考

  • 《Android安全攻防战,反编译与混淆技术完全解析(上)》
  • 《 Android安全攻防战,反编译与混淆技术完全解析(下)》