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 脱壳流程总结

我把整个脱壳流程画了张图,方便你理解:

iOS应用脱壳流程 获取加密App 从App Store下载 选择脱壳工具 Clutch / dumpdecrypted / frida 执行脱壳操作 注入/命令行 验证脱壳结果 检查cryptid是否为0 cryptid=0? 排查问题重新脱壳 检查反调试/注入方式 脱壳成功 开始逆向分析

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