目录

iOS 应用安全分析流程简记

0x00 前言

现在的移动 app 安全分析中,许多人会选择使用 Android app 而不是 iOS app 进行分析,其原因可能为 iOS app 分析具有以下劣势:

  1. 门槛较高:需要 iOS 甚至 macOS 设备 (可能是主要原因);
  2. 样本难以取得:分析样本几乎只能取自 App Store,且难以批量获取;
  3. 学习成本:一般安全人员可能对 Java 更熟悉一些,对 iOS app 所使用的 Objective-C 可能仅仅有所耳闻。

而实际上,使用 iOS app 进行移动安全分析也具有一些 Android 所不具有的优势:

  1. 几乎不需要担心加壳的问题:在 Android 盛行各种企业加固壳的今天,上传到 App Store 的应用一般只有 App Store 添加的一层加密壳,使用工具进行解密 (砸壳) 后即可逆向分析;
  2. 逆向难度较低:由于 Apple 官方审核政策,上架 App Store 的应用一般都不会进行混淆,与被混淆的面目全非的 Android app 相比,在某种程度上 iOS app 的逆向难度要低很多。

因此,本文主要记录我在学习 iOS app 逆向分析的过程中的收获和遇到的问题。

0x01 越狱

进行 iOS app 分析的第一步当然是拥有一部 iOS 设备,第二步就是给这台 iOS 设备越狱。

我常用的越狱工具有两个:unc0vercheckra1n,这两个工具各有优劣,一般我会先尝试 checkra1n,使用 checkra1n 无法越狱或越狱出现问题的设备会再尝试使用 unc0ver 进行越狱。

checkra1n

checkra1n 使用较为简单,但仅支持 macOS 和 Linux 系统,不支持 Windows (WSL/WSL2 也不支持,因为没有 USB 直通),只需要将手机连接到电脑,按照说明点几下鼠标再动几下手指就搞定了,但 checkra1n 面对某些特定版本的 iOS 系统可能出现一些奇怪的问题 (比如不能获取完整的权限等)。

unc0ver

checkra1n 遇到问题时,我就会换用 unc0ver 进行越狱,一般来说 unc0ver 的成功率高一点,但相对来说操作也复杂一点 (需要 sideload 一个 unc0ver 的 app)。

Sideload (侧载):由于正常情况下 iOS 用户只能从 App Store 下载安装应用 (通过爱思助手等第三方工具安装的也是从 App Store 下载的应用,只不过是第三方工具使用了自己的 Apple ID 进行下载),而像 unc0ver 这种可以视为破解 iOS 的应用显然不可能上架 App Store,这种时候就需要使用 AltStore、iOS App Signer 等工具对安装包 (ipa) 进行签名,从而在未越狱的 iOS 设备上正常安装使用,这种操作被称为 sideload (侧载)。

unc0ver 的具体安装方法详见其 官网 的 Installation Guide,需要注意的是其中的 Cydia Impactor 方法需要 Apple developer account (一年 99🔪),其他方法只需要普通 Apple ID 即可。

爱思助手一键越狱

其实一键越狱也挺好用的(笑。

0x02 砸壳

上面说到,上传到 App Store 的应用会有一层 App Store 添加的加密壳,这层加密壳的公私钥与用户的 Apple ID 绑定,因此用户只有在设备上登录过下载时的 Apple ID 才可以对应用进行解密运行,从而正常打开应用。

这层加密壳即为 Apple 官方开发的名为 FairPlay 的数字版权管理 (DRM) 技术,除了应用,在 iTunes Store 下载的音乐、视频等多媒体文件也会采用同样的加密,只允许授权的设备使用下载的内容。

通过动态或静态技术手段,获取加密前的 ipa 或 Mach-O 文件的方法,被称为砸壳 (解密)。

ipa 文件:iOS 设备所使用的应用安装包。

Mach-O 文件:iOS 和 macOS 设备所使用的可执行文件格式,ipa 安装包中的主要可执行文件即为 Mach-O 格式,通过 FairPlay 加密的也是 ipa 包中的 Mach-O 文件。

目前常用的砸壳方法分为动态砸壳和静态砸壳,其中我常用的工具有 frida-ios-dump (动态砸壳) 和 foulwrapper (静态砸壳)。

其中 foulwrapper 为 fouldecrypt 的二次包装,原版 fouldecrypt 只能对指定的单个 Mach-O 文件进行砸壳,而 foulwrapper 可以搜索指定应用目录下的所有 Mach-O 文件进行砸壳,并将结果与应用目录下其他资源打包成 ipa 格式安装包,更便于批量砸壳。

动态砸壳:在设备中运行应用,等待应用完全解密后,从内存中提取 Mach-O 文件镜像,得到解密后的 Mach-O 文件。

静态砸壳:通过分析 iOS 系统中应用解密过程,在不运行应用的情况下复现整个解密操作,直接得到解密后的 Mach-O 文件。

frida-ios-dump

基于移动安全分析神器 Frida,需要越狱后在 Cydia 中安装 Frida 和 OpenSSH,并且需要在电脑上安装 libimobiledevice 的命令行工具,Windows 用户可以安装 imobiledevice-net

之后只需要按照说明运行命令,即可完成砸壳并自动将生成的 ipa 文件拷贝到电脑当前目录。

foulwrapper / fouldecrypt

同样需要越狱后安装 OpenSSH,将作者预编译的 deb 包通过 SCP 等方法传输到设备上,然后 SSH 到设备上通过 apt 命令安装即可。

之后只需要按照说明运行命令,砸壳后的文件会保存在设备的指定目录下,需要手动传输到电脑上。

0x03 逆向分析

经过上一个步骤的砸壳,我们拿到了解密后的 ipa 文件,然后就可以尽情的享受愉快的逆向了。下面就介绍一下我在逆向分析 iOS 应用的过程中常用的一些工具。

Lookin / Reveal

LookinReveal 是两款最常用的 iOS 应用 UI 调试工具,这两款工具是为了开发者更方便的对自己的应用 UI 进行调试 (类似 Web 应用的 inspect 工具),但安全分析人员也可以使用这两款工具来对需要分析的应用进行调试。其中 Reveal 为付费应用,Lookin 为开源免费应用,所以我用 Lookin。

Software is like sex: It’s better when it’s free. – Linus Torvalds

非常不幸的是,这两款工具都只支持 macOS,门槛这就体现出来了

使用 Lookin 需要先在设备上通过 Cydia 安装名为 LookinLoader 的插件,并在系统设置里找到 LookinLoader 选择需要调试的应用,之后只需要将设备连接到你的 mac (或者 Hackintosh),在电脑上打开 Lookin 即可看到拆解后的应用 UI。

/posts/ios-app-analysis/lookin.png
Lookin 官网宣传图

resymbol / class-dump

resymbolclass-dump 是两款可以通过 Mach-O 文件生成对应头文件的工具,其中 class-dump 仅支持 Objective-C 中的类,而 resymbol 既支持 Objective-C 又支持 Swift,所以我比较喜欢使用 resymbol。

同样,这两款工具也需要 macOS 来运行。

其生成的头文件包含 Mach-O 中所有的接口和类,以及他们包含的变量名和方法名。

IDA Pro

逆向分析必不可少的显然是 IDA Pro,然而,由于 Objective-C 来自 Smalltalk 的消息传递机制,使得 F5 一键反编译后的代码看起来有亿点点丑,与此同时,消息传递机制还使得 IDA Pro 的交叉引用功能几乎报废。

这里随便放一张图大家随便感受一下:

/posts/ios-app-analysis/objc-decompose.png
反编译后的 Objective-C

满屏的 objc_msgSend 看起来令人绝望,这里每一个 objc_msgSend 都是一个方法调用,而这种调用机制导致 IDA Pro 的交叉引用功能完全不可用。网上有些文章推荐使用 Hopper 进行 iOS 逆向,看官网介绍这应该是一款专注于 macOS 和 iOS 逆向工程的工具,对 Objective-C 和 Swift 有特殊优化,但是我并没有用过,有富婆送我一个吗

由于 Objective-C 的逆向过于复杂,之后我会再写一篇博客单独介绍具体细节(咕。

Frida

之前做过 Android 应用安全分析的师傅,对 Frida 一定不会陌生。由于其 Hook 万物的功能,我愿称之为移动安全分析神器。

iOS 设备使用 Frida 非常简单,只需要简单的越个狱,然后在 Cydia 里添加 Frida 的官方源 https://build.frida.re,然后简单的点击下载 Frida 即可。

为了简化自己日常的 Frida 使用,我基于 frida-compile 写了一个简单的辅助编写 Frida 脚本的项目 frida-scripts。虽然目前主要功能只有两个:

  1. 直接将完整的方法名解析到 Frida 的对象;
  2. 将打印函数参数、返回值等常用功能进行包装,方便调用。

而且这两个功能另一款基于 Frida 的移动安全分析工具 objection 都有 (而且比我做的好),但是我后续在使用过程中会逐步添加更多我认为常用的功能。

0x04 后记

安全研究道阻且长,这篇博客仅仅是一个菜🐔对于 iOS 应用分析流程的一点记录,对于其中存在的错误,或者表达不到位的地方,欢迎各位大佬指出,也希望可以和大佬们一起交流学习。