ChatGPT解决这个技术问题 Extra ChatGPT

将 DEX 反编译为 Java 源代码

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

看看here。您将从那里获得可能的线索以继续前进。
编码器中心博客上提供了更新信息:coders-hub.com/2013/04/how-to-convert-apk-file-into-source.html
有钱就买jeb,否则就用jadx,看here为什么
有一个新的跨平台 (java) 和开源工具,您可以这样做,只需检查 bytecodeviewer:stackoverflow.com/a/36557898/795245

1
13 revs, 11 users 47%

这很简单

获取这些工具:

dex2jar 将 dex 文件翻译成 jar 文件 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

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

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

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

注意 3:另外,记得给 dex2jar-XX 目录添加执行权限 eg sudo chmod -R +x dex2jar-2.0

dex2jar documentation

第2步:

在 JD-GUI 中打开 jar

https://i.stack.imgur.com/PWJIX.png


+1。我尝试了 Baksmali 和 Dex2jar。 Dex2Jar+JD-Gui 为大多数 .dex 文件提供了完全可读的源代码。
你好,可以分享一下你的路吗?我会非常感谢你。
上面的句子敲响了警钟 - 它似乎是这里的半引号:geeknizer.com/decompile-reverse-engineer-android-apk(或相反?)。链接的文章简要说明了上述工具以及 Smali 和 APKTool。
@JonathanDumaine 这取决于。如果 JAR 被混淆了并且您想进行少量修改,那么 Backsmali 是唯一的方法。 奖励! 使用 APKTool,您还可以获得所有 XML、图像和其他资源。请参阅my answer
@JonathanDumaine 我同意 jmendeth,如果你想反编译你的 apk,修改它然后重新编译它,apktool 也是要走的路。使用 dex2jar 和 jd-gui 时,源代码确实可读,但您无法重新编译而不会出现一些错误!
C
Community

稍微澄清一下,根据您想要完成的任务,您可能会在此处采用两条主要路径:

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

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


试试 APK Studio,是一个了不起的选择
j
jayeshsolanki93

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

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


smali 是一种基于 dalvik IL 的类汇编语言,不能直接翻译成 Java。
@endryha 没有工具能够做到这一点。有关详细信息,请参阅 this question
代码,代码,代码,......为什么只有代码?如果您使用 APKTool,您将获得一切!它就像 ./apktool d myprogram.apk 一样简单。请参阅my answer
c
crifan

由于 Dheeraj Bhaskar 的答案在过去多年中相对较旧。

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

主逻辑

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

一步:直接将dex转成java源码

两步:先将dex转jar,再将jar转java源码

一步解决:dex直接转java源码

工具

贾克斯

过程

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

https://i.stack.imgur.com/2Rlas.png

打开.dex文件

https://i.stack.imgur.com/8A9k2.png

然后可以显示java源代码:

https://i.stack.imgur.com/Pojp8.png

文件 -> 另存为 gradle 项目

https://i.stack.imgur.com/aPZxq.png

然后得到java源代码:

https://i.stack.imgur.com/xHtcW.png

两步解决方案

Step1:dex转jar

工具

dex2jar

过程

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

apk 到 jar:sh d2j-dex2jar.sh -f ~/path/to/apk_to_decompile.apk

dex 到 jar: sh 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

Step2:jar转java源代码

工具

jd-gui:最流行,但很多代码会反编译错误

CRF:流行,次要代码会反编译错误

Procyon:流行的,基于 Procyon Luyten 的无代码反编译错误 GUI 工具:字节码查看器

基于 Procyon Luyten 的 GUI 工具:Bytecode Viewer

卢腾:

字节码查看器

其他 Krakatau Fernflower 老一号:AndroChef 等。

喀拉喀托

蕨花

老一:AndroChef

等等

过程

这里演示 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 打开导出的源代码,如下所示:

https://i.stack.imgur.com/Nk62j.png

结论

转换正确性:Jadx > Procyon > CRF > JD-GUI

推荐使用:(一步解决)Jadx

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


奇怪,但是如果我尝试通过此命令 dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex 执行 1 步(在 Windows 上进行 dex 到 jar 反编译),则会出现异常:java.io.IOException: the src file not a .dex or zip file
@Сергей 你能试试吗:d2j-dex2jar.bat "D:\android\some_dex_file.dex" 可以吗?
是的,我完全尝试了 >d2j-dex2jar.bat file.dex,但不行。也许是因为我的 .dex 文件是从 dalvik-cache 复制的?
@Сергей 是的,最可能的原因是你说的dex is copied from dalvik-cache,应该是dex is decompiled from apk
@crifan,感谢您的回答。 JADX 令人印象深刻。我会回去工作的。 Emmanuel@JD-Gui
C
Community

fredanswer 的更完整版本:

手动方式

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

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

自动方式

您可以使用 APKTool。它将自动提取所有类 (.dex)、资源 (.asrc),然后将 二进制 XML 转换为 人类可读的 XML,它还会为您反汇编类。
反汇编总是比反编译更健壮,尤其是带有
混淆的 JAR专业守卫!

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

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


p
polym

有时您会在使用 dex2jar/apktool 时遇到错误代码,尤其是在循环中。为避免这种情况,请使用 jadx,它将 dalvik 字节码反编译为 java 源代码,而无需像 dex2jar 那样首先创建 .jar/.class 文件(我认为 apktool 使用 dex2jar)。它也是开源的并且正在积极开发中。它甚至有一个 GUI,供 GUI 狂热者使用。试试看!


我想 jadx 没有编译选项,但代码是可读的
@Enes Battal 你的意思是像 javac "$(find . -name '*.java')" 吗?
形成一个apk怎么样?在 apk、zipalign、签名等中放置类。
@EnesBatta 好吧,您可以帮助实现这一点-否则您可以为此使用 apktool .. 或使用 android 工具进行 zipalign/sign
这个答案听起来好像它从未使用过 dex2jar 工具,而是直接从 dex 反编译为 java 源代码。真的是这样吗?如果是这样,那么它如何也能够打开普通的桌面 jar 文件? (刚刚尝试过并且有效)它是否有单独的 dex 和 jar 反编译器?
i
ishandutta2007

我用过

dex2jar + jd-gui javadecompilers.com enjarify Apktool

但没有一个能比得上谷歌自己的工具

https://i.stack.imgur.com/yaH7q.png

https://i.stack.imgur.com/01z9A.png


加一个用于 Enjarify。以我个人的经验,与 d2j 相比,它已被证明可以提供更好的结果
p
phaethon

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

安装方法和一些说明:Installation

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


看起来很有希望。它是否直接从 APK 中反编译 Java 代码?混淆的 Java 代码呢?
J
Janus Troelsen

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

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


g
gtiwari333

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

步骤1 。使用 dex2jar

从 .apk 文件生成 .jar 文件

命令:dex2jar sampleApp.apk

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

它会反编译.class 文件,即,我们将从apk 中得到混淆的.java。


但是如果我再次编译所有反编译的源代码,它将无法运行,编译器会显示很多错误。
是否有任何可用于反编译的解决方案 android java 源代码将在 eclipse 中运行
逆向工程并不一定意味着反编译。事实上,ProGuard 混淆的 JAR 不会正确反编译。
如果您正在处理混淆代码,最好只反汇编它。您不会获得 Java 源代码,但您始终将能够查看/修改代码。请参阅my answer
我建议同时进行反编译和反汇编。生成的反编译代码更容易理解,但所有修改都需要使用反汇编版本完成。如果使用了 proguard,尤其如此。我发现 dex2jar 结合 jd-gui 最适合反编译。
i
izb

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

据我所知,反编译为 Java 是不可能的。
您可以阅读 dalvik 字节码 here


接受,因为您是那个说(当前)不可能的人,这似乎是正确的。
@Will 一切皆有可能。只是取决于你如何看待它。反编译是可能的,但可能不是你想的那样。
g
gavenkoa

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

M
MPaulo

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

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

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


A
Andrew Rukin

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

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


说,它可以在代码中使用吗?甚至在Android本身中也意味着什么?这里的网站不是:github.com/skylot/jadx 吗?
A
Ajit Singh

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

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

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


R
Rishabh Maurya

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

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


J
Jeff Brateman

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