如何将DEX反编译为Java源码?

新手上路,请多包涵

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

原文由 Will 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.8k
2 个回答

这很简单

获取这些工具:

  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 上不要忘记 shbash 。完整的命令应该是:

 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

反编译源

原文由 fred 发布,翻译遵循 CC BY-SA 4.0 许可协议

为了稍微澄清一下,根据您想要完成的任务,您可以在此处选择两条主要路径:

将 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 反汇编程序)将 .dex 转换为 .smali 文件,如 本问题 中所述。这里可能有一个快捷方式)。完成后,您可以轻松地再次使用 apktool 将 apk 打包备份。请注意,apktool 不会对生成的 apk 进行签名,因此您需要 像处理任何其他 Android 应用程序一样 处理它。

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

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

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

原文由 Zach Lipton 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题