将DEX反编译为Java源代码

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

对该问题的评论 (4)
解决办法

∮ It's easy

获取这些工具。

  1. dex2jar 将dex文件翻译成jar文件

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

由于dex2jar进行了一些优化,源代码是相当可读的。

程序。

这里是关于如何反编译的程序'。

Step 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文档

第二步。

在JD-GUI中打开jar

评论(11)

在某种程度上澄清一下,根据你想完成的任务,你可以采取两种主要的路径。

将Dalvik字节码(dex)反编译成可读的Java源代码。 正如fred所提到的,你可以通过[dex2jar][1]和[jd-gui][2]轻松完成。 所得到的源码对于阅读和理解应用程序的功能是有用的,但很可能不会产生100%可用的代码。 换句话说,你可以阅读源码,但你不能真正修改和重新打包它。 需要注意的是,如果源码已经被proguard混淆了,那么产生的源码将更加难以解开。

另一个主要的选择是将字节码反汇编成[smali][3],这是一种专门为此目的而设计的汇编语言。 我发现最简单的方法是使用[apktool][4]。 一旦你'安装了apktool,你只需将它指向一个apk文件,你'就会为应用程序中包含的每个类返回一个smali文件。 你可以通过从新的Java源码中生成smali来读取和修改smali,甚至完全替换类(要做到这一点,你可以用javac将你的.java源码编译成.class文件,然后用Android'的dx编译器将你的.class文件转换为.dex文件,然后用baksmali(smali反汇编器)将.dex转换为.smali文件,如[本题][5]所述。 这里可能有一个捷径)。) 一旦你'完成了,你可以很容易地用apktool再次将apk打包回来。 请注意,apktool不会对生成的apk进行签名,所以你'需要处理好这个问题[就像其他Android应用程序一样][6]。

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

简而言之,你的选择几乎是要么反编译成Java,它更易读,但很可能是不可逆的,要么反汇编成smali,它更难读,但更灵活,可以进行修改和重新打包修改后的应用。 选择哪种方式要看你要达到什么目的。

最后,[敢][8]的建议也值得注意。 它'是一个重定向工具,可以将.dex和.apk文件转换为java.class文件,这样就可以使用典型的java静态分析工具对它们进行分析。

[1]: http://code.google.com/p/dex2jar/ [2]: http://java.decompiler.free.fr/?q=jdgui [3]: [3]:http://code.google.com/p/smali/ [4]: http://code.google.com/p/android-apktool/ [5]: https://stackoverflow.com/questions/5448267/direct-java-to-smali-conversion-possible [6]: http://developer.android.com/guide/publishing/app-signing.html [7]: http://www.vaibhavpandey.com/apkstudio/ [8]: http://siis.cse.psu.edu/dare/index.html

评论(2)

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

它提供了BAKSMALI,这是一个最优秀的DEX文件的反向工程工具。 它是由JesusFreke制作的,这个人为Android制作了著名的ROM。

评论(4)

一个更完整的版本fred'的答案:</sup&gt。

##手动方式

首先你需要一个工具来提取所有DEX上的(编译的)类到一个JAR中。 有一个叫dex2jar的,是一个中国学生做的。

然后,你可以用[jd-gui][2]把JAR上的类**反编译成源代码。 由于dex2jar应用了一些优化,所以生成的源代码应该是相当可读的。

1:

[2]: http://jd.benow.ca/

□自动方式

你可以使用APKTool。 它将自动提取所有的类(.dex)和资源(.asrc),然后它将把二进制的XML转换成人类可读的XML,并且它还将为你反汇编这些类。 反汇编总是比反编译更稳健,尤其是在使用 JARs用Pro Guard混淆了!

只要告诉APKTool将APK_解码到一个目录,然后_修改你想要的东西。 并最终_将其编码回APK。 这就是全部。

重要的是: APKTool dissassembles。 它不会反编译。 生成的代码不会是Java源代码。 但你应该能够阅读它,甚至编辑它,如果你熟悉jasmin。 如果你想要Java源码,请通过手动方式

评论(0)

在使用dex2jar/apktool时,有时你会得到破碎的代码,最明显的是在循环中。 为了避免这种情况,请使用jadx,它可以将dalvik字节码反编译成java源代码,而不像dex2jar那样先创建.jar/.class文件(apktool使用dex2jar吧)。 它也是开源的,而且正在积极开发中。 它甚至有一个GUI,给GUI爱好者。 试试吧

评论(8)

既然没人提,那就多一个工具吧'。 [DED主页][1]

安装方法和一些解释。 安装][2]。

它被用在了一个相当有趣的关于顶级市场应用安全的研究中(其实并不相关,只是如果你&#39;好奇的话)。 A Survey of Android Application Security][3] 。

[1]: http://siis.cse.psu.edu/ded/ [2]: http://siis.cse.psu.edu/ded/installation.html [3]: http://www.enck.org/pubs/enck-sec11.pdf

评论(2)

我已经使用了

  1. dex2jar + jd-gui;
  2. javadecompilers.com

  3. enjarify
  4. Apktool

但没有人比google'自己的工具更胜一筹。

1)Android Studio 2.x:。 build> 分析apk [![在此输入图像描述][1]][1]

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

[1]: https://i.stack.imgur.com/yaH7q.png [2]: https://i.stack.imgur.com/01z9A.png [3]: https://i.stack.imgur.com/FB8KM.png

评论(1)

一旦你下载了你的APK文件,你需要做以下步骤来获得一个可编辑的java代码/文档。

  1. 将你的apk文件转换为zip文件(当开始下载时,不要用"save&quot.选项,只要用"save as"即可。 选项,只要用"另存为&quot。 并注明你的扩展名为.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&quot。 和"Readme.txt&quot。 (有时"jad.txt" 可能会代替"jad.exe",所以只要将其扩展名重命名为.exe即可运行。) 最后,在命令提示符中你要提[D:\jad>jad -sjava yourfilename.class],它将把你的类文件解析成可编辑的java文档。

评论(1)

由于Dheeraj Bhaskar'的答案比较老,因为过去很多年了。

下面是我最新(2019年)的答案。

主要逻辑

从 "dex "到 "java sourcecode",目前有两种解决方案。

  • "一步到位"。 直接将dex转为java源代码
  • "两步"。 首先将 "dex "转换为 "jar",其次将 "jar "转换为 "java源码"。

一步解决。

dex直接转为java源码

工具

进程

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

2.打开dex文件

然后可以显示java源码。

  1. File -> save as gradle project

然后得到java源码。


两步解决方案

第1步:将 "dex "改为 "jar"。

dex改为jar

工具

进程

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

  • apk改为jarsh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk
  • dex改为jarsh d2j-dex2jar.sh -f ~/path/to/dex_to_decompile.dex

例如:{{{5946887}}。

➜  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。

将 "jar "改为 "java源码"。

工具

进程

这里演示了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

推荐使用。 (一步解决's)Jadx


更详细的解释,请参考我的在线中文电子书。 安卓应用的安全和破解

评论(5)

安卓逆向工程是可能的 . 按照这些步骤从apk文件中获取.java文件。

Step1 . 使用dex2jar

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

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

  • 它反编译.class文件,也就是说,我们将从apk中得到obfuscated.java。

1:

评论(9)

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

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

评论(2)

最近的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中提取classes.dex,然后反编译。

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

Apk文件无非是Java存档(JAR),你可以通过提取存档文件。

$ unzip app.apk -d ./dir-for-output
评论(0)

自从这些答案被发布以来,已经发生了很多变化。 现在有很多简单的GUI工具,比如这些。

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

最好的地方是在XDA开发者论坛上找到它们。

评论(0)

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

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

评论(0)

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

这个gem会自动为你做这些事情,甚至安装所需的工具

  1. 将apk文件转换为zip 2.解压文件
  2. 从中提取classes.dex

  3. 使用dex to jar将classes.dex转换为jar文件。

  4. 使用jadx gui将jar文件作为java源代码打开。

评论(1)

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

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

评论(0)

如果你不是想下载dex2jar,那么只需使用apk_grabberpython脚本将任何apk解压成jar文件。 然后你用jd-gui读取它们。

评论(0)