将DEX反编译成Java源代码

Wil*_*ill 697 java android reverse-engineering decompiler dex

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

小智 867

这很简单

获取这些工具:

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
Run Code Online (Sandbox Code Playgroud)

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

dex2jar文档

第2步:

在JD-GUI中打开jar

反编译的来源

  • +1.我尝试了Baksmali和Dex2jar.Dex2Jar + JD-Gui为大多数.dex文件提供了完全可读的源代码. (56认同)
  • @JonathanDumaine我同意jmendeth,如果你想反编译你的apk,修改它然后重新编译它,apktool也是要走的路.使用dex2jar和jd-gui时,源代码实际上是可读的,但你不能重新编译一些错误! (3认同)
  • 上面的句子响了起来 - 这似乎是一个半引用:http://geeknizer.com/decompile-reverse-engineer-android-apk/(或者反过来?).链接的文章简要介绍了上述工具以及Smali和APKTool. (2认同)
  • @JonathanDumaine依赖.如果JAR被混淆并且您想要做一些修改,Backsmali是唯一的方法.**奖金!**使用APKTool,您还可以获得所有XML,图像和其他资源.见[我的回答](http://stackoverflow.com/a/8792985/710951). (2认同)

Zac*_*ton 132

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

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

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

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

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


ref*_*log 60

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

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

  • smali是一种基于dalvik IL的类汇编语言,它不能直接翻译成Java. (3认同)

Alb*_*dez 28

更完整的版本弗雷德答案:

手动方式

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

然后,您可以使用JD-GUI反编译的JAR源代码的类.
结果源应该是可读的,因为dex2jar应用了一些优化.

自动方式

你可以使用APKTool.它将自动提取所有类(.dex),资源(.asrc),然后它将二进制XML转换为人类可读的XML,它也 将为解组类.
反编译总是比反编译更强大,特别是对于
使用Pro Guard进行模糊处理的JAR!

只需告诉APKTool 将APK 解码为目录,然后修改您想要的内容,
最后将其编码回APK.就这样.

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


pol*_*lym 24

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


小智 15

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

安装方法和一些说明:安装.

它用于一个非常有趣的顶级市场应用程序的安全性研究(并不真正相关,只是如果你很好奇):Android应用程序安全性调查

  • 这已被**DARE**http://siis.cse.psu.edu/dare/source.html取代 (6认同)

ish*_*007 15

我用过

  1. dex2jar + jd-gui
  2. javadecompilers.com
  3. enjarify
  4. Apktool

但没有人比谷歌自己的工具更好

1)Android Studio 2.x: build> analyze apk 在此输入图像描述

2)Android Studio 3.0: 配置文件或调试APK 在此输入图像描述 在此输入图像描述

  • 加一个 Enjarify。根据我的个人经验,与 d2j 相比,它已被证明可以提供更好的结果 (2认同)

小智 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文档.


hcp*_*cpl 8

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

据我所知,不可能对Java进行反编译.
你可以在这里阅读dalvik字节码.


gti*_*333 8

Android逆向工程是可能的 .按照以下步骤从apk文件中获取.java文件.

步骤1 .使用dex2jar

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

第2步 .使用JD-GUI反编译.jar

  • 它反编译.class文件,即我们将从apk中获得模糊的 .java.

  • **逆向工程**确实_不一定意味着**反编译**.事实上,ProGuard混淆的JAR将无法正确反编译. (2认同)

cri*_*fan 8

Since Dheeraj Bhaskar's answer is relatively old as many years past.

Here is my latest (2019 year) answer:

Main Logic

from dex to java sourcecode, currently has two kind of solution:

  • One Step: directly convert dex to java sourcecode
  • Two Step: first convert dex to jar, second convert jar to java sourcecode

One step solution: dex directly to java sourcecode

Tools

Process

  1. download jadx-0.9.0.zip, unzip it, in bin folder can see command line jadx or GUI version jadx-gui, double click to run GUI version: jadx-gui

  1. open dex file

then can show java source code:

  1. File -> save as gradle project

then got java sourcecode:


Two Step solution

Step1: dex to jar

Tools

Process

download dex2jar zip, unzip got d2j-dex2jar.sh, then:

  • apk to jar: sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dex to jar: sh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

example:

?  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
Run Code Online (Sandbox Code Playgroud)

Step2: jar to java sourcecode

Tools

Process

here demo Procyon convert jar to java source code:

download procyon-decompiler-0.5.34.jar

then using syntax:

java -jar /path/to/procyon-decompiler-0.5.34.jar -jar your_to_decompile.jar -o outputFolderName

example:

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

using editor VSCode to open exported source code, look like this:

Conclusion

Conversion correctness : Jadx > Procyon > CRF > JD-GUI

Recommend use: (One step solution's) Jadx


for more detailed explanation, please refer my online Chinese ebook: ??????????


gav*_*koa 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
Run Code Online (Sandbox Code Playgroud)

安装相应的包:

sudo apt-get install androguard python-networkx
Run Code Online (Sandbox Code Playgroud)

反编译DEX文件:

$ androdd -i classes.dex -o ./dir-for-output
Run Code Online (Sandbox Code Playgroud)

classes.dex从Apk + Decompile中提取:

$ androdd -i app.apk -o ./dir-for-output
Run Code Online (Sandbox Code Playgroud)

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

$ unzip app.apk -d ./dir-for-output
Run Code Online (Sandbox Code Playgroud)


MPa*_*ulo 5

自从大多数答案发布以来,已经发生了很多变化.现在有很多简单的GUI工具,如下所示:

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

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