如何将Android DEX(VM字节码)文件反编译成相应的Java源代码?
获取这些工具:
1)dex2jar将dex文件转换为jar文件
2)jd-gui查看jar中的java文件
源代码非常易读,因为dex2jar进行了一些优化。
这是关于如何反编译的过程:
将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
脚本替换
在JD-GUI中打开jar
Android Reverse Engineering is possible。按照以下步骤从apk文件中获取.java文件。
步骤1 。使用dex2jar
dex2jar sampleApp.apk
第2步 。使用JD-GUI反编译.jar
最近的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 + Decompile中提取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开发者论坛上。
您可以尝试JADX(https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler),这是DEX反编译的完美工具。
是的,它也可以在线上获取(我的:0))新网站:http://www.javadecompilers.com/apk/
由于Dheeraj Bhaskar
的答案与过去多年相比已经相当陈旧。
这是我最近的(2019年)答案:
从dex
到java sourcecode
,目前有两种解决方案:
One Step
:直接将dex
转换为java sourcecode
Two Step
:首先将dex
转换为jar
,然后将jar
转换为java sourcecode
dex
directly to java sourcecode
bin
文件夹中可以看到命令行jadx
或GUI版jadx-gui
,双击运行GUI版:jadx-gui
dex
文件然后可以显示java源代码:
File
- > save as gradle project
然后获取java源代码:
dex
到jar
下载dex2jar zip,unzip得到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
jar
到java sourcecode
many
代码将反编译错误minor
代码会反编译错误no
代码反编译错误
基于Procyon
的GUI工具
Luyten:
Bytecode Viewer这里演示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
有关更详细的说明,请参阅我的在线中文电子书:安卓应用的安全和破解
这可以通过以下五个步骤完成:
This gem does these things for you automatically even the installation of required tools
最简单的反编译Android应用程序的方法是从playstore下载名为ShowJava的应用程序。只需从应用程序列表中选择需要反编译的应用程序即可。你可以使用三种不同的反编译器来反编译应用程序 -
CFR 0.110,JaDX 0.6.1或FernFlower(分析反编译器)。
如果你不想下载dex2jar,那么只需使用apk_grabber
python script将任何apk反编译成jar文件。然后你用jd-gui读它们。
为了澄清一下,根据您想要完成的任务,您可以在此处使用两条主要路径:
将Dalvik字节码(dex)反编译为可读的Java源代码。您可以使用dex2jar和jd-gui轻松完成此操作,正如fred提到的那样。生成的源可用于阅读和理解应用程序的功能,但可能无法生成100%可用的代码。换句话说,您可以阅读源代码,但无法真正修改和重新打包它。请注意,如果使用proguard对源进行了混淆,则生成的源代码将难以解开。
另一个主要的替代方案是将字节码反汇编为smali,这是一种专为此目的而设计的汇编语言。我发现最简单的方法是使用apktool。一旦你安装了apktool,你就可以将它指向一个apk文件,然后你将获得应用程序中包含的每个类的smali文件。您可以通过从新Java源生成smali来完全读取和修改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静态分析工具对其进行分析。
我实际上建议去这里:https://github.com/JesusFreke/smali
它提供了BAKSMALI,这是DEX文件最优秀的逆向工程工具。它是由JesusFreke制作的,他为Android创造了成名的ROM。
首先,您需要一个工具将DEX上的所有(已编译)类提取到JAR。 有一个名为dex2jar,由一名中国学生制作。
然后,您可以使用jd-gui将JAR上的类反编译为源代码。 结果源应该是可读的,因为dex2jar应用了一些优化。
你可以使用APKTool。它将自动提取所有类(.dex
),资源(.asrc
),然后它将二进制XML转换为人类可读的XML,它也将为您解组类。
反编译总是比反编译更强大,尤其是反编译
JAR与Pro Guard混淆了!
只需告诉APKTool将APK解码到一个目录中,然后修改你想要的内容, 最后将其编码回APK。就这样。
重要提示:APKTool无法解决。它不反编译。 生成的代码不是Java源代码。 但是你应该能够阅读它,如果你熟悉jasmin,甚至可以编辑它。 如果您需要Java源代码,请查看手动方式。
当使用dex2jar
/ apktool
时,有时你会破坏代码,最明显的是循环。为了避免这种情况,使用jadx,它将dalvik字节码反编译成java源代码,而不是像.jar
那样创建.class
/ dex2jar
文件(我认为apktool使用dex2jar)。它也是开源和积极的开发。它甚至还有一个GUI,用于GUI狂热分子。试试吧!
由于没有人提到这一点,还有一个工具:DED homepage
安装方法和一些解释:Installation。
它用于一个非常有趣的顶级市场应用程序的安全性研究(不是真的相关,只是如果你很好奇):A Survey of Android Application Security
下载APK文件后,您需要执行以下步骤以获取可编辑的Java代码/文档。