iOS砸壳-方法篇

在《iOS逆向工程》第二版中,介绍的是dumpdecrypted砸壳,这种方法繁琐复杂,还需要开2个终端做不同的操作,并且只能获取到二进制文件。
AloneMonkey 后来又开源了 frida-ios-dump基于frida的一键砸壳脚本,能直接获取砸壳后的ipa包。
并且在 AloneMonkey 开源的逆向插件MonkeyDev中自带了一键破壳。
先介绍下前两种方法的具体步骤,然后有兴趣的可以看下原理。

frida-ios-dump安装步骤

github地址:https://github.com/AloneMonkey/frida-ios-dump

1 macOS安装frida

在终端输入

1
sudo pip install frida

如果失败尝试科学上网

2 越狱设备安装frida

打开越狱手机,打开cydia,添加cydia源 https://build.frida.re/ ,添加成功之后,搜索Frida插件,5s及以后的都是选择第一个安装。

3 验证frida安装

确认设备和macOS都安装成功后
用USB连接设备和电脑
终端输入

1
frida-ps -U

如果显示一堆 PID 和 NAME 就说明安装成功。

4 越狱设备安装OpenSSH

Cydia中主页就能直接安装

5 检查OpenSSH安装

设备和电脑同一wifi,在终端中用ssh连接手机ip
如我的手机ip192.168.43.155

1
ssh root@192.168.43.155

OpenSSH初始密码是alpine
登录成功后如图。

6 安装libmobiledevice和usbmuxd

1
2
brew install libimobiledevice
brew install usbmuxd

安装完成之后,在终端将USB端口映射到未被使用的端口,这里使用2222

1
iproxy 2222 22

然后在新开一个终端,通过ssh连接本地的2222端口

1
ssh -p 2222 root@localhost

输入OpenSSH密码,即可登录。

7 检查python版本

打开终端
输入

1
python  //或者 python -v

输入quit()可退出python交互界面。

8 安装frida-ios-dump

进入 https://github.com/AloneMonkey/frida-ios-dump
如果是python2.7就使用master分支。
python3.x使用 3.x 分支。

不是以上版本自行安装对应版本python,并重复步骤7确认。

确认python版本和分支一致后,clone项目到本地
然后cd到该项目的根目录
执行安装依赖
Python 2.7

1
sudo pip install -r requirements.txt --upgrade

Python 3.x

1
sudo pip3 install -r requirements.txt --upgrade

frida-ios-dump 使用

终端A

1
iproxy 2222 22

输完不要关闭
开一个新的终端B

终端B

先用USB连接越狱设备

1
ssh -p 2222 root@localhost

输入OpenSSH密码,连接成功

此时终端A`B都不要关闭 新建终端C`

终端C

cdfrida-ios-dump项目的根目录
执行

1
./dump.py -l

找到你要逆向的APP
执行

1
2
3
./dump.py [上面对应的Name]  
//或者
./dump.py [上面对应的Identifier]

成功,砸壳的ipafrida-ios-dump的项目根目录中。

注意,如果你修改了OpenSSH的密码,或者修改了映射端口号,会砸壳失败,只需要修改 dump.py 里的这里为你修改后的内容就OK了

dumpdecrypt破壳

github地址:https://github.com/VictorZhang2014/dumpdecrypted

准备工作

1 clone 该库到本地
2 终端cd到该目录,执行make命令,会生成一个dumpdecrypted.dylib
3 对dumpdecrypted.dylib进行签名

1
2
3
4
## 列出可签名证书
security find-identity -v -p codesigning
## 为dumpecrypted.dylib签名
codesign --force --verify --verbose --sign "iPhone Developer: xxx xxxx (xxxxxxxxxx)" dumpdecrypted.dylib

4 越狱设备安装OpenSSH

使用步骤

1 连接设备
终端A中用ssh连接越狱设备

1
ssh root@192.168.43.155

2 定位目标App
关闭设备全部进程,打开目标App
执行

1
ps -e

找到目标App WeChat

记录前面的PID 4841 和后面的app二进制路径/var/containers/Bundle/Application/A0F664FC-E1CB-4977-A7A6-67AE7645A07F/WeChat.app/WeChat

3 获取documents所在目录
执行

1
cycript -p 4841[上面记录的PID]

进入cycript

输入

1
[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]

记录Document路径/var/mobile/Containers/Data/Application/9F41D812-273D-4E60-B323-8362F060A453/Documents/

4 拷贝dumpdecrypteddocument
开启新的终端B

1
2
3
scp [dumpdecrypted.dylib的路径]/dumpdecrypted.dylib root@[手机ip]:[上面记录的Document路径]dumpdecrypted.dylib
//例子
scp /Users/hades/Documents/dumpdecrypted-master/dumpdecrypted.dylib root@192.168.92.140:/var/mobile/Containers/Data/Application/9F41D812-273D-4E60-B323-8362F060A453/Documents/dumpdecrypted.dylib

5 砸壳
终端A ctr+D退出 cycript
cd 到上面记录的document目录
执行

1
2
3
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib [最开始记录的app二进制路径]
//例子
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/A0F664FC-E1CB-4977-A7A6-67AE7645A07F/WeChat.app/WeChat

执行完,在对应的document目录下会生成 [appName].decrypted
6 拷贝[appName].decrypted到电脑
终端B

1
2
3
scp root@[手机ip]:[(appName).decrypted路径] [电脑目标路径]
//例子
scp root@192.168.92.140:/var/mobile/Containers/Data/Application/9F41D812-273D-4E60-B323-8362F060A453/Documents/WeChat.decrypted /Users/hades/Documents/

可能遇到的问题

有的App二进制竟然是中文!而SSH中没法输入中文
解决方案:http://bbs.iosre.com/t/ios-os-ssh/8010

SSH中空格的输入方式 \[空格]