将DEX反编译为Java源代码


706

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


在这里看看。您将从那里获得潜在的线索继续前进。
凯文·博伊德

更新的信息可在Coders
Md Mohsin

如果您有钱,请购买jeb,否则使用jadx在这里查看原因
polym

有一个新的跨平台(java)和开放源代码工具,使您能够做到这一点,只需签出bytecodeviewer:stackoverflow.com/a/36557898/795245
Gomino

Answers:


881

这简单

获取以下工具:

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

注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中打开jar

反编译源


57
+1。我尝试了Baksmali和Dex2jar。Dex2Jar + JD-Gui可以为大多数.dex文件提供完美可读的源代码,因此而获奖。
乔纳森·杜马因

嗨,请您分享您的前进方向吗?我会非常感谢你。
Arslan Anwar'3

2
上面的句子响了一下-似乎是这里的半引号:geeknizer.com/decompile-reverse-engineer-android-apk(或者反过来?)。链接的文章简要说明了上述工具以及Smali和APKTool。
AgentKnopf 2012年

2
@JonathanDumaine取决于。如果对JAR感到困惑,并且您希望进行一些修改,则Backsmali是唯一的选择。奖金!使用APKTool,您还可以获取所有XML,图像和其他资源。看我的回答
阿尔巴·门德斯

3
@JonathanDumaine我同意jmendeth的观点,如果您想反编译apk,对其进行修改然后重新编译,那么apktool也是可行的方法。使用dex2jar和jd-gui时,源代码确实可读,但是您无法重新编译一些错误!
darkheir 2012年

138

为了澄清一点,根据您要完成的目标,您可以采用两种主要方法:

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

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

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

简而言之,您的选择要么是反编译为更易读但很可能不可逆的Java,要么是反汇编为smali(难于阅读,但更灵活地进行更改和重新打包已修改的应用)。您选择哪种方法取决于您要实现的目标。

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


61

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

它提供了BAKSMALI,这是用于DEX文件的最出色的逆向工程工具。它是由创建著名的Android ROM的JesusFreke制作的。


3
smali是一种基于dalvik IL的汇编语言,无法直接翻译成Java。
reflog 2010年

@endryha没有工具可以做到这一点。有关更多信息,请参见此问题
阿尔巴·门德斯

1
代码,代码,代码……为什么只有代码?如果您使用APKTool,您将获得一切!和一样简单./apktool d myprogram.apk。看我的回答
阿尔巴·门德斯

30

fred答案的更完整版本:

手动方式

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

然后,您可以使用JD-GUI反编译的JAR源代码的类。
由于dex2jar进行了一些优化,因此生成的源应该非常易读。

自动方式

您可以使用APKTool。它将自动提取所有类(.dex),资源(.asrc),然后将二进制XML转换为人类可读的XML,还将 为您分解这些类。
拆卸总是比反编译更稳健,特别是
同亲卫队混淆的JAR!

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

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


25

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


我想jadx没有编译选项,但是代码是可读的
Buddy

@EnesBattal您的意思是javac "$(find . -name '*.java')"
polym

形成apk怎么样?将类放在apk,zipalign,签名等中
好友

@EnesBattal好吧,您可以帮助实现它-否则,您可以使用apktool来实现..或使用android工具进行zipalign / sign
polym 2015年

1
@lejonl你的死刑,你这个怪物!
polym

17

我用过了

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

但是没有人能胜过谷歌自己的工具

1)Android Studio 2.x: 构建>分析APK 在此处输入图片说明

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


1
再加上一个Enjarify。以我的个人经验,与d2j
qre0ct '18

15

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

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

它被用于对顶级市场应用程序的安全性进行的非常有趣的研究中(即使您好奇,也没有真正的关联):Android应用程序安全性调查


看起来很有希望。它会反编译Java代码直接形成APK吗?混淆的Java代码呢?
sandalone 2011年

14

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

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

主逻辑

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

  • One Step:直接转换dexjava sourcecode
  • Two Step:首先转换dexjar,第二次转换jarjava 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源代码:


两步法

第一步: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

第二步: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


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


奇怪,但如果我尝试通过这个命令执行1步(DEX在Windows罐子编译)dex2jar-2.0>d2j-dex2jar.bat -f D:\android\some_dex_file.dex刚刚例外:java.io.IOException: the src file not a .dex or zip file
Сергей

@Сергей您可以尝试:d2j-dex2jar.bat "D:\android\some_dex_file.dex"可以吗?
crifan

是的,我尝试过,>d2j-dex2jar.bat file.dex但是不行。也许是因为我的.dex文件是从中复制的dalvik-cache
Сергей

1
@Сергей是的,最可能的原因是您说的dex is copied from dalvik-cache应该是dex is decompiled from apk
crifan

@crifan,感谢您的回答。JADX令人印象深刻。我会回去工作。Emmanuel @ JD-Gui
Emmanuel Dupuy

13

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

  1. 通过这样做可以避免将APKTOOL转换为zip文件(开始下载时不要使用“保存”选项,而应使用“另存为”并以.zip提及扩展名)。
  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

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

据我所知,无法对Java进行反编译。
您可以在此处阅读有关dalvik字节码的信息


1
接受,因为您是一个说(目前)不可能的人,这似乎是事实。
威尔

@将一切皆有可能。只取决于您如何看待它。反编译可能的,但可能并非您所想的那样。
阿尔巴·门德斯

8

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

步骤1 。使用dex2jar

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

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

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

但是,如果我再次编译所有反编译的源代码,它将无法运行,编译器会显示很多错误。

是否有任何可用于反编译android java源代码的解决方案在eclipse中运行

2
逆向工程没有一定意味着反编译。实际上,混淆了ProGuard的JAR无法正确反编译。
阿尔巴·门德斯

如果要处理混淆代码,最好将其反汇编。您不会获得Java源代码,但是始终可以查看/修改代码。看我的回答
阿尔巴·门德斯

我建议同时进行反编译和反汇编。生成的反编译代码更容易理解,但是所有修改都需要使用反汇编版本进行。如果使用了proguard,则尤其如此。我发现与jd-gui结合使用的dex2jar是最适合反编译的方法。
Mikko Rantalainen

6

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

classes.dex从Apk 提取+反编译:

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

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

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

5

自大多数答案发布以来,情况发生了很大变化。如今,有很多简单的GUI工具,例如:

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

找到它们的最佳场所是XDA Developers论坛。




2

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.