将DEX反编译成Java源代码

时间:2009-08-08 21:39:45

标签: java android reverse-engineering decompiler dex

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

17 个答案:

答案 0 :(得分:849)

很容易

获取这些工具:

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
  

注意:在Windows计算机中,所有.sh脚本都被.bat脚本替换

dex2jar documentation

第2步:

在JD-GUI中打开jar

The decompiled source

答案 1 :(得分:127)

为了澄清一点,根据你想要完成的目标,你可以在这里采取两种主要途径:

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

另一个主要的替代方法是将字节码反汇编为smali,这是一种专为此目的而设计的汇编语言。我发现最简单的方法是使用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静态分析工具对它们进行分析。

答案 2 :(得分:60)

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

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

答案 3 :(得分:28)

fredanswer的更完整版本:

手动方式

首先,您需要一个工具来提取 DEX上的所有(已编译)类到JAR。
有一个叫dex2jar,由中国学生制作。

然后,您可以使用jd-gui 反编译 JAR上的类来获取源代码。
结果源应该是可读的,因为dex2jar应用了一些优化。

自动方式

您可以使用APKTool。它将自动提取所有类(.dex),资源(.asrc),然后它将二进制XML 转换为 human-可读的XML ,它也会为您强烈反汇编反汇编总是比反编译更强大,特别是
JAR用Pro Guard混淆了!

告诉APKTool 解码将APK转换为目录,然后修改您想要的内容,
最后编码回到APK。就是这样。

重要提示:APKTool disassembles 。它不会反编译 生成的代码不是Java源代码 但是你应该能够阅读它,如果你熟悉jasmin,你甚至可以编辑它 如果您需要Java源代码,请查看手动方式

答案 4 :(得分:22)

有时,在使用dex2jar / apktool时,您会遇到损坏的代码,最明显的是在循环中。要避免这种情况,请使用jadx,将dalvik字节码反编译为java源代码,而不首先.jar创建.class / dex2jar文件(我认为apktool使用dex2jar) 。它也是开源和积极的开发。它甚至还有一个GUI,用于GUI狂热分子。试试吧!

答案 5 :(得分:15)

由于没有人提到这一点,还有一个工具:DED homepage

安装操作方法和一些解释:Installation

它被用于一个非常有趣的顶级市场应用程序安全性研究(并非真正相关,只要你好奇):A Survey of Android Application Security

答案 6 :(得分:15)

我用过

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. enjarify
  4. Apktool
  5. 但没有人比谷歌自己的工具更胜一筹

    1) Android Studio 2.x: 构建>分析apk enter image description here

    2) Android Studio 3.0: 个人资料或调试APK enter image description here enter image description here

答案 7 :(得分:13)

下载APK文件后,您需要执行以下步骤以获取可编辑的Java代码/文档。

  1. 将您的apk文件转换为zip(开始下载时不要使用“保存”选项,只需使用“另存为”并提及您的扩展名为.zip)这样做可以避免APKTOOL ...
  2. 解压缩zip文件,在那里你可以找到somefilename.dex。所以现在我们需要转换dex - >的.class
  3. 要做到这一点,你需要“dex2jar”(你可以从http://code.google.com/p/dex2jar/下载它,在解压后,在命令提示符中你必须提到像 [D:\ dex2jar-0.09> dex2jar somefilename .dex] (请记住,你的somefilename.dex必须位于保存dex2jar的同一个文件夹中。)
  4. http://www.viralpatel.net/blogs/download/jad/jad.zip下载jad并解压缩。提取后你可以看到两个文件,如“jad.exe”和“Readme.txt”(有时候“jad.txt”可能代替“jad.exe”,所以只需将其扩展名重命名为as.exe即可运行)
  5. 最后,在命令提示符中你必须提到像 [D:\ jad> jad -sjava yourfilename.class] 它会将你的类文件解析为可编辑的java文档。

答案 8 :(得分:8)

使用Dedexer,您可以将.dex文件反汇编为dalvik字节码(.ddx)。

据我所知,不可能对Java进行反编译 你可以阅读有关dalvik字节码here的信息。

答案 9 :(得分:8)

Android Reverse Engineering is possible  。按照以下步骤从apk文件中获取.java文件。

Step1。使用dex2jar

  • 从.apk文件生成.jar文件
  • 命令:dex2jar sampleApp.apk

Step2。使用JD-GUI

反编译.jar
  • 它会反编译.class文件,即我们会从apk中获取模糊处理 .java。

答案 10 :(得分:6)

最近的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 + Decompile中提取classes.dex

$ androdd -i app.apk -o ./dir-for-output

Apk文件不再是Java存档(JAR),您可以通过以下方式从存档中提取文件:

$ unzip app.apk -d ./dir-for-output

答案 11 :(得分:5)

由于大多数答案都已发布,因此发生了很多变化。现在有很多简单的GUI工具,比如:

APK Easy Tool for Windows (GUI tool, friendly)
Bytecode Viewer - APK/Java Reverse Engineering Suite
URET Android Reverser Toolkit

找到它们的最佳位置是在XDA开发者论坛上。

答案 12 :(得分:3)

您可以尝试JADX(https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler),这是DEX反编译的完美工具。

是的,它也可以通过(我的:0)新网站在线获得:http://www.javadecompilers.com/apk/

答案 13 :(得分:3)

由于Dheeraj Bhaskar的答案相对而言已经有很多年了。

这是我最新的答案(2019年):

主逻辑

dexjava sourcecode,目前有两种解决方案:

  • One Step:直接将dex转换为java sourcecode
  • Two Step:首先将dex转换为jar,然后将jar转换为java sourcecode

一个解决方案:直接从dexjava sourcecode

工具

过程

  1. 下载jadx-0.9.0.zip,解压缩后,在bin文件夹中可以看到命令行jadx或GUI版本jadx-gui,双击运行GUI版本:jadx-gui

  1. 打开dex文件

然后可以显示Java源代码:

  1. File-> save as gradle project

然后得到了Java源代码:


两步解决方案

第1步:从dexjar

工具

过程

下载dex2jar zip,解压缩得到d2j-dex2jar.sh,然后:

  • apkjarsh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dexjarsh 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

步骤2:从jarjava sourcecode

工具

过程

此处演示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


有关详细说明,请参阅我的在线中文电子书:安卓应用的安全和破解

答案 14 :(得分:2)

这可以通过以下五个步骤来完成:

This gem does these things for you automatically even the installation of required tools

  1. 将apk文件转换为zip
  2. 解压缩文件
  3. 从中提取classes.dex
  4. 使用dex to jar将classes.dex转换为jar文件
  5. 使用jadx gui打开jar文件作为java源代码

答案 15 :(得分:2)

最简单的反编译Android应用程序的方法是从playstore下载名为 ShowJava 的应用程序。只需从应用程序列表中选择需要反编译的应用程序即可。您可以使用三种不同的反编译器来反编译应用程序 -

  

CFR 0.110,JaDX 0.6.1或FernFlower(分析反编译器)。

答案 16 :(得分:1)

如果您不想下载dex2jar,那么只需使用apk_grabber python script将任何apk反编译为jar文件。然后你用jd-gui读它们。