18、iOS应用脱壳:Clutch、dumpdecrypted、frida-ios-dump的使用
好,咱们今天聊点实在的——iOS应用脱壳。
你想想看,从App Store下载的App,都是被苹果加密过的。这种加密,说白了就是一层硬壳。你要做逆向分析,第一步就得把这层壳给扒掉。不脱壳,你拿到的Mach-O文件就是一坨乱码,啥也干不了。
我个人习惯把脱壳工具分成三类:老牌的Clutch、经典的dumpdecrypted、以及现在最流行的frida-ios-dump。咱们一个一个说。
18.1 为什么需要脱壳?
苹果在iOS 10之后,对App Store分发的应用强制启用了FairPlay DRM加密。这个加密机制会把可执行文件的__TEXT段加密。你从越狱设备上直接把App拷出来,用MachOView一看,__TEXT段全是加密数据,根本没法分析。
嗯,这里要注意:脱壳不是破解,而是把苹果自己加的这层壳去掉,还原成原始的未加密状态。脱壳后的App,才能正常进行静态分析和动态调试。
核心概念:脱壳后的App,其加密标识位(LC_ENCRYPTION_INFO中的cryptid)会从1变为0。这是判断是否脱壳成功的硬指标。
18.2 Clutch:老牌工具,简单粗暴
Clutch是我最早接触的脱壳工具。它是个命令行工具,操作非常简单。
安装与使用
# 在越狱设备上通过Cydia安装Clutch
# 或者手动下载deb包安装
# 查看已安装的应用列表
Clutch -i
# 脱壳指定应用(使用Bundle ID)
Clutch -d com.tencent.xin
# 脱壳所有应用
Clutch -a
脱壳完成后,生成的IPA文件默认存放在 /private/var/mobile/Documents/Clutch/ 目录下。
我的经验:Clutch对iOS 10以下的老系统支持很好,但在iOS 11+上经常翻车。我曾经在iOS 12上用它脱一个金融类App,结果脱出来的包运行就闪退。后来发现是Clutch对某些加密段的处理有bug。
Clutch的局限性
- 不支持iOS 13及以上系统(作者已停止维护)
- 对含有多个可执行文件的Frameworks处理不完善
- 脱壳后的App有时需要重新签名才能安装
18.3 dumpdecrypted:经典中的经典
dumpdecrypted是Stefan Esser(知名安全研究员)开发的工具。它的原理很简单:利用dyld加载完可执行文件后,内存中的代码段已经是解密状态了,直接从内存中dump出来。
编译与使用
# 下载源码
git clone https://github.com/stefanesser/dumpdecrypted
# 编译
cd dumpdecrypted
make
# 编译后会生成 dumpdecrypted.dylib
# 在越狱设备上使用
# 先找到App的Documents目录
# 然后注入dylib
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /path/to/App
实际操作中,我更推荐用这种组合命令:
# 找到目标App的进程ID
ps -e | grep WeChat
# 注入dumpdecrypted
DYLD_INSERT_LIBRARIES=/path/to/dumpdecrypted.dylib /var/containers/Bundle/Application/xxxx/WeChat.app/WeChat
脱壳成功后,会在当前目录生成 目标App.decrypted 文件。
注意:dumpdecrypted需要App先启动起来才能注入。对于有反调试保护的App,你得先绕过反调试,否则dyld注入会被拦截。我曾经遇到一个App,它会在main函数之前就检测DYLD_INSERT_LIBRARIES环境变量,发现就直接exit(0)。
dumpdecrypted的优缺点
| 优点 | 缺点 |
|---|---|
| 原理简单,稳定可靠 | 需要手动操作,流程繁琐 |
| 支持iOS 6~12 | 不支持iOS 13+(越狱方式变化) |
| 生成的decrypted文件可直接分析 | 对含有多个架构的fat binary处理麻烦 |
18.4 frida-ios-dump:现代首选
说实话,现在做iOS脱壳,我个人最推荐的就是frida-ios-dump。它基于Frida框架,操作简单,兼容性好,而且还在持续维护。
安装配置
# 在Mac上安装
pip install frida-tools
# 下载frida-ios-dump
git clone https://github.com/AloneMonkey/frida-ios-dump
# 修改dump.py中的配置
# 设置SSH连接参数
User = 'root'
Host = '192.168.1.100' # 越狱设备的IP
Port = 22
Password = 'alpine'
使用方式
# 查看已安装的应用列表
python3 dump.py -l
# 脱壳指定应用(支持模糊匹配)
python3 dump.py WeChat
# 或者使用Bundle ID
python3 dump.py com.tencent.xin
# 脱壳后自动生成IPA文件
frida-ios-dump的工作原理是这样的:它通过Frida注入到目标进程,然后调用iOS底层的脱壳API,把解密后的内存数据dump出来,最后打包成IPA。
我的建议:frida-ios-dump配合Frida的spawn方式启动App,成功率最高。如果App有反调试,可以用 frida -U -f com.tencent.xin --no-pause 先启动,再执行dump。
frida-ios-dump的优势
- 支持iOS 11~16(包括最新的越狱环境)
- 自动处理Frameworks脱壳
- 生成的IPA可以直接安装使用
- 配合Frida脚本可以绕过部分反调试
18.5 三种工具对比
| 工具 | 适用系统 | 操作难度 | 稳定性 | 维护状态 |
|---|---|---|---|---|
| Clutch | iOS 6~12 | 简单 | 中等 | 已停更 |
| dumpdecrypted | iOS 6~12 | 中等 | 高 | 已停更 |
| frida-ios-dump | iOS 11~16 | 简单 | 高 | 持续更新 |
18.6 脱壳后的验证
脱壳完成后,一定要验证是否成功。我一般用两种方法:
# 方法一:使用otool查看加密标识
otool -l WeChat.decrypted | grep -A4 LC_ENCRYPTION_INFO
# 输出中 cryptid 应该为 0
# 方法二:使用MachOView图形化查看
# 打开MachOView,加载脱壳后的文件
# 查看Load Commands中的LC_ENCRYPTION_INFO
# cryptid = 0 表示脱壳成功
重要:如果cryptid还是1,说明脱壳失败。别急着放弃,检查一下:App是否在运行?注入方式是否正确?有没有反调试拦截?
18.7 脱壳流程总结
我把整个脱壳流程画了张图,方便你理解:
18.8 避坑指南
做脱壳这些年,我踩过不少坑。分享几个常见的:
- 越狱检测:很多App会检测越狱环境,检测到就直接退出。我一般先用Frida的脚本绕过越狱检测,再执行脱壳。
- 反调试:ptrace、sysctl这些反调试手段,会让注入失败。可以用Frida的anti-anti-debugging脚本处理。
- 多架构问题:现在的App基本都是fat binary,包含arm64和arm64e。脱壳时要确认所有架构都脱干净了。
- Frameworks脱壳:有些App的主程序没加密,但Frameworks里的动态库加密了。frida-ios-dump会自动处理,但Clutch和dumpdecrypted需要手动操作。
重要提醒:脱壳后的App不要用于商业用途,也不要传播。咱们做逆向分析,目的是学习技术、做安全研究,不是搞盗版。
好了,关于iOS脱壳的三种主流工具,我就讲这么多。说白了,工具只是手段,理解脱壳的原理才是关键。你掌握了frida-ios-dump,基本能应对90%以上的场景。剩下的10%,就需要你根据具体情况,灵活运用各种技巧了。
公众号:蓝海资料掘金营,微信deep3321