学而实习之 不亦乐乎

Android 反编译工具及用法

2024-04-23 20:27:24

一、反编译概念

反编译就是通过对一个软件的逆向操作,推导获取到该软件的整体设计思路、资源结构,甚至源码的过程。

计算机软件反向工程(Reverse engineering)也称为计算机软件的还原工程,是指通过对他人软件的目标程序(比如可执行程序)进行“逆向分析、研究”工作,以推导出他人的软件产品所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,某些特定情况下可能推导出源代码。反编译作为自己开发软件时的参考,或者直接用于自己的软件产品中。

二、反编译工具

1、三个工具

  • Apktool:通过该工具能完整的从 apk 中提取出 resource、dex、manifest、xml 等文件,也可以修改资源文件之后 rebuild 一个 apk。
  • dex2jar:通过该工具将 dex 文件变成一个(包含class 文件的)jar 文件。
  • JD-GUI:通过该工具,可以通过可视化的界面操作查看第二步生成的 jar 文件,即查看反编译后的源码情况。

2、具体操作

以上简单介绍了三个工具的主要功能,每个工具的具体操作如下:

  • 步骤一,反编译获取资源文件:Apktool 操作说明
  • 步骤二,解压 apk,将 dex 转为 jar 文件并查看 class 源码:dex2jar 和 JD-GUI 操作说明

如果仅仅需要查看源码文件,而对 apk 的资源文件不感兴趣,可以跳过步骤一直接走步骤二来反编译处理。

三、Apktool

关于安装,官网 https://ibotpeaches.github.io/Apktool/ 有详细的说明,这里不多说,只简单记录使用方法。

1、反编译

可以使用 d 或者 decode 选项。

$ apktool d foo.jar
// decodes foo.jar to foo.jar.out folder

$ apktool decode foo.jar
// decodes foo.jar to foo.jar.out folder

$ apktool d bar.apk
// decodes bar.apk to bar folder

$ apktool decode bar.apk
// decodes bar.apk to bar folder

$ apktool d bar.apk -o baz
// decodes bar.apk to baz folder

执行完毕,会生成一个文件夹,里面就是我们反编译出来的文件。

2、编译

可以使用 b 或者 build 选项。

$ apktool b foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool build foo.jar.out
// builds foo.jar.out folder into foo.jar.out/dist/foo.jar file

$ apktool b bar
// builds bar folder into bar/dist/bar.apk file

$ apktool b .
// builds current directory into ./dist

$ apktool b bar -o new_bar.apk
// builds bar folder into new_bar.apk

$ apktool b bar.apk
// WRONG: brut.androlib.AndrolibException: brut.directory.PathNotExist: apktool.yml
// Must use folder, not apk/jar file

三、dex2jar 和 JD-GUI 工具

1、目标 dex 文件操作

dex2jar 工具 GitHub链接:https://github.com/pxb1988/dex2jar

下载解压后,命令行进入到该 dex-tools 路径下进行 dex 操作。

apk 安装包本质是经过特殊处理的压缩包,可以直接将 target.apk 修改后缀名为 target.zip,然后通过解压工具解压,解压后的文件夹包含各种资源文件和文件夹,以及 dex 文件,如果apk是多个 dex 文件组成,解压后会有多个dex 存在,可逐个操作。

需要注意的是,直接通过 zip 解压出来的文件,资源文件(比如 manifest 等文件)都是一些二进制码,无法直接查看,如果想要查看,请看该专题的第二篇文章来操作。

执行脚本:sh d2j-dex2jar.sh classes.dex

2、通过JD-GUI 工具查看 jar 文件

JD-GUI官网链接:http://java-decompiler.github.io/
下载完成后解压,直接打开JD-GUI 文件工具。直接将 之前通过dex2jar生成的 jar文件拖入 JD-GUI 即可查看源码。通过工具可以查看到源码是否有混淆。