将DEX反编译成Java源代码

问题

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


#1 热门回答(822 赞)

这很容易

获取这些工具:

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

注意:在Windows机器中,所有.sh脚本都被.bat脚本替换
dex2jar documentation

第2步:

在JD-GUI中打开jar

The decompiled source


#2 热门回答(124 赞)

为了澄清一点,根据你想要完成的任务,你可以在此处使用两条主要路径:

将Dalvik字节码(dex)反编译为可读的Java源代码。你可以轻松地使用dex2jarjd-gui轻松完成此操作,正如fred提到的那样。生成的源可用于阅读和理解应用程序的功能,但可能不会产生100%可用的代码。换句话说,你可以阅读源代码,但无法真正修改和重新打包它。请注意,如果使用proguard对源进行了混淆,则生成的源代码将难以解开。

另一个主要的替代方案是将字节码反汇编为306349880,这是一种专为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦你安装了apktool,你就可以将它指向一个apk文件,然后你将获得应用程序中包含的每个类的一个smali文件。你可以通过从新Java源生成smali来完全读取和修改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静态分析工具对其进行分析。


#3 热门回答(59 赞)

我实际上建议你去这里:https://github.com/JesusFreke/smali

它提供了BAKSMALI,这是DEX文件最优秀的逆向工程工具。它是由JesusFreke制作的,他为Android创造了成名的ROM。