将 DEX 反编译为 Java 源代码这很容易

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


答案 1

这很容易

获取以下工具:

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

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

源代码非常可读,因为dex2jar进行了一些优化。

程序:

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

第 1 步:

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

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.Xsudo chmod -R +x dex2jar-2.0

dex2jar documentation

第 2 步:

在 JD-GUI 中打开 jar

The decompiled source


答案 2

为了澄清一下,根据您要完成的任务,您可以在此处采取两条主要途径:

将 Dalvik 字节码 (dex) 反编译为可读的 Java 源代码。正如弗雷德所提到的,你可以使用dex2jarjd-gui轻松做到这一点。生成的源对于读取和理解应用的功能很有用,但可能不会生成 100% 可用的代码。换句话说,您可以阅读源代码,但无法真正修改和重新打包它。请注意,如果源代码已被 proguard 混淆,则生成的源代码将更难理清。

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

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

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

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


推荐