1、壳

1.1、加壳

ipa文件上传到App Store后,App Store会对可执行文件进行加壳操作,所以安装到iPhone上的App都是经过加壳的,是没办法通过Hopper和Class-dump解析的。
image.png
加壳是利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。加壳前可执行文件会直接加载到内存中执行:
image.png
加壳后会把壳程序和加密后的可执行文件加载到内存中,壳程序会对可执行文件解密:
image.png

1.2、脱壳

脱壳就是摘掉壳程序,将为加密的可执行文件还原出来。脱壳主要有两种方法:硬脱壳、动态脱壳。
硬脱壳就是拿到壳文件通过解密算法,得到解密后的可执行文件:
image.png
动态脱壳就是先执行壳程序,让壳程序自动解密,再拿到解密额后的可执行文件:
image.png
iOS中有很多好用的脱壳工具,例如 frida-ios-dumpClushdumpdecrypted 等。

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则意味着加过密(未脱壳)。
image.png
也可以通过命令行来验证:$ otool -l WebToon | grep crypt

  1. cryptoff 16384
  2. cryptsize 11452416
  3. cryptid 1
  4. cryptoff 16384
  5. cryptsize 12468224
  6. cryptid 1

cryptid对应的值是1,代表已经经过加密。

2、Frida

2.1、Frida简介

image.png
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,根据硬件环境选择合适的版本安装。
image.png
安装后需要重启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

  1. PID Name Identifier
  2. ----- ------------ ---------------------------
  3. 13198 Cydia com.saurik.Cydia
  4. 13178 喜马拉雅 com.gemd.iting
  5. - App Store com.apple.AppStore
  6. - FaceTime通话 com.apple.facetime
  7. - Safari浏览器 com.apple.mobilesafari
  8. - Watch com.apple.Bridge
  9. - checkra1n kjc.loader
  10. - iOSTestDemo mxl.iOSTestDemo
  11. - iTunes Store com.apple.MobileStore
  12. - 今日头条 com.ss.iphone.article.News

3.4.2、脱壳

以今日头条为例,终端输入:
$ python3 dump.py com.ss.iphone.article.News
脱壳成功后会在脚本同目录下生成ipa文件:
截屏2022-05-11 下午9.01.57.png

3.4.3、验证

找到可执行文件,输入命令:
$ otool -l news | grep crypt

  1. cryptoff 32768
  2. cryptsize 4096
  3. cryptid 0

cryptid是0,代表已经脱壳成功。