如何将DEX反编译为Java源代码?

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

630208 次浏览

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

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

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

据我所知,向Java解压缩是不可能的。
您可以阅读有关dalvik字节码这里的信息。

这很容易

获取这些工具:

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

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

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

操作流程:

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

步骤1:

将test_apk-debug.apkclasses.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

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

注2:在linux/mac上不要忘记shbash。完整的命令应该是:

sh d2j-dex2jar.sh -f -o output_jar.jar apk_to_decompile.apk

注3:此外,请记住将执行权限添加到dex2jar-X.X目录,例如sudo chmod -R +x dex2jar-2.0

dex2jar留档

步骤2:

在JD-GUI中打开罐子

反编译的源代码

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

安装操作方法和一些说明:安装

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

为了在某种程度上澄清,根据您想要完成的任务,您可能会采取两条主要路径:

将Dalvik字节码(dex)分解为可读Java源代码。正如fred提到的,使用dex2jarjd-gui可以很容易地做到这一点。生成的源代码对于阅读和理解应用程序的功能很有用,但可能不会产生100%可用的代码。换句话说,你可以阅读源代码,但不能真正修改和重新打包它。请注意,如果源代码已经用proGuard进行了混淆,生成的源代码将很难理清。

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

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

简而言之,你的选择要么是反编译成Java,这更具可读性,但可能是不可逆的,要么是反汇编成smali,这更难阅读,但更灵活地进行更改和重新打包修改后的应用程序。

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

更完整的版本freds答案:

手动方式

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

然后,您可以使用jd-gui反编译将JAR上的类转换为源代码。
生成的源代码应该非常可读,因为dex2jar应用了一些优化。

自动方式

您可以使用APKTool。它将自动提取所有类(.dex)、资源(.asrc),然后它将二进制xml转换为人类可读的XML,它还将分解为您提取类。
反汇编总是比反编译更健壮,特别是 with
JAR与Pro Guard混淆!

只需告诉APKTool将APK解码放入目录,然后修改你想要的,
最后编码返回到APK。仅此而已。

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

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

Step1.使用dex2jar

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

Step2.使用JD-GUI反编译. jar

  • 它反编译. class文件,即,我们将从apk中获取混淆. java。

下载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>dex2jarsomefilename.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-sjavayourfilename.class],它会将您的类文件解析为可编辑的java文档。

使用dex2jar/apktool时,有时会出现代码损坏,尤其是在循环中。为了避免这种情况,请使用jadx,它将dalvik字节码反编译为java源代码,而无需像dex2jar那样首先创建.jar/.class文件(我认为apkool使用dex2jar)。它也是开源的,正在积极开发中。它甚至有一个GUI,供GUI爱好者使用。试试吧!

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

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

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

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

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

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

最近的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

自从大多数这些答案发布以来,已经发生了很多变化。现在有许多带有GUI的简单工具,例如:

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

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

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

CFR 0.110、JaDX 0.6.1或FernFlow(分析反编译程序)。

我使用

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

但没有人能打败谷歌自己的工具

1)Android Studio 2. x: 构建>分析apk 输入图片描述

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

因为Dheeraj Bhaskar的答案和多年前一样相对古老。

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

主逻辑

dexjava sourcecode,目前有两种方案:

  • One Step:直接将dex转换为java sourcecode
  • Two Step:第一次将dex转换为jar,第二次将jar转换为java sourcecode

一步解决方案:dex直接到java 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


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