如何将 Android DEX(VM 字节码)文件反编译成对应的 Java 源代码?
17 回答
这简单
获取这些工具:
由于 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 上不要忘记
sh
orbash
。完整的命令应该是:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
注意 3:另外,请记住向
dex2jar-X.X
目录添加执行权限,例如sudo chmod -R +x dex2jar-2.0
第2步:
在 JD-GUI 中打开 jar
稍微澄清一下,根据您想要完成的任务,您可能会在此处采用两条主要路径:
将 Dalvik 字节码 (dex) 反编译成可读的 Java 源代码。正如 fred 提到的,您可以使用dex2jar和jd-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 静态分析工具对其进行分析。
我实际上建议去这里: https ://github.com/JesusFreke/smali
它提供了 BAKSMALI,这是一个最优秀的 DEX 文件逆向工程工具。它是由为 Android 创建著名 ROM 的人 JesusFreke 制作的。
由于Dheeraj Bhaskar
's 的答案在过去很多年都相对较旧。
这是我最新的(2019 年)答案:
主逻辑
from dex
to java sourcecode
,目前有两种解决方案:
One Step
: 直接转换dex
为java sourcecode
Two Step
: 第一次转换dex
为jar
,第二次转换jar
为java sourcecode
一步解决:dex
直接到java sourcecode
工具
过程
- 下载jadx-0.9.0.zip,解压,在
bin
文件夹中可以看到命令行jadx
或者GUI版本jadx-gui
,双击运行GUI版本:jadx-gui
- 打开
dex
文件
然后可以显示java源代码:
File
->save as gradle project
然后得到java源代码:
两步解决方案
第一步:dex
到jar
工具
过程
下载dex2jar zip,解压得到d2j-dex2jar.sh
,然后:
apk
至jar
:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
dex
至jar
:sh 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:jar
到java 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
>>>Procyon
CRF
JD-GUI
推荐使用:(一步解决方案)Jadx
更详细的解释请参考我的在线中文电子书:安卓应用的安全与破解
手动方式
首先,您需要一个工具来将 DEX 上的所有(已编译)类提取到 JAR。
有一个叫dex2jar的,是一个中国学生做的。
然后,您可以使用jd-gui将JAR 上的类反编译为源代码。
生成的源代码应该非常可读,因为 dex2jar 应用了一些优化。
自动方式
您可以使用APKTool。它会自动提取所有的类.dex
(_ _ _ 反汇编总是比反编译更健壮,尤其是使用
Pro Guard 混淆的 JAR!.asrc
只需告诉 APKTool将 APK解码到一个目录中,然后修改您想要的内容,
最后将其编码回 APK。就这样。
重要提示: APKTool反汇编. 它不反编译。
生成的代码不会是 Java 源代码。但是如果您熟悉jasmin
,您应该能够阅读它,甚至可以编辑它。
如果您想要 Java 源代码,请查看Manual 方式。
dex2jar
有时你会在使用/时遇到错误的代码,apktool
尤其是在循环中。为避免这种情况,请使用jadx,它将 dalvik 字节码反编译为 java 源代码,而无需像之前那样先创建.jar
/.class
文件dex2jar
(我认为 apktool 使用 dex2jar)。它也是开源的并且正在积极开发中。它甚至有一个 GUI,供 GUI 狂热者使用。尝试一下!
由于没有人提到这一点,所以还有一个工具:DED 主页
安装方法和一些解释:安装。
它被用于一项关于顶级市场应用程序安全性的非常有趣的研究(不是真的相关,只是如果你好奇的话):Android 应用程序安全性调查
下载 APK 文件后,您需要执行以下步骤来获取可编辑的 Java 代码/文档。
- 将您的 apk 文件转换为 zip(开始下载时不要使用“保存”选项,只需使用“另存为”并将您的扩展名提及为 .zip)通过这样做,您可以避免使用 APKTOOL ...
- 解压 zip 文件,在那里你可以找到 somefilename.dex。所以现在我们需要转换 dex -> .class
- 为此,您需要“dex2jar”(您可以从http://code.google.com/p/dex2jar/下载它,解压后,在命令提示符中您必须提及,[D:\dex2jar-0.09> dex2jar somefilename.dex](请记住,您的 somefilename.dex 必须位于保存 dex2jar 的同一文件夹中。)
- 从http://www.viralpatel.net/blogs/download/jad/jad.zip下载 jad并解压。解压后,您可以看到两个文件,如“jad.exe”和“Readme.txt”(有时可能是“jad.txt”而不是“jad.exe”,因此只需将其扩展名重命名为 .exe 即可运行)
- 最后,在命令提示符下,您必须提及[D:\jad>jad -sjava yourfilename.class]它会将您的类文件解析为可编辑的 java 文档。
Android 逆向工程是可能的 。按照以下步骤从 apk 文件中获取 .java 文件。
第1步 。使用 dex2jar
- 从 .apk 文件生成 .jar 文件
- 命令 :
dex2jar sampleApp.apk
第2步 。使用 JD-GUI 反编译 .jar
- 它会反编译.class 文件,即,我们将从apk 中得到混淆的.java。
最近的 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
自从大多数这些答案发布以来,发生了很多变化。现在有许多带有 GUI 的简单工具,例如:
APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit
找到它们的最佳位置是 XDA 开发者论坛。
你可以试试 JADX ( https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler ),这是一个完美的 DEX 反编译工具。
是的,它也可以在 (my :0) 新网站上在线获得:http ://www.javadecompilers.com/apk/
这可以通过以下五个步骤完成:
- 将apk文件转换为zip
- 解压文件
- 从中提取 classes.dex
- 使用dex转jar将classes.dex转成jar文件
- 使用jadx gui打开jar文件作为java源代码
反编译安卓应用最简单的方法是从 playstore 下载一个名为ShowJava的应用。只需从应用程序列表中选择需要反编译的应用程序即可。您可以使用三种不同的反编译器来反编译应用程序,即 -
CFR 0.110、JaDX 0.6.1 或 FernFlower(分析反编译器)。
如果您不想下载 dex2jar,那么只需使用apk_grabber
python 脚本将任何 apk 反编译为 jar 文件。然后你用 jd-gui 阅读它们。