Mac 反编译 apk 程序

APK,即 Android 应用程序包(Android application package),是 Android 操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个 Android 应用程序的代码想要在 Android 设备上运行,必须先进行编译,然后被打包成为一个被 Android 系统所能识别的文件才可以被运行,其文件格式便是 APK。一个 APK 文件内包含被编译的代码文件 (.dex 文件),文件资源(resources), assets,证书(certificates),和清单文件(manifest file)。

APK 文件基于 ZIP 格式进行压缩,它与 JAR 文件的构造方式相似。因而,直接解压 APK 文件可以得到一部分信息,如 classes.dex 等。如果要进行更详尽的分析,就需要用到反编译的工具了。

准备工作

下载 apk 反编译组件

需要下载的程序包括:

一些论坛里会把它们称为「APK 反编译三件套」。

前两个程序可以通过 Homebrew 进行安装:

1
brew install apktool dex2jar

Homebrew 同时也会将 openjdk 作为依赖包装好。

JD-GUI 需要点击上面的官网链接下载,选择 jar 格式的即可。

进行反编译

运行 Apktool

安装好 Apktool 后,在终端执行 apktool -h,如果能正确显示帮助信息,则安装正常。
Apktool 的使用方法也很简单,准备好需要反编译的 apk 文件(例如 example.apk),执行

1
apktool d path/to/example.apk

即可进行反编译,这时会生成一个名为 example 的目录,用于存储反编译出的文件。如果要回编译,执行

1
apktool b path/to/example

当然,仅通过回编译得到的 apk 是没有签名的。如果要在安卓手机上安装,还需要进行签名。步骤如下:

1
2
keytool -genkey -alias tmp.keystore -keyalg RSA -validity 20000 -keystore tmp.keystore
jarsigner -verbose -keystore tmp.keystore -signedjar path/to/example.apk path/to/example_signed.apk tmp.keystore

这会生成一个签名文件 tmp.keystore 和可供安装的 example_signed.apk

用 dex2jar 将 apk 转成 jar 文件

安装好 dex2jar 后,直接运行:

1
d2j-dex2jar path/to/example.apk

dex2jar 默认将生成 example-dex2jar.jar 文件。

查看源代码

双击打开 JD-GUI.jar,将 example-dex2jar.jar 拖进去就能看到源码了。

通过看 Java 源码对比 smali 文件,修改后回编译就 OK 了!


本教程以 macOS 10.13 为例。其它的版本的 Mac 可能在操作上略有差别。

参考文章:
MAC 上反编译 android apk---apktool, dex2jar, jd-jui 安装使用 (含手动签名)

本文更新于 2021 年 8 月 23 日:
旧版的 JD-GUI 与 Java 9 存在兼容性问题,已经在 2019 年被修复了。