9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密

首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到apk文件的这个过程,我们称之为“编译”;“反编译”的话,顾名思义,粗略地说就是与“编译”相反的过程咯,也就是从apk文件开始,经过一系列工具解压最后得到源码的过程。当然,顺逆之言,说的只是起始点的逆反置换,个中具体的过程还是不尽相同的。

接着再说一下apk文件。Android的应用程序Apk文件(即app安装文件,Android系统会自动识别后缀为apk的文件,并将之认为是app安装文件,可以选着进行安装)是一个压缩文件,可以通过普通解压工具(如WinRAR、360解压等)获得里面的文件内容。

我们找来一个Apk文件
(可以下载一个软件的安装包来做实验,或者自行用Android studio通过签名生成apk文件(对签名生成apk不了解的同学,可以戳一下这里详细了解一下);这里用的就是撰写本文时用Android studio通过签名生成的apk文件app-release.apk),
然后使用普通解压工具(如WinRAR、360解压等)直接解压app-release.apk,可以得到文件夹app-release,工作目录如下:

9125154-3a41ce9c84a6a954.png

进入文件夹app-release,目录如下,可以看到许多相对于Android开发者很熟悉的东西,类似于Android开发的时候所使用的工作目录和对应的文件夹、文件等等,
像图中——用来放置代码、音像图片等各种资源的的res目录以及可以配置应用程序和各个组件等信息的AndroidManifest.xml文件等:

9125154-a68d98a20335d8ea.png

但是当你试图去打开查看这些文件时,你会发现资源文件等xml文件基本无法打开,即使能打开也是如下图的乱码,这些乱码就是Android加密过的文件:(如下图的AndroidManifest.xml)

9125154-5683ccdac36992c2.png

既然使用普通解压工具直接解压Apk文件是无法获得正常的应用程序,那么来看看如何使用正确的方法反编译应用程序。
首先请出三个重量级的工具,如下:

9125154-6b2624f83fc896ce.png

这三个工具分别负责反编译不同的部分、不同的过程。

必须说的是,现在市场上厂家生产的app基本上都是有自己很成熟的混淆规则和加密体系,所以要解析这些apk文件便需要更高超的反编译技术了,当然这种行为也是不可取的,侵犯了厂家的知识产权!所以本文讲的反编译主要是比较理想的apk条件环境,即面向开源的没有添加负责混淆规则的apk文件。让大家对反编译有一个基础的了解。

9.5.3.1 apktool

首先来反编译apk中的XML文件,利用apktool_2.3.3.jar。打开cmd命令行窗口,在命令行里边使用cd命令进入工具目录(放置所要解压的apk文件的目录),执行命令:

java -jar apktool_2.3.3.jar d -f app-release.apk 
9125154-866801dba0ed2f74.png

执行完毕后,可以得到对应的输出文件:

9125154-686cf7ebca71c351.png

打开这个文件夹:
9125154-ff9fe8b0a151c31e.png

这时候打开res目录中的xml文件(如下图的AndroidManifest.xml):

9125154-ed735b7878e46b4c.png

此时可以正确地查看这些XML文件而不是之前的乱码了。这个工具在汉化软件的时候非常有用,可以提取资源文件并进行汉化,然后执行如下命令重新打包回去(这里的打包便是顺编译的没有加密的过程了)即可:

java -jar apktool_2.3.3.jar b app-release

重新打包的命令与解码的命令相似,只是将d改为b,并选择前面解码生成的文件夹。执行该命令后,在文件夹下就会生成两个新的文件夹,如下图所示dist和build文件夹,重新打包的APK就在dist目录下:

9125154-4ec0689fc87a9566.png

下一步,解决Source Code。

9.5.3.2 Dex2jar、jd-gui

先回到刚刚用解压缩工具apktool解压apk后、重新打包后得出来的那个build文件夹,文件夹中有一个非常重要的文件,如下图的classes.dex文件:

9125154-1e259b9636bd11e3.png

这个文件就是源代码打包后的文件,将它复制到第二个解压工具dex2jar-0.0.9.15的根目录下,然后在cmd窗口使用cd命令进入工具dex2jar-0.0.9.15的目录并执行下面的代码:

d2j-apk-sign.bat classes.dex
9125154-30d9173407442511.png
9125154-d162cead901f668c.png

cmd上会开始分析,分析完毕后,在工具dex2jar-0.0.9.15的目录目录下生成了一个jar文件:

9125154-86eeae52d9466dce.png

到这里,打开第三个工具jd-gui.exe;

9125154-bbf4f787ac39f400.png

9125154-2d5657b8391e4f5c.png
打开后的界面

选择file-open file,并选择刚刚生成的classes-dex2jar.jar文件,即可查看相关源代码:

9125154-abf69c84a9eef206.png

9125154-e33a91eb3f19bb16.png

9125154-9160c569b0e4a411.png

总结思路:
使用apktool将apk反编译成文件夹,
再重新打包生成build和dist目录以及相关文件(包括classes.dex),
使用Dex2jar将classes.dex分析生成jar文件,
对jar文件使用jd-gui即可查看相关的源代码。

9.5.4 Android Apk 加密

由于Java字节码的特殊性,使得它非常容易被反编译。因此,为了能够对编译好的Java Class文件进行一些保护,通常会使用ProGuard来对Apk进行混淆处理,用无意义的字母来重命名类、字段、方法和属性。当然,ProGuard不仅仅可以用来混淆代码,还可以删除无用的类、字段、方法和属性,以及删除没用的注释,最大限度地优化字节码文件。


在Android Studio中,打开app目录下的build.gradle文件:

9125154-80d30338d85b4014.png

**这里的minifyEnabled属性就是控制ProGuard的开关,将即设置为true,即可开启混淆功能,在使用AS导出apk时,即可生成混淆。
9125154-21f3931073b4b524.png

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值