将 DEX 反编译为 Java 源代码
-
12-09-2019 - |
题
如何将Android DEX(VM字节码)文件反编译成相应的Java源代码?
解决方案
可以很容易
获取这些工具:
1) dex2jar 翻译DEX文件以JAR文件
2) JD-GUI 以查看在罐中的java文件
的源代码是相当可读作为dex2jar使得一些优化。
步骤:
这是如何反编译的程序:
步骤1:
转换classes.dex在test_apk-debug.apk到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
脚本代替
步骤2:
打开在JD-GUI罐
其他提示
为了澄清一点,根据您想要实现的目标,您可能会采取两条主要路径:
将 Dalvik 字节码 (dex) 反编译为可读的 Java 源代码。您可以轻松地做到这一点 dex2jar 和 京东GUI, ,正如弗雷德提到的。生成的源代码对于阅读和理解应用程序的功能很有用,但可能不会生成 100% 可用的代码。换句话说,你可以阅读源代码,但你不能真正修改和重新打包它。请注意,如果源代码已被混淆器混淆,则生成的源代码将更难以解开。
另一个主要替代方案是将字节码反汇编为 斯马利, ,一种专门为此目的而设计的汇编语言。我发现最简单的方法是使用 apk工具. 。一旦你安装了 apktool,你只需将它指向一个 apk 文件,你就会得到应用程序中包含的每个类的 smali 文件。您可以读取和修改 smali,甚至可以通过从新的 Java 源生成 smali 来完全替换类(为此,您可以使用 javac 将 .java 源编译为 .class 文件,然后使用 Android 的 .class 文件将 .class 文件转换为 .dex 文件dx编译器,然后使用baksmali(smali反汇编器)将.dex转换为.smali文件,如下所述 这个问题. 。这里可能有捷径)。完成后,您可以轻松地再次使用 apktool 将 apk 打包回来。请注意,apktool 不会对生成的 apk 进行签名,因此您需要注意这一点 就像任何其他 Android 应用程序一样.
如果你走 smali 路线,你可能想尝试一下 APK工作室, ,一个 IDE,可以自动执行上述一些步骤,以帮助您反编译和重新编译 apk 并将其安装到设备上。
简而言之,您的选择几乎是要么反编译为 Java(可读性更强,但可能不可逆),要么反汇编为 smali(更难阅读,但可以更灵活地进行更改并重新打包修改后的应用程序)。您选择哪种方法取决于您想要实现的目标。
最后,建议 敢 也是值得注意的。它是一个重定向工具,可将 .dex 和 .apk 文件转换为 java .class 文件,以便可以使用典型的 java 静态分析工具对其进行分析。
其实我推荐去这里: https://github.com/JesusFreke/smali
它提供BAKSMALI,其是用于DEX文件最优秀的逆向工程工具。 它是由JesusFreke,谁创造了fameous ROM的针对Android的家伙做。
手动方式
首先你需要一个工具 提炼 将 DEX 上的所有(编译的)类复制到 JAR 中。
有一个叫 dex2jar, ,这是一个中国学生制作的。
然后,您可以使用 京东GUI 到 反编译 JAR 上的类到源代码。
生成的源代码应该具有很好的可读性,因为 dex2jar 应用了一些优化。
自动方式
您可以使用 APK工具. 。它会 自动地 提取所有类(.dex
), 资源 (.asrc
),然后它将转换 二进制XML 到 人类可读的 XML, ,并且它还将 拆解 为你准备的课程。
反汇编总是比反编译更强大, 尤其 和
JAR 被 Pro Guard 混淆了!
只需告诉 APKTool 解码 将 APK 放入目录中,然后 调整 你想要什么,
最后 编码 它返回到 APK。就这样。
重要的: APK工具 拆解. 。事实并非如此 反编译.
生成的代码将不是 Java 源代码。
但你应该能够阅读它,如果你熟悉的话甚至可以编辑它 茉莉花.
如果您想要 Java 源代码,请查看 手动方式.
有时你会断码,使用dex2jar
/ apktool
时,特别是在循环。为了避免这种情况,使用 jadx ,该反编译字节码的Dalvik成Java源代码,而不创建.jar
/ .class
文件首先作为dex2jar
确实( apktool使用dex2jar我认为)。这也是开源的,并在积极发展。它甚至有一个图形用户界面,对于GUI的狂热分子。试试吧!
下载 APK 文件后,您需要执行以下步骤来获取可编辑的 java 代码/文档。
- 将您的 apk 文件转换为 zip(在开始下载时,不要使用“保存”选项,只需使用“另存为”并将您的扩展名为 .zip)通过这样做,您可以避免 APKTOOL...
- 解压 zip 文件,您可以在其中找到 somefilename.dex。所以现在我们需要转换 dex -> .class
- 为此,您需要“dex2jar”(您可以从 http://code.google.com/p/dex2jar/ ,提取后,在命令提示符下你必须提到, [D:\dex2jar-0.09>dex2jar somefilename.dex] (请记住,您的 somefilename.dex 必须位于保存 dex2jar 的同一文件夹内。)
- 从 下载 jad http://www.viralpatel.net/blogs/download/jad/jad.zip 并提取它。解压后,您可以看到两个文件,例如“jad.exe”和“Readme.txt”(有时可能是“jad.txt”而不是“jad.exe”,因此只需将其扩展名重命名为.exe即可运行)
- 最后,在命令提示符下你必须提到 [D:\jad>jad -sjava yourfilename.class] 它将把你的类文件解析成可编辑的java文档。
Android 逆向工程是可能的 。按照以下步骤从 apk 文件获取 .java 文件。
步骤1 。使用 dex2jar
- 从 .apk 文件生成 .jar 文件
- 命令 :
dex2jar sampleApp.apk
第2步 。使用JD-GUI反编译.jar
- 它反编译 .class 文件,即我们会得到 混淆的 .java 从 apk 返回。
最近的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开发者论坛。
自从 Dheeraj Bhaskar
的答案是相对较旧的许多年前。
这是我最新的(2019年)答案:
主要逻辑
从 dex
到 java sourcecode
, ,目前有两种解决方案:
One Step
: :直接转换dex
到java sourcecode
Two Step
: :首先转换dex
到jar
, 第二次转换jar
到java sourcecode
一步解决: dex
直接到 java sourcecode
工具
过程
- 下载 jadx-0.9.0.zip, ,解压,在
bin
文件夹可以看到命令行jadx
或图形用户界面版本jadx-gui
, ,双击运行GUI版本:jadx-gui
- 打开
dex
文件
然后可以显示java源代码:
File
->save as gradle project
然后得到java源代码:
两步解决方案
步骤1: dex
到 jar
工具
过程
下载 dex2jar 压缩包,解压得到 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
第2步: jar
到 java 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
使用编辑器 VS代码 要打开导出的源代码,如下所示:
结论
转换正确性: Jadx
> Procyon
> CRF
> JD-GUI
推荐使用:(一步解决方案) Jadx
更详细的解释请参考我的网上 中国人 电子书: Android应用程序的安全性和破解
您可以尝试JADX( https://bitbucket.org/mstrobel/procyon/wiki /爪哇%20Decompiler ),这是用于DEX反编译的完美工具。
是的,它也可以在线上(我:0))的新网站: HTTP:// WWW .javadecompilers.com / APK /
这可以通过以下五个步骤完成:
- 将 apk 文件转换为 zip
- 解压缩文件
- 从中提取classes.dex
- 使用dex to jar将classes.dex转换为jar文件
- 使用jadx gui打开jar文件作为java源代码
反编译Android应用最简单的方法是下载命名的 ShowJava 强>从Play商店中的应用程序。只需选择需要从应用程序列表反编译的应用程序。有三种不同的反编译器,你可以用它来编译,即一个应用程序 -
CFR 0.110,JaDX 0.6.1或FernFlower(分析反编译器)。
如果你不希望下载dex2jar,那么就使用 apk_grabber
python脚本以任何反编译APK成jar文件。然后你用JD-GUI阅读。