jadx的使用
我们知道,每个 Android App 都有对应的安装包,是以 apk 为名字后缀的文件,App 的实现逻辑都包含在这个文件中。apk 文件往往包含资源文件(如图标、字体等),由 Java 代码编译而成的 dex 文件(可通过反编译 dex 文件得到 Java 代码),和一些相关的配置文件(如 AndroidManifest.xml 文件)。关于其中的细节,这里就不再一一展开介绍了,如果想了解更多内容可以学习 Android 开发相关的基本知识。
逆向中关键的一步就是反编译 apk 文件,将其还原成可读性高的 Java 代码,在多数情况下,我们通过观察并分析这个 Java 代码就能找到想要的核心逻辑。工欲善其事,必先利其器。用来反编译 apk 文件的工具有很多,例如 jadx、JEB、Apktool 等,不同工具的用法和定位也有所不同。
本节我们先来了解一下 jadx 的使用方法。
jadx 的简介
jadx 是一款使用广泛的反编译工具,可以一键把 apk 文件还原成 Java 代码,使用起来简单,功能强大,还具有—些附加功能可以辅助代码追查。其 GitHub 地址为 https://github.com/skylot/jadx 。主要具有如下几个功能:
-
除了反编译 apk 文件,还可以反编译 jar、class、dex、aar 等文件和 zip 文件中的 Dalvik 字节码。
-
解码 AndroidManifest.xml 文件和一些来自 resources.arsc 中的资源文件。
-
一些 apk 文件在打包过程中增加了 Java 代码的混淆机制,对比 jadx 提供反混淆的支持。
jadx 本身是一个命令行工具,仅仅通过 jadx 这个命令就可以反编译一个 apk 文件。除此之外,它也有配套的图形界面工具——jadx-gui,这个使用起来更加方便,能直接以图形界面的方式打开一个 apk 文件。同时,jadx-gui 对反编译后得到的 Java 代码和其他资源文件增加了高亮支持(就像在 IDE 中打开这些内容一样),还具有快速定位、引用搜索、全文搜索等功能。所以,我们往往直接使用 jadx-gui 完成一些反编译操作。
准备工作
本节会以一个 App 为示例,介绍 jadx 的命令和 jadx-gui 的使用方法。在开始之前,请先安装好这两个工具,jadx 的安装方法可以参考 https://setup.scrape.center/jadx。
然后提前下载好示例 App 对应的 apk 文件(https://app5.scrape.center/),下载下来的文件保存为 scrape-app5.apk 。
常见问题
如果有些 apk 文件比较大,jadx-gui 反编译所需的时间和消耗的资源就会更多,所以有时候在反编译过程中会提示如下错误:
这里报了一个 OutOfMemoryError 错误,代表内存溢出,对于一些比较大的 apk 文件,是会出现这种问题的,我们可以尝试用如下两个方案解决。
-
增加 JVM 的最大内存:设置 JVM_OPTS,把 JVM 的最大内存调大,之后内存溢出的问题自然可以得到有效解决。
-
减小线程数:线程多了,反编译过程消耗的内存自然也会增多,可以在运行 jadx的命令时通过 -j 命令适当将线程数量设置为更小的值。
详细的设置方法可以参考 https://setup.scrape.center/jadx,本节不深入讲解。