752

如何将 Android DEX(VM 字节码)文件反编译成对应的 Java 源代码?

4

17 回答 17

942

这简单

获取这些工具:

  1. dex2jar将 dex 文件转换为 jar 文件

  2. jd-gui查看jar中的java文件

由于 dex2jar 做了一些优化,源代码可读性很强。

程序:

以下是如何反编译的过程:

第1步:

将 test_apk-debug.apk 中的 classes.dex 转换为 test_apk-debug_dex2jar.jar

d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
d2j-dex2jar.sh -f -o output_jar.jar dex_to_decompile.dex

注 1:在 Windows 机器中,所有.sh脚本都替换为.bat脚本

注意 2:在 linux/mac 上不要忘记shor bash。完整的命令应该是:

sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk 

注意 3:另外,请记住向dex2jar-X.X目录添加执行权限,例如sudo chmod -R +x dex2jar-2.0

dex2jar 文档

第2步:

在 JD-GUI 中打开 jar

反编译的源码

于 2010-11-14T13:02:54.133 回答
141

稍微澄清一下,根据您想要完成的任务,您可能会在此处采用两条主要路径:

将 Dalvik 字节码 (dex) 反编译成可读的 Java 源代码。正如 fred 提到的,您可以使用dex2jarjd-gui轻松完成此操作。生成的源代码有助于阅读和理解应用程序的功能,但可能不会生成 100% 可用的代码。换句话说,你可以阅读源代码,但你不能真正修改和重新打包它。请注意,如果源代码已被 proguard 混淆,则生成的源代码将更难解开。

另一个主要的替代方法是将字节码反汇编为smali,这是一种专门为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦你安装了apktool,你可以把它指向一个apk文件,你会得到一个包含在应用程序中的每个类的smali文件。您可以读取和修改 smali,甚至通过从新的 Java 源生成 smali 来完全替换类(为此,您可以使用 javac 将 .java 源编译为 .class 文件,然后使用 Android 将 .class 文件转换为 .dex 文件) dx 编译器,然后使用 baksmali (smali disassembler) 将 .dex 转换为 .smali 文件,如本问题所述. 这里可能有一条捷径)。完成后,您可以再次使用 apktool 轻松地将 apk 打包备份。请注意,apktool 不会对生成的 apk 进行签名,因此您需要像任何其他 Android 应用程序一样处理它。

如果您走 smali 路线,您可能想尝试APK Studio,这是一个自动执行上述一些步骤的 IDE,可帮助您反编译和重新编译 apk 并将其安装在设备上。

简而言之,您的选择几乎是反编译成更具可读性但可能不可逆的 Java,或者反汇编成 smali,这更难阅读但更灵活地进行更改和重新打包修改后的应用程序。您选择哪种方法取决于您要实现的目标。

最后,dare的建议也值得注意。它是一个重定向工具,将 .dex 和 .apk 文件转换为 java .class 文件,以便使用典型的 java 静态分析工具对其进行分析。

于 2011-11-04T23:40:45.773 回答
61

我实际上建议去这里: https ://github.com/JesusFreke/smali

它提供了 BAKSMALI,这是一个最优秀的 DEX 文件逆向工程工具。它是由为 Android 创建著名 ROM 的人 JesusFreke 制作的。

于 2009-08-09T10:48:17.020 回答
32

由于Dheeraj Bhaskar's 的答案在过去很多年都相对较旧。

这是我最新的(2019 年)答案:

主逻辑

from dexto java sourcecode,目前有两种解决方案:

  • One Step: 直接转换dexjava sourcecode
  • Two Step: 第一次转换dexjar,第二次转换jarjava sourcecode

一步解决:dex直接到java sourcecode

工具

过程

  1. 下载jadx-0.9.0.zip,解压,在bin文件夹中可以看到命令行jadx或者GUI版本jadx-gui,双击运行GUI版本:jadx-gui

  1. 打开dex文件

然后可以显示java源代码:

  1. File->save as gradle project

然后得到java源代码:


两步解决方案

第一步:dexjar

工具

过程

下载dex2jar zip,解压得到d2j-dex2jar.sh,然后:

  • apkjarsh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexjarsh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

例子:

➜  v3.4.8 /Users/crifan/dev/dev_tool/android/reverse_engineering/dex-tools/dex-tools-2.1-SNAPSHOT/d2j-dex2jar.sh -f com.huili.readingclub8825612.dex
dex2jar com.huili.readingclub8825612.dex -> ./com.huili.readingclub8825612-dex2jar.jar
➜  v3.4.8 ll
-rw-------  1 crifan  staff   9.5M  3 21 10:00 com.huili.readingclub8825612-dex2jar.jar
-rw-------  1 crifan  staff   8.4M  3 19 14:04 com.huili.readingclub8825612.dex

步骤2:jarjava sourcecode

工具

过程

这里演示Procyon将jar转换为java源代码:

下载procyon-decompiler-0.5.34.jar

然后使用语法:

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

例子:

java -jar /Users/crifan/dev/dev_tool/android/reverse_engineering/Procyon/procyon-decompiler-0.5.34.jar -jar com.huili.readingclub8825612-dex2jar.jar -o com.huili.readingclub8825612

使用编辑器VSCode打开导出的源代码,如下所示:

结论

转换正确性:Jadx>>>ProcyonCRFJD-GUI

推荐使用:(一步解决方案)Jadx


更详细的解释请参考我的在线中文电子书:安卓应用的安全与破解

于 2019-04-03T02:33:47.777 回答
31

更完整的fred答案版本

手动方式

首先,您需要一个工具来将 DEX 上的所有(已编译)类提取到 JAR。
有一个叫dex2jar的,是一个中国学生做的。

然后,您可以使用jd-gui将JAR 上的类反编译为源代码。
生成的源代码应该非常可读,因为 dex2jar 应用了一些优化。

自动方式

您可以使用APKTool。它会自动提取所有.dex(_ _ _ 反汇编总是比反编译更健壮,尤其是使用 Pro Guard 混淆的 JAR!.asrc

只需告诉 APKTool将 APK解码到一个目录中,然后修改您想要的内容,
最后将其编码回 APK。就这样。

重要提示: APKTool反汇编. 它不反编译
生成的代码不会是 Java 源代码。但是如果您熟悉jasmin
,您应该能够阅读它,甚至可以编辑它。 如果您想要 Java 源代码,请查看Manual 方式

于 2012-01-09T18:01:42.160 回答
26

dex2jar有时你会在使用/时遇到错误的代码,apktool尤其是在循环中。为避免这种情况,请使用jadx,它将 dalvik 字节码反编译为 java 源代码,而无需像之前那样先创建.jar/.class文件dex2jar(我认为 apktool 使用 dex2jar)。它也是开源的并且正在积极开发中。它甚至有一个 GUI,供 GUI 狂热者使用。尝试一下!

于 2015-03-04T21:07:00.673 回答
18

我用过

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. 放大
  4. APK工具

但没有一个能比得上谷歌自己的工具

1) Android Studio 2.x: 构建> 分析 apk 在此处输入图像描述

2) Android Studio 3.0: Profile or Debug APK 在此处输入图像描述 在此处输入图像描述

于 2017-09-19T21:48:12.653 回答
15

由于没有人提到这一点,所以还有一个工具:DED 主页

安装方法和一些解释:安装

它被用于一项关于顶级市场应用程序安全性的非常有趣的研究(不是真的相关,只是如果你好奇的话):Android 应用程序安全性调查

于 2011-08-17T07:22:19.433 回答
13

下载 APK 文件后,您需要执行以下步骤来获取可编辑的 Java 代码/文档。

  1. 将您的 apk 文件转换为 zip(开始下载时不要使用“保存”选项,只需使用“另存为”并将您的扩展名提及为 .zip)通过这样做,您可以避免使用 APKTOOL ...
  2. 解压 zip 文件,在那里你可以找到 somefilename.dex。所以现在我们需要转换 dex -> .class
  3. 为此,您需要“dex2jar”(您可以从http://code.google.com/p/dex2jar/下载它,解压后,在命令提示符中您必须提及,[D:\dex2jar-0.09> dex2jar somefilename.dex](请记住,您的 somefilename.dex 必须位于保存 dex2jar 的同一文件夹中。)
  4. 从http://www.viralpatel.net/blogs/download/jad/jad.zip下载 jad并解压。解压后,您可以看到两个文件,如“jad.exe”和“Readme.txt”(有时可能是“jad.txt”而不是“jad.exe”,因此只需将其扩展名重命名为 .exe 即可运行)
  5. 最后,在命令提示符下,您必须提及[D:\jad>jad -sjava yourfilename.class]它会将您的类文件解析为可编辑的 java 文档。
于 2012-04-26T08:36:03.333 回答
8

使用Dedexer,您可以将.dex文件反汇编为 dalvik 字节码 ( .ddx)。

据我所知,不可能对 Java 进行反编译。您可以在此处
阅读有关 dalvik 字节码的信息。

于 2010-04-23T07:43:55.647 回答
8

Android 逆向工程是可能的 。按照以下步骤从 apk 文件中获取 .java 文件。

第1步 。使用 dex2jar

  • 从 .apk 文件生成 .jar 文件
  • 命令 :dex2jar sampleApp.apk

第2步 。使用 JD-GUI 反编译 .jar

  • 它会反编译.class 文件,即,我们将从apk 中得到混淆的.java。
于 2012-02-09T16:29:50.810 回答
6

最近的 Debian 有 Python 包androguard

Description-en: full Python tool to play with Android files
 Androguard is a full Python tool to play with Android files.
  * DEX, ODEX
  * APK
  * Android's binary xml
  * Android resources
  * Disassemble DEX/ODEX bytecodes
  * Decompiler for DEX/ODEX files

安装对应的包:

sudo apt-get install androguard python-networkx

反编译 DEX 文件:

$ androdd -i classes.dex -o ./dir-for-output

classes.dex从 Apk + 反编译中提取:

$ androdd -i app.apk -o ./dir-for-output

Apk 文件只不过是 Java 存档 (JAR),您可以通过以下方式从存档中提取文件:

$ unzip app.apk -d ./dir-for-output
于 2016-03-22T15:48:11.377 回答
5

自从大多数这些答案发布以来,发生了很多变化。现在有许多带有 GUI 的简单工具,例如:

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

找到它们的最佳位置是 XDA 开发者论坛。

于 2016-11-03T05:43:14.513 回答
4

你可以试试 JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ),这是一个完美的 DEX 反编译工具。

是的,它也可以在 (my :0) 新网站上在线获得:http ://www.javadecompilers.com/apk/

于 2015-08-21T11:30:07.633 回答
2

这可以通过以下五个步骤完成:

即使安装了所需的工具,这个 gem 也会自动为你做这些事情

  1. 将apk文件转换为zip
  2. 解压文件
  3. 从中提取 classes.dex
  4. 使用dex转jar将classes.dex转成jar文件
  5. 使用jadx gui打开jar文件作为java源代码
于 2016-01-31T06:17:42.313 回答
2

反编译安卓应用最简单的方法是从 playstore 下载一个名为ShowJava的应用。只需从应用程序列表中选择需要反编译的应用程序即可。您可以使用三种不同的反编译器来反编译应用程序,即 -

CFR 0.110、JaDX 0.6.1 或 FernFlower(分析反编译器)。

于 2017-04-04T17:25:56.587 回答
1

如果您不想下载 dex2jar,那么只需使用apk_grabberpython 脚本将任何 apk 反编译为 jar 文件。然后你用 jd-gui 阅读它们。

于 2015-04-17T22:03:35.333 回答