如何将 Android DEX(VM 字节码)文件反编译成对应的 Java 源代码?
这很简单
获取这些工具:
dex2jar 将 dex 文件翻译成 jar 文件 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 上不要忘记 sh 或 bash。完整的命令应该是:
sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk
注意 3:另外,记得给 dex2jar-XX 目录添加执行权限 eg sudo chmod -R +x dex2jar-2.0
第2步:
在 JD-GUI 中打开 jar
https://i.stack.imgur.com/PWJIX.png
稍微澄清一下,根据您想要完成的任务,您可能会在此处采用两条主要路径:
将 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 反汇编程序)将 .dex 转换为 .smali 文件,如this question所述。此处可能有快捷方式)。完成后,您可以再次使用 apktool 轻松地将 apk 打包备份。请注意,apktool 不会对生成的 apk 进行签名,因此您需要注意该 just like any other Android application。
如果您走 smali 路线,您可能想尝试 APK Studio,这是一个自动执行上述一些步骤的 IDE,可帮助您反编译和重新编译 apk 并将其安装在设备上。
简而言之,您的选择几乎是反编译成更具可读性但可能不可逆的 Java,或者反汇编成 smali,这更难阅读但更灵活地进行更改和重新打包修改后的应用程序。您选择哪种方法取决于您要实现的目标。
最后,dare 的建议也值得注意。它是一个重定向工具,将 .dex 和 .apk 文件转换为 java .class 文件,以便使用典型的 java 静态分析工具对其进行分析。
我实际上建议去这里:https://github.com/JesusFreke/smali
它提供了 BAKSMALI,这是一个最优秀的 DEX 文件逆向工程工具。它是由为 Android 创建著名 ROM 的人 JesusFreke 制作的。
./apktool d myprogram.apk
一样简单。请参阅my answer。
由于 Dheeraj Bhaskar
的答案在过去多年中相对较旧。
这是我最新的(2019 年)答案:
主逻辑
从dex
到java sourcecode
,目前有两种解决方案:
一步:直接将dex转成java源码
两步:先将dex转jar,再将jar转java源码
一步解决:dex直接转java源码
工具
贾克斯
过程
下载jadx-0.9.0.zip,解压,bin文件夹下可以看到命令行jadx或者GUI版本jadx-gui,双击运行GUI版本:jadx-gui
https://i.stack.imgur.com/2Rlas.png
打开.dex文件
https://i.stack.imgur.com/8A9k2.png
然后可以显示java源代码:
https://i.stack.imgur.com/Pojp8.png
文件 -> 另存为 gradle 项目
https://i.stack.imgur.com/aPZxq.png
然后得到java源代码:
https://i.stack.imgur.com/xHtcW.png
两步解决方案
Step1:dex转jar
工具
dex2jar
过程
下载 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
Step2:jar转java源代码
工具
jd-gui:最流行,但很多代码会反编译错误
CRF:流行,次要代码会反编译错误
Procyon:流行的,基于 Procyon Luyten 的无代码反编译错误 GUI 工具:字节码查看器
基于 Procyon Luyten 的 GUI 工具:Bytecode Viewer
卢腾:
字节码查看器
其他 Krakatau Fernflower 老一号:AndroChef 等。
喀拉喀托
蕨花
老一:AndroChef
等等
过程
这里演示 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 打开导出的源代码,如下所示:
https://i.stack.imgur.com/Nk62j.png
结论
转换正确性:Jadx
> Procyon
> CRF
> JD-GUI
推荐使用:(一步解决)Jadx
更详细的解释请参考我的在线中文电子书:安卓应用的安全和破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
执行 1 步(在 Windows 上进行 dex 到 jar 反编译),则会出现异常:java.io.IOException: the src file not a .dex or zip file
d2j-dex2jar.bat "D:\android\some_dex_file.dex"
可以吗?
>d2j-dex2jar.bat file.dex
,但不行。也许是因为我的 .dex
文件是从 dalvik-cache
复制的?
dex is copied from dalvik-cache
,应该是dex is decompiled from apk
手动方式
首先,您需要一个工具将 DEX 上的所有(已编译)类提取到一个 JAR。
有一个名为 dex2jar 的工具,它是由一位中国学生制作的。
然后,您可以使用 jd-gui 将 JAR 上的类反编译为源代码。
生成的源代码应该非常可读,因为 dex2jar 应用了一些优化。
自动方式
您可以使用 APKTool。它将自动提取所有类 (.dex
)、资源 (.asrc
),然后将 二进制 XML 转换为 人类可读的 XML em>,它还会为您反汇编类。
反汇编总是比反编译更健壮,尤其是带有
混淆的 JAR专业守卫!
只需告诉 APKTool 将 APK 解码到一个目录中,然后修改您想要的内容,最后将其编码回 APK。就这样。
重要提示: APKTool 反汇编。它不会反编译。
生成的代码不会是 Java 源代码。
但您应该能够阅读它,如果您熟悉 {1,甚至可以编辑它}.
如果您想要Java 源代码,请查看手动方式。
有时您会在使用 dex2jar
/apktool
时遇到错误代码,尤其是在循环中。为避免这种情况,请使用 jadx,它将 dalvik 字节码反编译为 java 源代码,而无需像 dex2jar
那样首先创建 .jar
/.class
文件(我认为 apktool 使用 dex2jar)。它也是开源的并且正在积极开发中。它甚至有一个 GUI,供 GUI 狂热者使用。试试看!
javac "$(find . -name '*.java')"
吗?
我用过
dex2jar + jd-gui javadecompilers.com enjarify Apktool
但没有一个能比得上谷歌自己的工具
https://i.stack.imgur.com/yaH7q.png
https://i.stack.imgur.com/01z9A.png
由于没有人提到这一点,所以还有一个工具:DED homepage
安装方法和一些说明:Installation。
它被用于一项关于顶级市场应用程序安全性的非常有趣的研究(不是真的相关,只是如果您好奇的话):A Survey of Android Application Security
下载 APK 文件后,您需要执行以下步骤来获取可编辑的 Java 代码/文档。
将您的 apk 文件转换为 zip(开始下载时不要使用“保存”选项,只需使用“另存为”并将您的扩展名提及为 .zip)通过这样做,您可以避免使用 APKTOOL... 提取 zip文件,在那里你可以找到一些文件名.dex。所以现在我们需要转换 dex -> .class 要做到这一点,你需要“dex2jar”(你可以从 http://code.google.com/p/dex2jar/ 下载它,解压后,在命令提示符下你必须提到像 [D:\dex2jar-0.09>dex2jar somefilename.dex] (请记住,您的 somefilename.dex 必须位于保存 dex2jar 的同一文件夹中。)从 http://www.viralpatel 下载 jad。 net/blogs/download/jad/jad.zip 并解压。解压后,您可以看到两个文件,如“jad.exe”和“Readme.txt”(有时“jad.txt”可能在那里而不是“jad.exe” ,所以只需将其扩展名重命名为 .exe 即可运行)最后,在命令提示符中,您必须提及 [D:\jad>jad -sjava yourfilename.class] 它会将您的类文件解析为可编辑的 java 文档。
Android Reverse Engineering is possible 。按照以下步骤从 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
从 Apk + 反编译中提取 classes.dex
:
$ 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/
这可以通过以下五个步骤完成:
This gem does these things for you automatically even the installation of required tools
将apk文件转换为zip解压缩文件从中提取classes.dex使用dex到jar将classes.dex转换为jar文件使用jadx gui打开jar文件作为java源代码
反编译安卓应用最简单的方法是从 playstore 下载一个名为 ShowJava 的应用。只需从应用程序列表中选择需要反编译的应用程序即可。您可以使用三种不同的反编译器来反编译应用程序,即 -
CFR 0.110、JaDX 0.6.1 或 FernFlower(分析反编译器)。