如何将Android DEX(VM字节码)文件反编译为相应的Java源代码?
如何将Android DEX(VM字节码)文件反编译为相应的Java源代码?
获取这些工具:
源代码相当易读,因为dex2jar进行了一些优化。
以下是反编译的步骤:
将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-X.X
目录添加执行权限,例如sudo chmod -R +x dex2jar-2.0
在 JD-GUI 中打开 jar 文件。
为了更好地说明,根据您想要实现的目标,您可能会选择两条主要路径:
将Dalvik字节码(dex)反编译为可读的Java源代码。正如Fred所提到的那样,您可以使用dex2jar和jd-gui轻松完成此操作。生成的源代码有助于阅读和理解应用程序的功能,但可能无法产生100%可用的代码。换句话说,您可以阅读源代码,但无法真正修改和重新打包它。请注意,如果使用proguard对源代码进行了混淆,则生成的源代码将更加难以理解。
另一个主要选择是将字节码反汇编为smali,这是专门为此目的设计的汇编语言。我发现使用apktool是最简单的方法。一旦安装了apktool,您只需要将其指向apk文件,就会得到应用程序中每个类的smali文件。您可以阅读和修改smali,甚至可以通过从新的Java源生成smali来完全替换类(要做到这一点,您可以使用javac将.java源代码编译为.class文件,然后使用Android的dx编译器将.class文件转换为.dex文件,然后使用baksmali(smali反汇编器)将.dex转换为.smali文件,如this question所述。这里可能有捷径)。完成后,您可以使用apktool轻松地重新打包apk。请注意,apktool不会签署生成的apk,因此您需要像just like any other Android application那样小心处理。我实际上推荐您去这里: https://github.com/JesusFreke/smali
它提供了BAKSMALI,这是一个非常优秀的DEX文件反编译工具。 它由JesusFreke制作,他曾创建过Android著名的ROM。
因为 Dheeraj Bhaskar
的回答相对较旧,许多年已经过去。
这里是我的最新回答(2019年):
从 dex
转换到 java 源代码
,目前有两种解决方案:
一步
:直接将 dex
转换为 java 源代码
两步
:先将 dex
转换为 jar
,再将 jar
转换为 java 源代码
dex
直接转换为 java 源代码
bin
文件夹中可以看到命令行jadx
或 GUI 版本 jadx-gui
,双击运行 GUI 版本:jadx-gui
dex
文件然后可以显示 java 源代码:
文件
-> 保存为 gradle 项目
然后得到了 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
jar
转换为 java源代码
Procyon
的 GUI 工具
这里演示了如何使用 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
有关更详细的说明,请参阅我的在线中文电子书:安卓应用的安全和破解
dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex
,就会出现异常:java.io.IOException: the src file not a .dex or zip file
。 - Сергейd2j-dex2jar.bat "D:\android\some_dex_file.dex"
,可以吗? - crifan>d2j-dex2jar.bat file.dex
,但不行。也许是因为我的 .dex
文件是从 dalvik-cache
复制过来的? - Сергейdex是从dalvik-cache复制的
,应该是dex是从apk反编译而来的
。 - crifan首先,您需要一个工具来提取DEX上所有(编译后的)类到JAR文件中。
有一个叫做dex2jar的工具,由一位中国学生开发。
然后,您可以使用jd-gui将JAR文件中的类反编译为源代码。
生成的源代码应该非常易读,因为dex2jar应用了一些优化。
重要提示:APKTool可以反汇编,但不能反编译。
生成的代码不是Java源代码。
但如果您熟悉jasmin,您应该能够阅读甚至编辑它。
如果您需要Java源代码,请使用手动方式。
dex2jar
/apktool
时会出现损坏的代码,特别是在循环中。为了避免这种情况,可以使用 jadx,它将 dalvik 字节码反编译为 Java 源代码,而不像 dex2jar
那样先创建一个 .jar
/.class
文件(我认为 apktool 使用 dex2jar)。它还是开源的,并且正在积极开发中。甚至还有一个 GUI,适合 GUI 爱好者。试试吧!javac "$(find . -name '*.java')"
吗? - polym除了之前提到的工具外,还有一个工具:DED首页
如何安装和一些说明:安装说明。
它被用于一项非常有趣的研究,该研究关注市场上顶尖应用程序的安全性(与前面内容无关,只是如果您好奇的话):《Android应用程序安全调查》
一旦您下载了APK文件,您需要执行以下步骤才能获得可编辑的Java代码/文档:
Android逆向工程是可行的。按照以下步骤获取.apk文件中的.java文件。
步骤1:使用dex2jar
dex2jar sampleApp.apk
步骤2:使用JD-GUI反编译.jar文件