1、壳
1.1、加壳
ipa文件上传到App Store后,App Store会对可执行文件进行加壳操作,所以安装到iPhone上的App都是经过加壳的,是没办法通过Hopper和Class-dump解析的。
加壳是利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。加壳前可执行文件会直接加载到内存中执行:
加壳后会把壳程序和加密后的可执行文件加载到内存中,壳程序会对可执行文件解密:
1.2、脱壳
脱壳就是摘掉壳程序,将为加密的可执行文件还原出来。脱壳主要有两种方法:硬脱壳、动态脱壳。
硬脱壳就是拿到壳文件通过解密算法,得到解密后的可执行文件:
动态脱壳就是先执行壳程序,让壳程序自动解密,再拿到解密额后的可执行文件:
iOS中有很多好用的脱壳工具,例如 frida-ios-dump、Clush、dumpdecrypted 等。
Clush、dumpdecrypted已过时(2022年4月,iOS 14.7.1),不推荐使用。
1.3、验证
验证可执行文件是否已经脱壳可以通过Mach-O来验证,Load Commands - LC_ENCRYPTION_INFO_64 - Crypt ID,如果Crypt ID(加密工具ID)是0代表没有加过密(已脱壳),如果不是0则意味着加过密(未脱壳)。
也可以通过命令行来验证:$ otool -l WebToon | grep crypt
cryptoff 16384
cryptsize 11452416
cryptid 1
cryptoff 16384
cryptsize 12468224
cryptid 1
2、Frida
2.1、Frida简介
Frida 是一个面向开发人员、逆向工程师和安全研究人员的动态检测工具包。它支持Windows、macOS、GNU/Linux、iOS、Android 和 QNX。iOS脱壳需要使用 frida-ios-dump 工具。使用前需要先配置Mac和iPhone的Frida环境。
2.2、配置Mac的Frida环境
2.2.1、安装Frida
安装frida前需要安装Python、wget和pip。
安装wget:
$ brew install wget
安装pip:
$ wget https://bootstrap.pypa.io/get-pip.py
$ sudo python3 get-pip.py
安装frida:
$ sudo pip install frida-tools
2.2.2、安装usbmuxd
在脱壳时Mac需要通过usb和iPhone进行通信,所以需要在Mac上安装usbmuxd:
$ brew install usbmuxd
2.2.3、错误处理
如果使用brew安装过程中出现以下报错:
Error: No such file or directory @ rb_sysopen - XXXX.monterey.bottle.tar.gz
代表缺少XXXX文件,可以先安装缺少的文件:
$ brew install XXXX
2.3、配置iPhone的Frida环境
在Cydia中添加软件源:https://build.frida.re,然后搜索Frida,根据硬件环境选择合适的版本安装。
安装后需要重启Springboard,在iPhone终端输入:
$ killall SpringBoard
3、frida-ios-dump
3.1、下载代码
将 frida-ios-dump 代码下载到本地。
3.2、安装必要环境
cd到代码所在文件夹,终端输入:
$ sudo pip install -r requirements.txt —upgrade
3.3、SSH登录iPhone
打开iTerm,将Mac的2222端口映射到iPhone的22端口:
$ iproxy 2222 22
快捷键 Command + T 打开一个新的Tab,登录本地2222端口:
$ ssh root@localhost -p 2222
dump.py默认端口是2222,如果使用自定义端口需要更改dump.py中Port对应的值。
3.4、脱壳
3.4.1、查看已安装的App
回到代码所在文件夹,通过 dump.py 脚本的 -l 命令查看已安装的App:
$ python3 dump.py -l
PID Name Identifier
----- ------------ ---------------------------
13198 Cydia com.saurik.Cydia
13178 喜马拉雅 com.gemd.iting
- App Store com.apple.AppStore
- FaceTime通话 com.apple.facetime
- Safari浏览器 com.apple.mobilesafari
- Watch com.apple.Bridge
- checkra1n kjc.loader
- iOSTestDemo mxl.iOSTestDemo
- iTunes Store com.apple.MobileStore
- 今日头条 com.ss.iphone.article.News
3.4.2、脱壳
以今日头条为例,终端输入:
$ python3 dump.py com.ss.iphone.article.News
脱壳成功后会在脚本同目录下生成ipa文件:
3.4.3、验证
找到可执行文件,输入命令:
$ otool -l news | grep crypt
cryptoff 32768
cryptsize 4096
cryptid 0
cryptid是0,代表已经脱壳成功。