专栏首页李蔚蓬的专栏9.5.3 Android Apk 反编译 & 9.5.4 Android Apk 加密

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,工作目录如下:

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

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

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

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

必须说的是,现在市场上厂家生产的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 

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

打开这个文件夹:

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

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

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

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

下一步,解决Source Code。

9.5.3.2 Dex2jar、jd-gui

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

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

d2j-apk-sign.bat classes.dex

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

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

打开后的界面

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

总结思路: 使用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文件:

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android开发笔记(一百二十九)使用变换图形

    ClipDrawable可设置图形的裁剪幅度,它的构造函数除了指定来源图形之外,还可以指定图形的裁剪方式(从开始裁剪还是从中间裁剪还是从末尾裁剪),以及裁剪...

    用户4464237
  • Activity的启动模式

    在Android程序中,应用程序通过活动栈来管理Activity,活动栈中有多少个Activity对象,我们在退出程序的时候就要按多少下返回键(即要将活动栈中的...

    指点
  • 使用 Intent 启动 Activity和Activity之间的数据传递

    在Android 程序之中,Activity 对象时和用户交互的唯一手段,几乎每个 Android 项目程序都有多个 Activity。因此,灵活的在屏幕上切换...

    指点
  • Java基础系列(三十三):日志进阶

    上篇文章中,我们对于日志的使用进行了一个初步的学习和了解,这篇文章会对Java自带的基础日志框架进行进一步的深入学习和了解。

    Vi的技术博客
  • 业余草 SpringCloud教程 | 第七篇: 高可用的分布式配置中心(Spring Cloud Config)(Finchley版本)

    上一篇文章讲述了一个服务如何从配置中心读取文件,配置中心如何从远程git读取配置文件,当服务实例很多时,都从配置中心读取文件,这时可以考虑将配置中心做成一个微服...

    业余草
  • Android 全局广播的使用

    广播作为Android一个重要的组成部分,很多功能的实现都依赖于广播,Android系统在发生一些重要事情的时候都会发送广播(电量变化、网络变化等等)。我们也可...

    指点
  • Android文件读写和使用SharedPreferences储存数据

    程序的终归目的还是操作数据来达到实现一些特定功能,在Android中,我们可以通过操作文件或者使用SharedPreferences还有数据库来保存一些数据。首...

    指点
  • Android自定义View

    前几天在郭霖大神的博客上看了自定义View的知识,感觉受益良多,大神毕竟大神。在此总结一下关于Android 自定义View的用法:

    指点
  • 推荐一个优秀的c++源代码,TinyXml2

    项目主页:http://grinninglizard.com/tinyxml2docs/index.html

    用户1539362
  • Spring Boot 2.x(四):与Mybatis不得不说的几种姿(zhi)势(shi)

    目前的大环境下,使用Mybatis作为持久层框架还是占了绝大多数的,下面我们来说一下使用Mybatis的几种姿势。

    Vi的技术博客

扫码关注云+社区

领取腾讯云代金券