iOS 应用砸壳

背景

与破解 MacOS App 应用不同,破解 iOS 应用会更麻烦一些,因为在上架 AppStore 之前,xCode 会给应用做一层安全防护,俗称加壳(有点类似代码混淆),如果不砸壳直接丢进 hopper 或者其他反编译软件就会什么也看不到。

所以我们的第一步就是要先去掉这层保护。这也是这篇文章要讲的内容。

原理

去掉保护壳的原理也很简单。首先肯定无法硬砸(因为你没有解密的密钥),其次无论第三方给应用做了何种的保护,最终加载到手机内存里执行的时候一定是去壳后的内容,否则操作系统自己也同样看不清带壳的应用。然而正常的手机系统是不允许第三方应用查看其他应用的内存状态的,但有一种情况例外,就是已经越狱的手机。

所以,砸壳有个必备的条件:一部已经越狱了的手机

当能查看应用在内存的状态时,直接 dump 下来就是最原始的不带壳的二进制应用文件了。

步骤

以 Pokemon GO 这个应用举例,拿到越狱手机后,先从官方 AppStore 下载 Pokemon GO,然后打开 Cydia 安装 OpenSSHFrida,接着参照 这里,下载 一键砸壳 项目。

做好 端口映射

1
iproxy 2222 22

然后用数据线连接越狱机器,然后在砸壳项目 frida-ios-dump 的根目录里执行:

1
./dump.py -l

若出现下面的错误:

1
2
3
4
5
6
7
Failed to enumerate applications: unable to connect to remote frida-server: Unable to connect (connection refused)
Traceback (most recent call last):
File "./dump.py", line 301, in <module>
list\_applications(device)
File "./dump.py", line 204, in list\_applications
if len(applications) > 0:
TypeError: object of type 'NoneType' has no len()

表示越狱机器上的 Frida 服务还没开启,这时需要 SSH 进去手动启起来,另起一个 iTerm 终端,SSH 到越狱机器:

1
2
3
4
→ ssh -p 2222 [email protected]
[email protected]'s password: \[这里输入默认密码: alpine\]
Last login: Sun Apr 14 04:03:00 2019 from 192.168.0.148
specerxiteki-iPhone:~ root# /usr/sbin/frida-server -l 0.0.0.0

然后重新再执行一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
→ ./dump.py -l
PID Name Identifier
\--- ------------ ---------------------------
435 Cydia com.saurik.Cydia
- App Store com.apple.AppStore
- Electra com.blockabc.test
- FaceTime 通话 com.apple.facetime
- Pokémon GO com.nianticlabs.pokemongo
- QQ com.tencent.mqq
- Safari 浏览器 com.apple.mobilesafari
- ShadowLink® com.klink.proxy
- Sileo org.coolstar.SileoStore
- Watch com.apple.Bridge
- iBooks com.apple.iBooks
- iTunes Store com.apple.MobileStore
- 信息 com.apple.MobileSMS
- 健康 com.apple.Health
- 地图 com.apple.Maps
- 备忘录 com.apple.mobilenotes
- 天气 com.apple.weather
- 家庭 com.apple.Home
- 微信 com.tencent.xin
- 指南针 com.apple.compass
- 提示 com.apple.tips
- 提醒事项 com.apple.reminders
- 播客 com.apple.podcasts
- 文件 com.apple.DocumentsApp
- 日历 com.apple.mobilecal
- 时钟 com.apple.mobiletimer
- 查找 iPhone com.apple.mobileme.fmip1
- 查找朋友 com.apple.mobileme.fmf1
- 照片 com.apple.mobileslideshow
- 电话 com.apple.mobilephone
- 相机 com.apple.camera
- 股市 com.apple.stocks
- 虚拟定位 com.blockabc.deers
- 视频 com.apple.videos
- 计算器 com.apple.calculator
- 设置 com.apple.Preferences
- 语音备忘录 com.apple.VoiceMemos
- 通讯录 com.apple.MobileAddressBook
- 邮件 com.apple.mobilemail
- 钱包 com.apple.Passbook
- 音乐 com.apple.Music

这个命令可以看到目前越狱手机上安装的所有应用,接着运行:

1
./dump.py "Pokémon GO"

等运行结束则会在当前目录下生成砸壳后的 Pokémon GO.ipa ,生成 ipa 的过程中观察发现越狱手机会自动运行要砸壳的应用,这就是因为砸壳的原理是直接从内存中 dump 一份可执行文件,所以必须要先运行应用,让操作系统将其加载到内存。

后记

以上是我自己以前砸壳的办法,后来为了省事就直接从第三方越狱市场(比如 PP 助手)下载已经砸完壳的 ipa 文件了。

需要注意的一点是,直接用别人的 ipa 是有风险的,因为你也不清楚他们有没有夹带私货,这些私货有时会非常危险,你甚至可以直接理解为夹带了私货的官方 ipa 文件就是一个木马。