文章目录
- 导言
- 基础知识
- 准备工作
- 使用 apktool 反编译一个app
导言
由于编译好的软件是无法直接修改的,因此需要反编译,所谓反编译(Decomplied),即将已经编译好的软件反向编译,还原成可读代码,在此基础上,可以更进一步的了解软件的逻辑及对软件进行修改,在安卓上,更多用于修改系统设置等。
本系列文章主要讲解如何实现安卓应用的反编译,因此要求读者 具备Java语言基础 ,并在一定程度上 了解android应用的构成及知道如何编写安卓应用 ,了解 资源文件® 的作用。另外,还需要能简单读懂 smali 代码,反编译出来的都是smali代码。当然也有方法将smali代码进一步编译为class或java代码,进一步提高可读性。
基础知识
安卓应用本质上是java代码编译后的字节码文件与资源文件加上签名文件打包而成。如下图所示:
其结构如下:
- res —— 资源文件
- META-INF —— 签名文件,是使用keystore签名对该应用整包签名后生成的文件,因此任意文件改动都会使得签名校验失败。
- resources.arsc —— 资源文件索引与字符串池等,主要是编译时对处于原始状态下的多个资源文件的一个索引及优化
- classes.dex —— java编译后的字节码,可供虚拟机读取执行
- AndroidManifest.xml —— 安卓应用描述文件,也已被编译成二进制,因此无法直接打开
准备工作
反编译的目的就是将上述文件逆向编译,将其转回可读状态。
为此,我们需要一个工具 apktool :这是一个鼎鼎大名的开源反编译软件,专门用于安卓应用的反编译。
该工具 依赖Java1.8以上(linux下为openjdk) 运行,其官网上有帮助文档,就不再赘述了。
提示:linux下包管理工具通常可以直接安装该工具,windows下则需要自行下载并配置环境变量
使用 apktool 反编译一个app
尽管官网上已经给出了详尽的说明,但还是简单的介绍一下,避免大家走太多弯路。
提示:当要反编译某个系统应用时,应该首先使用 apktool if 命令安装该系统的 framework-res.apk 框架应用
下面以 android 6.0
的 settings.apk(系统设置)
的反编译为例:
- 由于设置是系统应用,很多时候会使用系统框架里的资源,因此在反编译前要先安装该系统的框架:
$apktool if framework-res.apk
假如你可能同时反编译多个不同系统的应用,你应该使用 -p 参数指定框架的安装目录,否则容易产生混乱
- 执行反编译命令,完成后在当前目录将会创建一个叫做settings的文件夹,里面存放反编译后的内容。
$apktool d settings.apk
假定在第一步,使用了 -p 参数指定框架的安装目录,则在这一步及回编译的时候均需使用 -p 参数指定框架目录
- 当修改完后,执行回编译命令
$apktool b settings
注意,回编译的目标不是 apk ,而是反编译出来的文件目录。一切顺利时,你可以在该目录里的dist
文件夹中找到编译好的 apk 文件。但生成的 apk 文件会处于无签名状态
一切顺利时,你可以在该目录里的 dist
文件夹中找到编译好的 apk 文件。但生成的 apk 文件会处于无签名状态*
至此反编译就完成了,