安卓应用修改-反编译基础

文章目录

    • 导言
    • 基础知识
    • 准备工作
    • 使用 apktool 反编译一个app

导言

​ 由于编译好的软件是无法直接修改的,因此需要反编译,所谓反编译(Decomplied),即将已经编译好的软件反向编译,还原成可读代码,在此基础上,可以更进一步的了解软件的逻辑及对软件进行修改,在安卓上,更多用于修改系统设置等。

​ 本系列文章主要讲解如何实现安卓应用的反编译,因此要求读者 具备Java语言基础 ,并在一定程度上 了解android应用的构成及知道如何编写安卓应用 ,了解 资源文件® 的作用。另外,还需要能简单读懂 smali 代码,反编译出来的都是smali代码。当然也有方法将smali代码进一步编译为class或java代码,进一步提高可读性。

基础知识

安卓应用本质上是java代码编译后的字节码文件与资源文件加上签名文件打包而成。如下图所示:
安卓应用修改-反编译基础_第1张图片

其结构如下:

  • 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.0settings.apk(系统设置) 的反编译为例:

  1. 由于设置是系统应用,很多时候会使用系统框架里的资源,因此在反编译前要先安装该系统的框架:

    $apktool if framework-res.apk

    假如你可能同时反编译多个不同系统的应用,你应该使用 -p 参数指定框架的安装目录,否则容易产生混乱

  2. 执行反编译命令,完成后在当前目录将会创建一个叫做settings的文件夹,里面存放反编译后的内容。

    $apktool d settings.apk

    假定在第一步,使用了 -p 参数指定框架的安装目录,则在这一步及回编译的时候均需使用 -p 参数指定框架目录

  3. 当修改完后,执行回编译命令

    $apktool b settings

    注意,回编译的目标不是 apk ,而是反编译出来的文件目录。一切顺利时,你可以在该目录里的 dist 文件夹中找到编译好的 apk 文件。但生成的 apk 文件会处于无签名状态

一切顺利时,你可以在该目录里的 dist 文件夹中找到编译好的 apk 文件。但生成的 apk 文件会处于无签名状态*

至此反编译就完成了,

你可能感兴趣的:(Android)