hacktricks/mobile-pentesting/android-app-pentesting/apk-decompilers.md
2023-08-03 19:12:22 +00:00

9.4 KiB
Raw Blame History

APK反编译器

☁️ HackTricks云平台 ☁️ -🐦 推特 🐦 - 🎙️ Twitch直播 🎙️ - 🎥 YouTube频道 🎥

JD-Gui

第一个著名的GUI Java反编译器你可以使用它来研究从APK中获取的Java代码。

Jadx

内置的Java多平台反编译器目前我认为这是推荐使用的。
只需下载最新版本并从_bin_文件夹中执行

jadx-gui

使用GUI可以进行文本搜索转到函数定义在函数上按CTRL +左键单击)和交叉引用(右键单击 --> 查找用法)

如果你只想要Java代码但不想使用GUI一个非常简单的方法是使用jadx命令行工具

jadx app.apk

一些jadxGUI和CLI版本的有趣选项包括

-d <path to output dir>
--no-res #No resources
--no-src #No source code
--no-imports #Always write entire package name (very useful to know where is the function that you might want to hook)

GDA-android-reversing-Tool

GDA也是一个强大而快速的反向分析平台。它不仅支持基本的反编译操作还具有许多出色的功能如恶意行为检测、隐私泄露检测、漏洞检测、路径解决、打包程序识别、变量跟踪分析、反混淆、Python和Java脚本、设备内存提取、数据解密和加密等等。

仅适用于Windows。

Bytecode-Viewer

另一个进行静态分析的有趣工具是:bytecode-viewer。它允许您同时使用多个反编译器对APK进行反编译。然后您可以看到例如两个不同的Java反编译器和一个Smali反编译器。它还允许您修改代码

如果您修改了代码,那么您可以将其导出。
bytecode-viewer的一个不好的地方是它没有引用或交叉引用。

Enjarify

Enjarify是一种将Dalvik字节码转换为等效Java字节码的工具。这使得Java分析工具能够分析Android应用程序。
Dex2jar是一个较旧的工具也尝试将Dalvik转换为Java字节码。它在大多数情况下工作得相当好但许多晦涩的特性或边缘情况会导致它失败甚至悄悄地产生错误的结果。相比之下Enjarify被设计为在尽可能多的情况下工作即使是Dex2jar无法处理的代码。Enjarify正确处理Unicode类名、多个类型使用的常量、隐式转换、异常处理程序跳转到正常控制流、引用太多常量的类、非常长的方法、catchall处理程序之后的异常处理程序以及错误类型的静态初始值等等。

CFR

CFR将反编译现代Java特性 - 包括Java 9、12和14等 - 但它完全使用Java 6编写因此可以在任何地方使用FAQ- 它甚至可以将其他JVM语言的类文件转换回Java

可以使用该JAR文件如下

java -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"

对于较大的JAR文件我发现内存不足。如果你也遇到这个问题你可以简单地调整JVM的内存分配池的大小。

java -Xmx4G -jar ./cfr.jar "$JARFILE" --outputdir "$OUTDIR"

这个示例将允许分配最多4GB的内存。

在输出目录中,您将找到反编译的.java文件,以及反编译的摘要。

Fernflower

接下来是Fernflower,它是IntelliJ IDEA的一部分。每个人都提到它是一个“分析性”反编译器(正如他们的项目描述中所述),但没有人指出这实际上意味着什么。我只找到了这个Stackoverflow问题,但很遗憾,至今没有得到答案。

无论如何,由于没有自包含的发布版本,您需要自己构建它。作为一个基于Gradle的项目您可以克隆它然后在您的机器上安装了Gradle之后运行以下命令。

cd ./plugins/java-decompiler/engine && gradle jar

在这里我们首先将工作目录切换到Fernflower的根目录。然后我们指示Gradle构建文件./build/libs/fernflower.jar

Fernflower的调用方式与CFR类似。

java -jar ./fernflower.jar "$JARFILE" "$OUTDIR"

在这里描述的反编译器中,这是唯一一个将生成的.java文件输出到JAR文件中的工具。您可以使用unzip轻松提取源文件。

Krakatau

还记得上面提到的Enjarify吗同样的作者也是Krakatau的开发者。

与其他项目不同这个项目是用Python编写的。我认为这就是它与其他项目有所不同的原因。

让我引用一下该项目的README

接下来确保您拥有包含任何外部类即库的定义的JAR文件这些类可能被您尝试反编译的JAR文件引用。这包括标准库类即JRT

根据描述,这些标准库类以rt.jar文件的形式随Java的8版本一起提供。对于更高版本作者提供了jrt-extractor,可以为我们生成这个文件。

因此,我们下载该工具并运行以下命令。

cd ./jrt-extractor
javac JRTExtractor.java
java -ea JRTExtractor

这个文件应该写在目录中的rt.jar文件里。

有了这个文件我们可以按照以下方式运行Krakatau。

./Krakatau/decompile.py -out "$OUTDIR" -skip -nauto -path ./jrt-extractor/rt.jar "$JARFILE"

让我参考项目的GitHub来了解参数的解释。只需注意对于您的JAR文件使用的任何库Krakatau将要求您将其作为JAR文件添加到-path标志中。

procyon

安装完成后,使用方法很简单。

procyon -jar "$JARFILE" -o "$OUTDIR"

参考资料

{% embed url="https://eiken.dev/blog/2021/02/how-to-break-your-jar-in-2021-decompilation-guide-for-jars-and-apks/#cfr" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥