Android APK 反编译工具介绍

本篇博客主要针对 MacOs,介绍几种常用的反编译工具。

1. ApkTool

APKTool 是 Google 提供的 APK 编译工具,能够反编译及回编译 apk,我们一般用来反编译资源文件,代码反编译之后都是 smali 文件。需要 java 支持。

功能
  • 还原 Apk 中所包含的 resources.arsc、classes.dex、9.png 和 xml 等资源文件
  • 对 Apk 进行重新(二次)打包
  • 反编译依赖于 Framework 的 apk 文件
  • 运行调试 Smali 文件
安装
  1. 将下载好的 apktool 文件与 apktool.jar 文件准备好
  2. 将 apktool.jar 与 apktool 移动到 /usr/local/bin 目录下(可以通过在终端中输出命令 open /usr/local/bin 来打开这个目录)
  3. 为上述两个文件增加可执行权限,即在终端中输入并执行:
1. chmod +x apktool.jar
2. chmod +x apktool
  1. 在终端输入 apktool 看是否可以运行,如果可以运行,输出结果如下图。(如果不可以,则需要在系统偏好设置中打开安全与隐私中点击仍要运行apktool.jar)
    Android APK 反编译工具介绍_第1张图片
使用

我们可以利用 ApkTool 反编译 apk 获得 AndroidManifest.xml、xml文件和图片资源。
在终端执行以下操作:

1. cd /你存放apk的目录或在下面命令中使用xxx.apk文件的绝对路径
2. apktool d xxx.apk //该命令执行后会在同级目录下生成一个与你编译的apk同名的目录

以某版本的 docs.apk 为例:

解析出来的文件目录结构如下:
Android APK 反编译工具介绍_第2张图片

APkTool 只能提取资源文件,对于 .dex 类型的文件是无法查看的,这时候需要用到 dex2jar 了。


2. dex2jar

dex2jar 是一个能操作 Android 的 dalvik(.dex) 文件格式和 Java 的 (.class) 的工具集合。

功能
  • dex-reader/writer : 用于读写 Dalvik Executable (.dex) 文件格式. 包含一个简单的API (与ASM相似)
  • d2j-dex2jar : 执行 .dex 到 .class 的文件格式转换
  • smali/baksmali : 与 smali 工具功能一致,但是对中文更友好
安装

直接解压即可。

使用
  1. 先将 apk 文件进行解压,可使用解压软件,也可将文件后缀改为 .rar 然后再通过终端 unzip xxx.rar 命令行解压。(注意:直接解压 apk 和使用 ApkTool 反编译 apk 都能获得AndroidManifest.xml,但直接解压获得的 AndroidManifest.xml 是乱码的,无法直接查看;同时,直接解压 apk 获得 res 资源文件是不包含 resources.arsc 部分的,而使用 ApkTool 反编译出来的 res 是包含的。)
    Android APK 反编译工具介绍_第3张图片
  2. 从上图中可以看到,直接解压后有3个 classes.dex 文件(应用了 MultiDex 所致),这就是项目的源码。将这几个 classes.dex 文件拷贝到解压的 dex2jar 目录下,然后执行在终端如下命令进行反编译:
1. cd /你的dex2jar解压目录
2. sh d2j-dex2jar.sh classes.dex 
3. sh d2j-dex2jar.sh classes2.dex
4. sh d2j-dex2jar.sh classes3.dex
Android APK 反编译工具介绍_第4张图片
Android APK 反编译工具介绍_第5张图片

PS:如果出现 permission denied d2j_invoke.sh 的提示,则需要在终端里执行:

sudo chmod +x d2j_invoke.sh // chmod +x 命令为取消权限

然后再重新执行:

sh d2j-dex2jar.sh classes.dex
  1. 通过上面的步骤,我们已经将 .dex 转换成 .jar,接下来就可以使用 JD-GUI 或 jadx 来查看反编译后的程序源码了。


3. JD-GUI

一款免费的 Java 反编译工具,使用 C++ 开发

功能
  • 该工具可以反编译单个、多个 jar 包
  • 拥有独立图形界面,只要把文件拖到软件的那个框框里面,就可以看到源码了
使用

不需要安装,直接双击运行 jd-gui-1.4.0.jar 打开软件,然后将 classes-dex2jar.jar 文件拖拽到 JD-GUI 界面上即可,然后就可以愉快地查看源码了。
Android APK 反编译工具介绍_第6张图片

还可以将反编译后的文件保存,然后再用 Android Studio 打开。
Android APK 反编译工具介绍_第7张图片


4. jadx

一款跨平台的有 GUI 界面的反编译工具

功能
  • 可以直接将 apk 文件进行反编译
  • 反编译输出 Java 代码
  • 图形化的界面,拖拽式的操作,强大的搜索功能
  • 导出 Gradle 工程
安装

方式一:下载并解压后点击 bin 目录下的 jadx-gui 即可打开。
方式二:由于 jadx 本身是 github 上的一个开源项目,所以可以直接 clone 源代码,打开终端执行以下命令,进行编译安装。

1. git clone https://github.com/skylot/jadx.git
2. cd jadx
3. ./gradlew dist

然后将 build/jadx/bin 加入到环境变量即可。

使用

双击 bin 目录下的 jadx-gui 即可打开,使用方式同 JD_GUI 一致,也同样可以通过 File->Save All 来保存反编译后的文件再用 Android Studio 打开。
除此之外,jadx 也支持直接用命令行来反编译文件:

1. jadx -d out classes.dex #直接输出.java文件到out目录
2. #or
3. jadx-gui classes.dex #使用gui打开
Android APK 反编译工具介绍_第8张图片

另外,可以直接用 jadx-gui 打开apk 文件进行反编译。
Android APK 反编译工具介绍_第9张图片


总结

  • 如果只是想得到 .xml 文件和图片资源等,则直接使用 ApkTool 来反编译 apk 。
  • 如果想查看项目源代码,则有以下两种方式:
  1. 可以先将 apk 直接解压,再利用 dex2jar 将文件由 .dex 转换为 .jar,然后使用 JD-GUI 或 jadx 打开 .jar 文件即可看到源码,可选择保存再用其他 IDE 打开。
  2. 直接用 jadx 反编译 apk 。

你可能感兴趣的:(Android APK 反编译工具介绍)