[iOS 逆向 3] 应用砸壳

iOS 逆向工程的流程大致如下:

1 解密、导出目标程序。
2 class-dump 导出头文件。
3 分析界面布局、交互逻辑,找到关键函数。
4 静态分析函数的反汇编代码,大致了解函数的内部逻辑。
5 动态分析关键函数,分析运行时的实际执行流程及寄存器、内存等信息。
6 模拟或篡改程序逻辑。
7 制作成插件;移植到非越狱机器。

整体流程虽然很清晰,但过程可能会不太顺利。逆向工程这时和普通的软件开发一样,很枯燥,但一旦达到目标会很有成就感。多次实践后,每个人都会有属于自己的一套分析方法和技巧。

后续文章整体上围绕这个流程展开,本文就是介绍解密、导出头文件、界面分析及它们用到的工具。

1 应用解密

也称应用砸壳、应用脱壳。

应用上传至 App Store 后,苹果会对应用的代码部分加密,当应用运行时才会动态解密。也就是说,从越狱设备上把 App 复制到电脑,找到其中的可执行文件,此时的可执行文件无法直接使用 class-dump 、IDA 等工具进行分析。

因此,在分析应用之前要把应用加密的内容解密,然后把应用和解密后的可执行文件导出到计算机中。下面介绍几个工具,原理都是通过提取运行中的程序的内存实现的。

dumpdecrypted

git clone https://github.com/stefanesser/dumpdecrypted.git
cd dumpdecrypted
make
会在当前目录下生成 dumpdecrypted.dylib。
有兴趣了解源码的话后面有文章专门解读,本文只介绍原理。

在手机中打开目标应用,也就是让系统帮我们解密。因为该工具的原理是向 App 注入一个动态库,动态库代码提取 App 内存,导出解密后的可执行文件。由于该工具导出时需要写文件到动态库同名目录下,而 App Store 下载的 App 只能读写沙盒,所以我们把动态库放到沙盒中再注入。现在就需要获取 App 沙盒地址。

手机先去 Cydia 安装 Cycript 插件。本文最后会详细介绍,现在只简单用一下。

打开目标程序后,用 ps -e 命令列出进程列表,找到目标程序,其实通过越狱工具比如爱思助手就可以轻松找到目标程序可执行文件的位置。用 ps 可以加 grep 帮助查找:ps -e | grep Application
找到目标程序 App 的位置,如 /var/containers/Bundle/Application/D00CF74B-D971-4D39-9F8D-0B3037828A99/TomatoTime.app/TomatoTime。

现在知道了目标的可执行文件名为 TomatoTime,执行 cycript -p TomatoTime 进入命令行交互模式,在里面执行 NSHomeDirectory() 就获得了沙盒目录,如 /var/mobile/Containers/Data/Application/6D537E88-9F1F-423E-9F3C-300198776E33。现在把 dumpdecrypted.dylib 复制到沙盒内 Documents 目录下,用爱思助手或 scp 命令。

进入 Documents 目录,执行 DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/D00CF74B-D971-4D39-9F8D-0B3037828A99/TomatoTime.app/TomatoTime,即通过设置 DYLD_INSERT_LIBRARIES 环境变量向 TomatoTime 注入动态库。注意:

踩坑:较高的 iOS 版本需要前面先执行 ldid -S dumpdecrypted.dylib 给动态库签名;
踩坑:如果越狱设备和本机 Xcode 内的 iPhoneSDK 版本不同,需要修改刚从 GitHub 下载的项目的 makefile,然后重新 make。具体修改:在 GCC_BASE 最后加上 -miphoneos-version-min=12.0 或更低版本。二者对应的错误信息分别是:

dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.  Did find:
	dumpdecrypted.dylib: code signature in (dumpdecrypted.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.
Abort trap: 6

dyld: Symbol not found: ___chkstk_darwin
  Referenced from: dumpdecrypted.dylib (which was built for iOS 13.0)
  Expected in: /usr/lib/libSystem.B.dylib
 in dumpdecrypted.dylib
Abort trap: 6

成功的话当前目录下会输出 TomatoTime.decrypted,用 scp 或爱思助手复制到电脑。

Clutch

第二种应用解密方法,Clutch 是生成一个新的进程,然后暂停进程并 dump 内存。

下载地址。复制到手机 /usr/bin/ 目录下,确保有执行权限 chmod +x /usr/bin/Clutch

执行 Clutch -i 可以查看设备安装的应用和 Bundle ID。知道目标应用的 Bundle ID 后,使用 Clutch -b 目标BundleID 命令解密。log 中有写输出目录,输出结果是 .ipa 后缀的压缩包,改为 .zip 后缀解压即可。注意:此工具不稳定,对有些 App 不能成功解密。

dumpdecrypted 修改版

dumpdecrypted 可以解密可执行文件,但是如果想解密 App 中的 framework 则不行。虽然 Clutch 可以,但是不稳定。于是有人改进了 dumpdecrypted,下载页面,支持解密 framework。下载后可以用前面文章提到的第二种动态库注入方法(plist 文件中添加目标程序的 Bundle ID)注入,更方便一些,重新打开 App 即可在沙盒内 Documents 目录下生成解密后的可执行文件和 framework。

frida-ios-dump

第三种解密工具,下载页面。电脑端执行一条命令即可直接导出解密后的整个 ipa 包,但是不稳定。


分析可执行文件之前,提一下加密标志,电脑上执行命令 otool -l TomatoTime | grep cryptotool -l TomatoTime.decrypted | grep crypt 对比输出,可以看到 cryptid 由 1 变为了 0。自己电脑上编译的可执行文件是 0,从 App Store 下载的程序的可执行文件是 1。涉及到 Mach-O 文件格式,后面有专门的文章介绍。

2 class-dump

下载地址。使用示例 :
./class-dump --arch arm64 TomatoTime.decrypted -H -o ./Headers

如果项目中包含 swift 类,由于编译 swift 类时会使用 name mangling,所以提取出的头文件中会包含类似 _TtC12DemoAppl0MyClass 的类名。执行xcrun swift-demangle -compact _TtC12DemoAppl0MyClass 可以看到代码中的类名,此例结果是 DemoApp.MyClass,意思是 DemoApp 命名空间的 MyClass 类。也正因这个特点,不同 swift 库中即使存在相同类名也不会冲突,因为运行时的真实类名并不相同。后面操作与 swift 有关的内容时,必须使用真实符号名。

class-dump 原理及源码解读在另一篇文章中。

3 界面分析

Reveal 是用于查看程序界面结构、调试界面的工具。
可以在开发过程中动态调试修改程序的样式;也可以在越狱设备上注入到 App 内来查看应用的界面结构。

开发使用

去官网下载 Reveal 或者去找免费版;
下载后,把 Reveal.app/Contents/SharedSupport/iOS-Libraries/RevealServer.framework 拖到项目里,运行项目。电脑和手机在同一网络环境下或 USB 连接,打开 Reveal 就看见了。比 Xcode 自带的 Debug View Hierarchy 功能强一些。

越狱注入

刚才用到的 RevealServer.framework,找到里面的 RevealServer 文件,改名为 libReveal.dylib,然后配一份 libReveal.plist,按照前面文章提到的方法注入动态库。同一网络或 USB,即可分析界面。

附:Cycript

Cycript 是一个允许开发者使用 OC、JavaScript 组合语法查看及修改运行时 App 内存信息的工具,主要用来调试 iOS App。可以在正常开发时使用,也可以在越狱设备上使用。

开发集成
越狱集成
使用方法

官网中有更详细的介绍和完整用法。

你可能感兴趣的:(iOS逆向)