关于 re-ios
面向逆向分析人员的 iOS 应用分析技能,可检查 IPA 文件与已安装应用。内容涵盖 Mach-O 和 Objective-C 元数据静态检查,以及在受控设备上调试和解密 App Store 二进制的流程。
主要功能
- 01解包 IPA 并检查签名
- 02导出 Objective-C 头文件与类元数据
- 03检查 Mach-O 架构和依赖
- 04在越狱环境中调试应用
- 05使用适配的 dumper 解密 App Store 二进制
适用场景
- 01初步检查 IPA 及其主程序
- 02在反编译前查看应用类结构
- 03静态分析前识别加密状态
- 04在越狱设备上调试应用
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dslsdzc/ rev-skills --skill re-ios安装后在 Claude Code 中输入/re-ios确认已加载。
附带文件references/commands.mdreferences/gotchas.md
详细介绍
来自项目 READMEiOS 应用分析
何时使用 / 何时不用
- 用:拿到 IPA / 已安装 iOS 应用,需要看 Mach-O 结构、OC 类结构、代码签名、越狱环境动态分析
- 用:App Store 加密二进制需要脱壳
- 不用:目标只是 Mach-O 结构 / load commands(直接走 [[re-format-macho]])
- 不用:需要运行时 hook / 绕过(走 [[re-frida]])
- 不用:无越狱、无受管设备时的动态分析场景(静态先行,动态受限说明见坑 3)
工具准备
静态分析(解包 / class-dump / otool)可免沙箱;动态(越狱设备 / 模拟器 / 受管设备)按 [[re-analyze/platform-tips]] 最高原则在受控环境执行。
unzip / zipinfo —— ipa 解包
- Linux:
apt install unzip/dnf install unzip/pacman -S unzip - macOS: 自带 /usr/bin/unzip;Windows/WSL: WSL 内 Linux 版
- 验证:
unzip -v
class-dump —— OC 头文件导出
- macOS: 官方仓库 nygard/class-dump 最新 release 3.4 仅源码无预编译二进制——源码构建(xcodebuild)使用;
brew install class-dump公式已从 homebrew-core 下架(2026 实测 formulae.brew.sh 无此公式),不再可用 - 替代: class-dump-swift(mxms0/class-dump-swift)同样支持 OC 与 Swift 类/方法导出,源码构建(依赖 LLVM + make,非 Swift 工具链)——Swift 目标优先用它
- Linux/Windows: 无官方版;用 class-dump-swift 源码编译(依赖 LLVM + make,非 Swift 工具链),或在 macOS 虚拟机 / 远程 macOS 上执行
- 验证:
class-dump --help(输出 usage 即可)
otool —— Mach-O 结构 / 符号查看(Apple 自带)
- macOS:
xcode-select --install(Xcode Command Line Tools) - Linux 替代:
llvm-otool(apt install llvm/brew install llvm) - 验证:
otool -h /bin/ls
idevice 工具链(libimobiledevice)—— 设备识别 / 信息
- macOS:
brew install libimobiledevice(含 idevice_id / ideviceinfo / ideviceinstaller) - Linux:
apt install libimobiledevice-utils(Debian/Ubuntu);Arch:pacman -S libimobiledevice - 验证:
idevice_id -l列出已连接设备 UDID;ideviceinfo输出设备型号/iOS 版本/UDID
越狱环境(可选)
- 越狱工具:unc0ver / checkra1n / palera1n(按设备型号与 iOS 版本选择),越狱后安装 OpenSSH + 包管理器(Sileo / Cydia)
- 验证:
ssh root@<设备IP>能登录 - 未越狱但需真机:Apple 开发者账号签名安装(免费账号签名 7 天有效,见坑 2);越狱环境专项(tweak 开发/越狱检测)见 [[re-ios-jb]]
iOS FairPlay 解密 / 脱壳(backend 按环境选择)
App Store 加密应用的解密后端按目标 iOS 与越狱版本选择已适配当前 Frida API 的维护实现,没有跨版本通用的单一工具。
- 前置:越狱设备 + frida-server(见 [[re-frida]] 工具准备)+ usbmuxd 转发
- 选型:先
frida --version与设备 frida-server 版本对齐,再选与该 Frida 世代兼容的 dumper。Frida 17 起移除了静态Module查找/枚举 API(见 [[re-frida]] 常见坑),仍依赖这些旧 API 的 dumper 在 Frida 17 下直接报错 - legacy / 参考实现:
AloneMonkey/frida-ios-dump的 Frida agent 使用Module.ensureInitialized、静态Memory.read*、Module.findExportByName(null, …)、Process.enumerateModulesSync——这些 API 在 Frida 17 已移除,该仓库更适合作为脱壳算法与 Mach-O 重组逻辑的参考;直接使用需搭配 Frida 16 及以下的 frida-server,或自行按新版 API 移植 - 另一路线:基于
mremap_encrypted的实现(UnFairPlay / unfaird 一类),不依赖 frida 运行时插桩,按目标 iOS 版本评估可用性 - 设备通道:macOS
brew install libusbmuxd(原 usbmuxd 公式已改名);Linuxapt install usbmuxd(Debian/Ubuntu,含 iproxy);Archpacman -S libusbmuxd - 验证:
iproxy -h(转发工具可用性);选定 dumper 按其自身-h输出确认参数
操作步骤
按顺序执行,每步记下结果(证据路径 + sha256,见 [[re-triage]])。
-
ipa 解包与签名检查:
unzip app.ipa -d app/ file app/Payload/*.app/* # 确认主二进制是 arm64 Mach-O codesign -dv app/Payload/*.app/ 2>&1 # 签名类型(Apple Distribution / Development / adhoc) otool -l app/Payload/*.app/ | grep -B1 -A4 LC_ENCRYPTION_INFO # 查 cryptidcryptid 1= App Store 加密,磁盘上代码是密文,先脱壳(步骤 5)再继续。- 包结构速览:
Payload/<App>.app/是主二进制与资源;SwiftSupport/是系统 Swift 库(模拟器包常见);embedded.mobileprovision是签名描述文件(macOS 上security cms -D -i可读 entitlement 与过期时间) file确认主二进制是 arm64/arm64e 真机架构——x86_64 模拟器产物无动态分析价值,直接跳过
- 包结构速览:
-
class-dump 头文件:
class-dump -H app/Payload/*.app/ -o headers/类名 / 方法名 / 属性即大部分业务接口,先看 headers 再进反编译。加密二进制先脱壳(步骤 5)再 dump,否则只得到壳的类。Swift 方法不进 OC 头文件(见坑 4)。
-
二进制走 [[re-format-macho]]:
otool -h app/Payload/*.app/ # 架构 / cputype otool -L app/Payload/*.app/ # 依赖 dylib(framework 清单)结构、load commands、入口、段、签名按 [[re-format-macho]] 步骤执行;Swift 二进制用
strings -n 6找符号与错误消息辅助定位。 -
越狱环境动态调试:
iproxy 2222 22 & # usbmuxd 转发设备 ssh 到本机 2222 ssh -p 2222 [email protected] # 登录越狱设备设备上启动目标 App;断点 / 单步调试经 debugserver + lldb(见 [[re-lldb]]);hook / 绕过优先 [[re-frida]](frida-server 安装见该技能)。
-
脱壳(FairPlay 解密):
frida --version # 主机 Frida 世代——选 dumper 前先定 iproxy 2222 22 & <选定 dumper> <BundleID 或 App 名> # 按目标 iOS / Frida 版本选维护实现,拉取并解密 file <输出>.ipa otool -l <输出>/Payload/*.app/ | grep -A4 LC_ENCRYPTION_INFO # 确认 cryptid 0思路:从已解密的内存镜像读取 Mach-O 头与段,重组为解密 ipa。dumper 必须与主机
frida --version及设备 frida-server 的世代匹配(见工具准备);脱壳产物回到步骤 1-3 复跑。
跨域联合
- [[re-mobile]]:工作流第 2 步(iOS 分支)固定调用本技能
- 二进制解析 → [[re-format-macho]];断点调试 → [[re-lldb]];插桩 / 绕过 / 脱壳执行 → [[re-frida]]
- 本技能被 [[re-analyze]] 的 triage「移动 App 分析」路径调用(re-mobile → re-ios)
- 桌面 macOS 生态(签名/entitlements/Secure Enclave)→ [[re-macos]]
- Swift 层分析(mangling/witness table)→ [[re-swift]]
- 越狱环境专项(tweak 分析与开发、越狱检测识别绕过)→ [[re-ios-jb]]
常见坑与陷阱
- App Store 加密二进制直接分析:现象——class-dump 无输出 / otool 结构残缺、反编译只见壳;原因——
cryptid 1加密,磁盘上的代码是密文;对策——步骤 1 先查 LC_ENCRYPTION_INFO,加密先按步骤 5 脱壳 - 签名失效无法安装:现象——重打包 / 修改后真机安装报"无法验证 App"或无法安装;原因——签名与内容不一致,或免费证书 7 天过期;对策——
codesign -f -s -adhoc 重签(仅自签场景)或重新用开发者证书签名;免费账号到期重新安装 - 无越狱 → 动态分析受限:现象——没有越狱设备,脱壳 / lldb attach / frida 全不可用;原因——iOS 沙盒与签名强制限制动态调试;对策——静态分析先行(步骤 1-3),动态转模拟器(需不加密应用)或受管设备(Apple Configurator 部署 + 开发证书),实在不行只做静态
- Swift 方法不进 class-dump 头:现象——类头文件里找不到业务方法;原因——Swift 不导出 OC 运行时元数据;对策——
strings/swift-demangle找符号,逻辑分析靠 [[re-format-macho]] + 反编译([[re-binary-core]]) - class-dump 对 arm64e 二进制报错:现象——class-dump 崩溃或输出为空;原因——arm64e 指针签名(PAC)干扰元数据遍历;对策——换新版 class-dump / class-dump-swift,或先脱壳再 dump
- 拿到模拟器产物当真机分析:现象——
file显示主二进制是 x86_64,动态分析全不可用;原因——分发方给了模拟器包(常带 SwiftSupport/);对策——步骤 1 用file确认 arm64/arm64e 真机架构,模拟器产物跳过 - class-dump 装不上(brew 公式下架):现象——
brew install class-dump报 No available formula;原因——homebrew-core 已移除该公式(2026 实测);对策——nygard/class-dump 源码构建,或换 class-dump-swift(见工具准备)