用途
该技能用于在获得授权的安全评估中,对 iOS 应用进行动态逆向工程。适用于以下场景:在没有源代码的情况下分析 iOS 应用内部结构;从运行中的 iOS 应用中提取加密密钥、API 密钥或专有协议细节;通过运行时方法追踪理解被混淆的 Swift/Objective-C 逻辑;绕过复杂的安全机制,例如越狱检测、反篡改与反调试。
明确禁止将该技能用于违反服务条款或知识产权法的未授权逆向工程。
前提条件
- 已越狱的 iOS 设备,并通过 Cydia/Sileo 安装 Frida server;或使用非越狱设备,通过 Frida Gadget 注入 IPA。
- Python 3.10+ 及 frida-tools(
pip install frida-tools)。 - 通过 USB 连接 iOS 设备。
- 用于提取 Objective-C 头文件的 class-dump 或 dsdump。
- 用于静态二进制分析的 Hopper Disassembler 或 Ghidra(作为补充)。
- 了解 Objective-C 运行时与 Swift 名称修饰(name mangling)。
工作流
步骤 1:提取并分析二进制
在越狱设备上查找应用二进制:
ssh root@<device_ip>
find /var/containers/Bundle/Application/ -name "TargetApp" -type f
从 App Store 下载的应用使用 FairPlay 加密,需先解密。可使用 frida-ios-dump 或 Clutch 解密,再提取 Objective-C 类头文件:
pip install frida-ios-dump
dump.py com.target.app
class-dump -H decrypted_binary -o headers/
ls headers/ # Lists all class header files
步骤 2:在运行时枚举类与方法
iOS 使用 ObjC 运行时,可通过 ObjC.classes 遍历已加载类,筛选目标类名(如包含 Target、Auth、Crypto),并列出其自有方法。示例脚本 enumerate_classes.js 会打印匹配类及其方法。运行方式:
frida -U -n TargetApp -l enumerate_classes.js
步骤 3:使用方法调用追踪
使用 frida-trace 追踪指定类或模式的方法:
frida-trace -U -n TargetApp -m "*[TargetAuth *]"
frida-trace -U -n TargetApp -m "*[*Crypto* *]"
frida-trace -U -n TargetApp -m "*[*KeyChain* *]"
frida-trace -U -n TargetApp -m "*[*Token* *]"
frida-trace -U -n TargetApp -m "*[*$s*Auth*]"
步骤 4:Hook 并修改方法行为
通过 Interceptor.attach Hook Objective-C 方法(如 AuthManager 的 - validateToken:),在 onEnter 中读取参数并打印,在 onLeave 中可打印返回值,也可选择修改返回值(如强制返回 true)。同时可 Hook libcommonCrypto.dylib 中的 CCCrypt,捕获加密操作类型、算法、密钥长度与密钥内容,并用 hexify 辅助函数将缓冲区转为十六进制字符串。
步骤 5:分析 Swift 代码
Swift 方法采用名称修饰(形如 $s<module><class><method>)。继承自 NSObject 的 Swift 类可通过 ObjC 运行时访问,可筛选 _TtC 或 TargetApp. 前缀的类;纯 Swift(未桥接到 ObjC)则需使用 Module.enumerateExports 遍历导出符号,筛选包含 Auth 或 Crypto 的名称。
步骤 6:提取机密与专有数据
可 Hook NSUserDefaults 的 - objectForKey: 以记录键值,Hook Security 框架的 SecItemCopyMatching 以记录 Keychain 查询与结果。示例脚本 extract_secrets.js 展示了上述 Hook 写法。
关键概念
- Objective-C 运行时:动态运行时,支持方法派发、类内省与方法交换。
- Swift 名称修饰:编译器将 Swift 函数签名编码为链接器兼容的符号名。
- FairPlay DRM:Apple 对 App Store 二进制施加的加密,静态分析前必须先解密。
- class-dump:从 Mach-O 二进制中提取 Objective-C 类声明的工具。
- CommonCrypto:Apple 的 C 层加密库,是通过 Frida Hook 提取加密密钥的主要目标。
工具与系统
- Frida:用于 iOS 运行时 Hook 与方法拦截的动态插桩框架。
- frida-trace:自动追踪工具,为匹配的方法生成处理桩。
- frida-ios-dump:通过内存转储解密受 FairPlay 保护的 iOS 应用。
- class-dump / dsdump:从 Mach-O 二进制提取 Objective-C 头文件。
- Ghidra:NSA 的逆向工程框架,用于 iOS 应用的 ARM64 静态二进制分析。
常见陷阱
- FairPlay 加密:从 App Store 下载的应用已加密,静态分析前必须在越狱设备上用 frida-ios-dump 解密。
- 纯 Swift 类:未标注
@objc的纯 Swift 类无法通过ObjC.classes看到,应改用Module.enumerateExports()。 - 符号被剥离的二进制:Release 构建会剥离调试符号,应结合 frida-trace 与 class-dump 输出进行分析。
- 反 Frida 措施:复杂应用会检测 Frida 痕迹(frida-server 进程、内存中的 Frida agent 字符串、dyld 中注入的库),可使用隐蔽的 Frida 构建或 Frida Gadget 注入。