如何将Android DEX(VM字节码)文件反编译为相应的Java源代码?
∮ It's easy
获取这些工具。
由于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
在某种程度上澄清一下,根据你想完成的任务,你可以采取两种主要的路径。
将Dalvik字节码(dex)反编译成可读的Java源代码。 正如fred所提到的,你可以通过[dex2jar][1]和[jd-gui][2]轻松完成。 所得到的源码对于阅读和理解应用程序的功能是有用的,但很可能不会产生100%可用的代码。 换句话说,你可以阅读源码,但你不能真正修改和重新打包它。 需要注意的是,如果源码已经被proguard混淆了,那么产生的源码将更加难以解开。
另一个主要的选择是将字节码反汇编成[smali][3],这是一种专门为此目的而设计的汇编语言。 我发现最简单的方法是使用[apktool][4]。 一旦你'安装了apktool,你只需将它指向一个apk文件,你'就会为应用程序中包含的每个类返回一个smali文件。 你可以通过从新的Java源码中生成smali来读取和修改smali,甚至完全替换类(要做到这一点,你可以用javac将你的.java源码编译成.class文件,然后用Android'的dx编译器将你的.class文件转换为.dex文件,然后用baksmali(smali反汇编器)将.dex转换为.smali文件,如[本题][5]所述。 这里可能有一个捷径)。) 一旦你'完成了,你可以很容易地用apktool再次将apk打包回来。 请注意,apktool不会对生成的apk进行签名,所以你'需要处理好这个问题[就像其他Android应用程序一样][6]。
如果你走smali路线,你可能想尝试[APK Studio][7],这是一个IDE,可以自动完成上述一些步骤,协助你反编译和重新编译apk,并将其安装到设备上。
简而言之,你的选择几乎是要么反编译成Java,它更易读,但很可能是不可逆的,要么反汇编成smali,它更难读,但更灵活,可以进行修改和重新打包修改后的应用。 选择哪种方式要看你要达到什么目的。
最后,[敢][8]的建议也值得注意。 它'是一个重定向工具,可以将.dex和.apk文件转换为java.class文件,这样就可以使用典型的java静态分析工具对它们进行分析。
[1]: http://code.google.com/p/dex2jar/ [2]: http://java.decompiler.free.fr/?q=jdgui [3]: [3]:http://code.google.com/p/smali/ [4]: http://code.google.com/p/android-apktool/ [5]: https://stackoverflow.com/questions/5448267/direct-java-to-smali-conversion-possible [6]: http://developer.android.com/guide/publishing/app-signing.html [7]: http://www.vaibhavpandey.com/apkstudio/ [8]: http://siis.cse.psu.edu/dare/index.html
实际上,我建议去这里。 https://github.com/JesusFreke/smali
它提供了BAKSMALI,这是一个最优秀的DEX文件的反向工程工具。 它是由JesusFreke制作的,这个人为Android制作了著名的ROM。
首先你需要一个工具来提取所有DEX上的(编译的)类到一个JAR中。 有一个叫dex2jar的,是一个中国学生做的。
然后,你可以用[jd-gui][2]把JAR上的类**反编译成源代码。 由于dex2jar应用了一些优化,所以生成的源代码应该是相当可读的。
1:
[2]: http://jd.benow.ca/
你可以使用APKTool。
它将自动提取所有的类(.dex
)和资源(.asrc
),然后它将把二进制的XML转换成人类可读的XML,并且它还将为你反汇编这些类。
反汇编总是比反编译更稳健,尤其是在使用
JARs用Pro Guard混淆了!。
只要告诉APKTool将APK_解码到一个目录,然后_修改你想要的东西。 并最终_将其编码回APK。 这就是全部。
重要的是: APKTool dissassembles。 它不会反编译。 生成的代码不会是Java源代码。 但你应该能够阅读它,甚至编辑它,如果你熟悉jasmin。 如果你想要Java源码,请通过手动方式。
既然没人提,那就多一个工具吧'。 [DED主页][1]
安装方法和一些解释。 安装][2]。
它被用在了一个相当有趣的关于顶级市场应用安全的研究中(其实并不相关,只是如果你';好奇的话)。 A Survey of Android Application Security][3] 。
[1]: http://siis.cse.psu.edu/ded/ [2]: http://siis.cse.psu.edu/ded/installation.html [3]: http://www.enck.org/pubs/enck-sec11.pdf
我已经使用了
javadecompilers.com
但没有人比google'自己的工具更胜一筹。
1)Android Studio 2.x:。 build> 分析apk [![在此输入图像描述][1]][1]
2)Android Studio 3.0:。 配置文件或调试APK [![在此输入图像描述][2]][2] [![在此输入图像描述][3]][3]
[1]: https://i.stack.imgur.com/yaH7q.png [2]: https://i.stack.imgur.com/01z9A.png [3]: https://i.stack.imgur.com/FB8KM.png
一旦你下载了你的APK文件,你需要做以下步骤来获得一个可编辑的java代码/文档。
解压zip文件,在那里你可以找到somefilename.dex。 所以现在我们需要将dex -> .class
要做到这一点,你需要"dex2jar"(你可以从http://code.google.com/p/dex2jar/ 下载,解压后,在命令提示符中你必须提到,[D:\dex2jar-0.09>dex2jar somefilename.dex] (请记住,你的somefilename.dex必须在你保存dex2jar的同一个文件夹内。)
从 http://www.viralpatel.net/blogs/download/jad/jad.zip 下载 jad 并解压。 解压后,你可以看到两个文件,如"jad.exe"。 和"Readme.txt"。 (有时"jad.txt" 可能会代替"jad.exe",所以只要将其扩展名重命名为.exe即可运行。) 最后,在命令提示符中你要提[D:\jad>jad -sjava yourfilename.class],它将把你的类文件解析成可编辑的java文档。
由于Dheeraj Bhaskar
'的答案比较老,因为过去很多年了。
下面是我最新(2019年)的答案。
从 "dex "到 "java sourcecode",目前有两种解决方案。
dex
转为java源代码
。dex
直接转为java源码
。
下载jadx-0.9.0.zip,解压后,在 "bin "文件夹中可以看到命令行 "jadx "或GUI版 "jadx-gui",双击运行GUI版。
jadx-gui
,双击运行GUI版本:jadx-gui
。
2.打开dex
文件
然后可以显示java源码。
File
->
save as gradle project
然后得到java源码。
dex
改为jar
。
下载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
。例如:{{{5946887}}。
➜ 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源码"。
许多
代码会反编译出错。no
代码反编译错误。这里演示了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
推荐使用。
(一步解决's)Jadx
。
更详细的解释,请参考我的在线中文电子书。 安卓应用的安全和破解
安卓逆向工程是可能的 . 按照这些步骤从apk文件中获取.java文件。
Step1 . 使用dex2jar
dex2jar sampleApp.apk
。第2步:使用JD-GUI反编译.jar 使用JD-GUI反编译.jar。
1:
最近的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
你可以试试JADX (https://bitbucket.org/mstrobel/procyon/wiki/Java%20Decompiler),这是一个完美的DEX反编译工具。
是的,它也可以在(我的:0))新的网站上获得。 http://www.javadecompilers.com/apk/
这可以通过以下五个步骤来完成。
从中提取classes.dex
使用dex to jar将classes.dex转换为jar文件。
使用jadx gui将jar文件作为java源代码打开。