您现在的位置是:首页 > 文章详情

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

日期:2018-08-11点击:494

首先说一下,何为反编译,简单地说,从源码开始,经过集成开发环境编译以及签名之后得到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,工作目录如下:

img_8f465600d1ba327b0959416bbe466915.png

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

img_2764b93d9cfa32ae19f05cfc7c526581.png

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

img_6ceef87965ce5902fe47569b8cb99d99.png

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

img_aa864a0772553dcfb5d252b65048f30d.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 
img_65673e033ff7ca32823bef529c1a4a33.png

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

img_cd373e32393174f0718603c39aca9e0d.png

打开这个文件夹:
img_03571f3f3bdaf865edb623bf9258c2e2.png

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

img_a01a8b7c9a69423973a819bc00f7776d.png

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

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

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

img_3c472cd6ea49ac848b7d40ee1e3d43f0.png

下一步,解决Source Code。

9.5.3.2 Dex2jar、jd-gui

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

img_70f6afe99cd806d66f7040da81e72113.png

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

d2j-apk-sign.bat classes.dex 
img_ceea9fd9c4000eadc3da97f5c18f2a91.png
img_223e710e4cd468aaca54e98a29702491.png

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

img_0d7af20a93858d0651af5c2026078df9.png

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

img_37e6a423990b770c61aea3151c2c95c2.png

img_fedbaaef984b681ea8dea8ca060e5182.png
打开后的界面

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

img_48b8d0bcb402ca4adae7d59e92efcf3e.png

img_103c6ffe6a39aa63ff8cb994ca99ab94.png

img_e1078facd558b966393d82adabb442aa.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文件:

img_be496393e60589f2a740574070c368d9.png

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

原文链接:https://yq.aliyun.com/articles/686588
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章