因为你已经理解了逆向工程的基础知识,让我们开始探索一些现代的逆向工程工具,它们可以用于移动应用程序。
为了逆向工程移动应用程序,我们需要专门的工具和实用程序。其中一些工具是付费的,而另一些是开源的。我们将尽可能使用开源工具和实用程序,但在适用的情况下,也会为您提供商业替代方案。
在开始设置我们新创建的 Ubuntu 虚拟机中的工具之前,重要的是要理解,一些工具适用于 iOS 和 Android 应用程序,而另一些只适用于其中一种。对于每个解释的工具,您将找到一个用例示例部分。该部分将提供有关此工具将在哪个平台上工作(即 iOS/Android 或两者)的信息。
在本章的最后,您还将获得有关移动应用程序渗透测试和逆向工程的定制虚拟机平台 Mobexler 的详细信息。
本章介绍了一些有趣的小工具,以及商业工具,可用于逆向工程。
在本章中,我们将涵盖以下主题:
- 用于逆向工程移动(Android 和 iOS)应用程序的工具
- 设置逆向工程环境
- 安装和设置逆向工程工具
- 设置 Mobexler(一种移动应用程序渗透测试平台)
技术要求
下载并设置一个虚拟机(在撰写本书时,Ubuntu 20.04.3 LTS 是最新版本,我们将使用该版本),使用任何虚拟化软件,如 VirtualBox 或 VMware。您可以在 Ubuntu 官网 下载 Ubuntu 20.04.3 LTS(Ubuntu 桌面版)。
对于虚拟化,您可以使用开源的 VirtualBox,或者 Windows 上可用的商业版本(以及免费版本)的 VMware Workstation Player,或者 Mac 上的 VMware Player Fusion。
下载和设置虚拟机的步骤不在本文中介绍,因为这是一项简单直接的任务。查阅任何关于如何设置 Ubuntu 虚拟机的好文章/博客帖子应该提供所有必要的信息。以下是 VirtualBox 官方网站关于创建基于 Windows 的虚拟机的文章:创建虚拟机。
移动应用逆向工程工具
在上一章中,我们了解到 Android 应用程序和 iOS 应用程序都以特定的格式(APK 或 IPA)提供,这实际上是所有应用程序文件以及最重要的编译二进制文件的压缩(.zip)版本。
当我们开始进行移动应用程序的逆向工程时,主要目标是了解应用程序的内部结构,包括其功能和实现的安全控制,并尽可能重建尽可能多的原始代码。在移动应用程序中实现这一目标的第一步是解压缩或更具体地说是反编译应用程序包本身。
当您开始时,第一步是获取应用程序包(APK 或 IPA)并对其进行解压缩。要做到这一点,您需要一个简单的实用程序,用于解压缩压缩文件(.zip)。大多数 Linux 操作系统都预装了一些这样的实用程序。
只需启动您新创建的 Ubuntu 虚拟机并启动终端。
要使用 unzip 实用程序,请在终端中键入以下内容:
shell
# unzip --help
上述命令应该会运行 unzip 实用程序,并显示所有可用的不同选项。
现在,让我们尝试解压一个 APK 文件。只需获取我们在上一章中创建的 APK 文件,并尝试使用 unzip 实用程序对其进行解压缩。确保 APK 文件保存在桌面文件夹中,或者创建一个新文件夹并将文件保存在其中。文件保存后,在该文件夹中右键单击某处并选择在终端中打开。
将 APK 文件重命名为 ZIP:
lua
# mv app-debug.apk app-debug.zip
使用 unzip 实用程序从 ZIP 文件中提取文件:
arduino
# unzip app-debug.zip
提取的文件如下:
尽管您可以解压 APK/IPA 并探索其中的文件,但对于 Android 来说,这并不是开始逆向工程的正确方式。例如,一旦提取,如果尝试查看 AndroidManifest.xml 文件,它将无法读取。这是因为在这一点上,您只是膨胀了编译的源代码,编辑或查看编译的文件并不容易。
这就是 apktool 工具的用武之地。开始对 Android 应用程序进行逆向工程的正确方法是使用 apktool,它可以正确解码 APK 资源到几乎原始形式,并在进行一些修改后重新构建它们。apktool 中的解码选项将重要文件(如配置和资源)转换为 XML 文件。
正如我们刚才看到的,iOS 和 Android 应用程序的逆向工程需要非常特定的现代工具。因此,让我们来看看其中一些工具,并在虚拟机环境中设置它们。在安装和设置所有这些工具之后,我们将拥有一个新鲜的、可以立即使用的环境,用于逆向工程移动应用程序(包括 Android 和 iOS 应用程序)。
apktool
- 工具: apktool
- 网站: ibotpeaches.github.io/Apktool/ins...
- 简介: 用于逆向工程 Android 应用程序的工具
- 用途: 适用于 Android 应用程序
以下是安装 apktool 的说明(适用于 Ubuntu):
- 从以下链接下载 Linux 包装脚本(右键单击并选择"链接另存为apktool"):raw.githubusercontent.com/iBotPeaches...:
shell
# wget https://raw.githubusercontent.com/iBotPeaches/Apktool/master/scripts/linux/apktool
- 下载 apktool-2(找到当前版本,例如 2.6.0):bitbucket.org/iBotPeaches...
- 将下载的 JAR 文件重命名为 apktool.jar。
- 将这两个文件(apktool.jar 和 apktool)移动到 /usr/local/bin(需要 root 权限)。
- 确保这两个文件都可执行(chmod +x)。
- 尝试通过命令行运行 apktool。
如果您看到与 Java 相关的错误,可能是因为未安装 Java。在这种情况下,请使用以下命令安装 Java:
arduino
#sudo apt install default-jdk
#sudo apt install default-jre
使用示例
当您开始逆向工程 Android 应用程序包时,apktool 可能是您首先使用的工具。apktool 用于首先解码原始的 Android 包,并提取其中的所有文件以及 dex 文件。
让我们看看如何使用它来解码 APK 并获取其所有组件:
- 一旦安装完成,我们只需启动终端并输入以下命令:
arduino
#apktool d <APK路径>
这里,d 代表解码。
以下是供参考的代码片段:
- 当解码完成时,APK 的所有组件将保存在一个与包名相同的文件夹内:
JADX -- Dex-to-Java Decompiler
- 工具: JADX -- Dex-to-Java Decompiler
- 网站: github.com/skylot/jadx
- 简介: 用于从 Android dex 和 APK 文件生成 Java 源代码的命令行和 GUI 工具
- 用途: 适用于 Android 应用程序
按照以下说明进行安装(适用于 Ubuntu):
- 从 github.com/skylot/jadx... 下载工具的最新版本。
- 下载的文件将是一个 ZIP 文件;将其解压缩到一个文件夹中。
- 导航至您解压缩文件的文件夹并进入 bin 文件夹。
- 要使用应用程序的 GUI 版本,请运行以下命令:
shell
#./jadx-gui
结果如下所示:
使用示例
JADX 是一个很棒的工具,它将 Android 应用程序包(APK)作为输入,然后将 Java 源代码作为输出。它负责解码 APK,然后将 dex 文件转换为 JAR 文件,然后在阅读器中进行解释。
让我们直接将我们创建的 APK 加载到 jadx-gui 应用程序中,并查看输出结果:
smali/baksmali
- 工具: smali/baksmali
- 网站: github.com/JesusFreke/...
- 简介: 用于 Dalvik 使用的 dex 格式的汇编器/反汇编器
- 用途: 适用于 Android 应用程序
按照以下说明进行安装(适用于 Ubuntu):
- 从 bitbucket.org/JesusFreke/... 下载并保存工具的最新稳定版本。
- 使用 Java 运行这两个应用程序中的任何一个。例如,按照以下图示运行 baksmali:
strings
- 工具: strings
- 网站: www.gnu.org/software/bi...
- 简介: Linux 中的 strings 命令主要用于在文件中查找字符串字符。它专注于确定二进制文件(非文本文件)的内容,并提取文本。不同的操作系统可能具有不同的参数。
- 用途: 适用于 Android 和 iOS 应用程序
- 安装方法(在 Ubuntu 中): 在终端中运行以下命令:
arduino
#sudo apt-get install binutils
以下是供参考的截图:
使用示例
当您试图在应用程序二进制文件中查找静态字符串时,strings 实用程序非常有帮助。只需将二进制文件作为输入传递给 strings 实用程序,它就会从中提取所有字符串。查看提取的字符串非常有帮助,因为它可以提供类名、方法名、静态文本和硬编码信息等。
让我们解压缩(将扩展名更改为 .zip 并使用任何 zip 解压工具进行解压缩)我们拥有的 APK 文件,然后在 classes.dex 文件上运行 strings。这应该会提取 dex 文件中的所有字符串。
运行 $strings classes.dex
命令,它将提取所有字符串。您还可以使用输出重定向将所有提取的字符串保存到文件中,例如 $strings classes.dex >> extracted_strings.txt
。
Ghidra
-
工具: Ghidra
-
简介: 由美国国家安全局研究总局开发的软件逆向工程(SRE)工具套件
-
用途: 主要用于 iOS 应用程序
-
安装方法(在 Ubuntu 中):
- 从 github.com/NationalSec... 下载最新版本的发布版。
- 将 ZIP 文件解压缩到任意文件夹中。
- 导航至解压缩 ZIP 文件的文件夹,并在终端中运行以下命令:
shell
#./ghidraRun
以下是供参考的截图:
- 一旦您启动了 Ghidra,创建一个项目,然后选择要运行的工具之一,如下所示:
CodeBrowser 工具有助于反汇编二进制文件。您可以导入 classes.dex 文件(只需拖放),工具将显示反汇编的代码。
Radare
-
工具: Radare
-
网站: rada.re/r/
-
简介: 可用于多种不同架构的反汇编(和汇编)工具
-
用途: 主要用于 iOS 应用程序
-
安装方法(在 Ubuntu 中):
- 在终端中运行以下命令:
sql
#sudo apt-get update
#sudo apt-get install radare2
- 安装完成后,运行以下命令确认:
bash
#radare2 --version
以下是供参考的截图:
到目前为止,我们已经完成了安装和设置所有主要工具所需的逆向工程移动应用程序,尽管在接下来的章节中可能需要更多的工具。我们将在需要时安装这些工具/实用程序。
安装和更新逆向工程所需的各种工具和实用程序可能是一项艰巨的任务。渗透测试人员和逆向工程师每天都需要一个适当的设置来进行工作。如果有一个定制的、良好设置的、预先构建的平台用于移动应用程序的安全测试和逆向工程,那该多好?这就是 Mobexler 的用途,一个移动应用程序渗透测试平台。
Mobexler 预装了渗透测试人员和逆向工程师所需的所有必要工具和实用程序。Mobexler 专门用于帮助测试 Android 应用程序以及 iOS 应用程序的安全性。
然而,当开始学习任何新主题时,最好花一些额外的时间手动设置一切。我们将在本书的其余部分中使用 Ubuntu 虚拟机环境,但是一旦您熟悉了所有工具并了解了它们的用法,可以自由地使用预设的环境,例如 Mobexler。
Mobexler 虚拟机
-
简介: 一个移动应用程序渗透测试平台,预装了所有逆向工程和渗透测试 Android 和 iOS 应用程序所需的工具
-
网站: mobexler.com/
-
用途: Android 和 iOS
-
设置方法:
- 从 Mobexler 网站下载最新的镜像(ova)文件:mobexler.com/download.ht...
- 在虚拟化软件中导入下载的虚拟机镜像,例如 VirtualBox 或 VMware。
- 您也可以按照 Mobexler 网站上的逐步指南进行设置:mobexler.com/setup.htm
- 导入为虚拟机后,使用虚拟机描述中提到的密码登录虚拟机。
- 要了解 Mobexler 中安装的工具的更多信息,您可以访问 Mobexler 页面:mobexler.com/tools.htm
使用案例示例
正如前面提到的,Mobexler 预装了您需要的所有主要工具。因此,它可以用于几乎所有类型的移动应用程序,例如 Java、Kotlin、Swift 和 Objective C。例如,让我们使用上一章创建的相同 APK,并尝试从 Mobexler 中使用不同的工具。
在下面的图像中,我们将运行 apktool,在 Mobexler 中预先安装,并解码一个 APK 文件。使用的 APK 文件与本书前一节中创建的示例 APK 相同。您也可以使用相同的命令来解码任何其他 APK。
命令如下:
less
#apktool d [apk_nam/path]
这里,d 代表 decode。
以下是供参考的截图:
同样,您可以直接从 Mobexler 终端使用其他更高级的工具,比如 radare2
现在我们已经完全设置好了用于逆向移动应用程序的环境,我们将开始进行一些练习,在这些练习中,我们将对真实世界的移动应用程序进行逆向工程。为了帮助您更好地理解这些概念,我们将提供一个真实应用程序的源代码(以及应用程序包)。这个应用程序将以多种格式提供,即 Java 和 Kotlin 用于 Android 应用程序,以及 Swift 和 Objective C 用于 iOS 应用程序。