网上关于 iOS 应用砸壳相关的博客,非常多,但都存在一些问题。
- 年代久远,砸壳的方法早已过时
- 比较新的文档,不够完整,不够详细,对于一些过程都是一带而过,缺乏详细的描述,对小白来说非常不友好。
故,我将最近实践成功的经验详细地记录下来,希望对小白们有所帮助吧,如果文中有说得不对的地方,也希望大家能指出。
预备知识
教材:主要学习了一下庆哥(刘培庆)的书《iOS应用逆向与安全》,小伙伴们可以去买一本正版纸书,支持一下~
越狱设备
本次学习,选择的是 iOS 13.3.1 的 iPad mini4, A8 芯片 ARMv8 架构
其中要注意两点
- checkra1n 属于不完美越狱,与完美越狱的区别是如果设备重启了,将会回到未越狱状态,需要重新越狱。
- 注意越狱成功后,在手机上使用 checkra1n app下载 cydia 时,可以使用 4G 网络,可以大幅加快下载速度。
frida 砸壳
为什么要砸壳?
这是因为应用上传至App Store后,苹果会对应用的代码部分进行加密,当应用运行时才会动态解密, 在这样的情况下是无法直接使用后面讲到的class-dump和IDA进行分析的。所以,在分析应用之前,要把应用加密的内容解密,然后把应用和解密后的可执行文件导出到计算机中。
这里我不会使用网上经常出现的 dumpdecrypted
、Clutch
,而是使用了 frida
。
1 iOS 端配置
- 在越狱设备上,打开 cydia,添加源
https://build.frida.re
- 打开添加的源,找出
frida
进行安装,其中会列出 3 个软件,分别是Frida for 32-bit devices
、Frida for A12+ devices
、Frida for pre-A12 devices
三个,请根据越狱设备的实际 CPU 类型,进行选择,本文中使用的 iPad mini 4 是 A8 芯片,所以安装了第三项 - 安装完成后,可在ssh终端运行
frida-ps -U
查看,是否成功(实测,command not found 应该也不影响后续的使用)
2 MAC 端配置
Anaconda
这个软件的主要作用是可以配置多种不同的 Python 环境,避免在 MAC 上安装多个 Python 版本,导致的管理混乱,其他功能可以自己去了解一下。
这里采用 Anaconda 的原因是,在用普通方式(在自己的 mac 下安装不同版本的 Python,并安装依赖库)踩了很多坑,实在趟不过了......
- 搜索并安装
Anaconda
软件 - 安装完成后,建议不使用软件自带的 Python,而是自己 create environment,这里配置环境 Python 3.7,并为环境取名 zyy
- 配置完成后,点击对应 zyy 环境的三角箭头,打开终端,这个终端就会有你安装的 Python 版本
安装 frida-ios-dump
- 克隆庆哥(刘培庆)改造过的仓库,代码如下
git clone https://github.com/AloneMonkey/frida-ios-dump
- 使用前面提到的
Anaconda
打开的终端, cd 到前一步下载的目录 frida-ios-dump - 安装需要的依赖
sudo pip install -r requirements.txt --upgrade
- 如果在上一步出现 six 导致的问题,请忽略 six 这个库
sudo pip install six --upgrade --ignore-installed six
- 如果安装的过程比较慢,可以切换成清华源进行安装 (如果存在因为这个源而导致某些库安装不成功,可以通过修改
requirements.txt
中的依赖库名单来分批下载,使用原本的源下载不成功的库)
sudo pip install -r requirements.txt --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
电脑和 iOS 设备的端口映射
- 使用 USB 将设备与电脑相连
- 进行映射,在终端输入
iproxy 2222 22
(其中 2222 代表电脑端的端口,22 是 iOS 设备的端口号,如果发现电脑端端口号已被占用,可以使用新的端口号进行映射,打开在frida-ios-dump
目录下的dump.py
,并将 2222 修改为新的端口号,端口号注意不要超过四位数) - 终端显示
waiting for connection
,看到这儿,抓紧时间看下一步的砸壳喔,否则连接就会超时
砸壳
- 确保 iOS 设备一直保持 USB 连接,并将想要砸壳的应用打开,保证显示在前台,否则可能出现找不到应用,导致砸壳失败
- 使用
Anaconda
的 zyy 环境另开一个新的终端 - cd 到之前下载的 frida-ios-dump 目录
- 执行
./dump.py 微信
(这里将微信改成你想砸壳的应用名即可) - 如果发现应用名称重复了怎么办?终端执行
./dump.py -l
可以查看已安装的应用名称和对应的 bundle Id
PID Name Identifier
----- ------------------------- ----------------------------------------
9661 App Store com.apple.AppStore
16977 Moment com.kevinholesh.Moment
1311 Safari com.apple.mobilesafari
16586 信息 com.apple.MobileSMS
4147 微信 com.tencent.xin
10048 相机 com.apple.camera
7567 设置 com.apple.Preferences
- CrashReporter crash-reporter
- Cydia com.saurik.Cydia
- 通讯录 com.apple.MobileAddressBook
- 邮件 com.apple.mobilemail
- 音乐 com.apple.Music
- 执行如下命令,对指定的 bundle id 应用进行砸壳,
./dump.py -b com.tencent.xin
- 砸壳成功,可以在
frida-ios-dump
目录下找到 xxx.ipa
如何判断 ipa 是否有壳
- 将 ipa 文件后缀改为 zip 进行解压
- 找到 xx.app 包内容下的 xx 二进制可执行文件(abc 是我随便取的)
- 在终端执行
otool -l xx | grep crypt
- 找到
cryptid
这一行,有壳为 1,已脱壳为 0
如果能成功走到这一步,恭喜,砸壳成功啦。