面向自有或明确获授权 App 的、本地优先、可审计的 iOS 二进制导出与验证工具链。
状态:执行中的 pre-alpha 蓝图 日期:2026-07-22
Important
本文件说明产品方向、技术边界和版本发布门槛。可执行步骤的权威顺序、当前 状态、Issue/PR 定位和“完成后才能进入下一步”的门禁,以 串行执行计划为准。任何只存在于聊天或未合并 分支中的计划都不生效。
当前实现快照:项目治理和安全政策、Rust Host CLI、首方 DemoLab fixture、bounded Mach-O parser、仅限库内的有界只读 IPA Archive 预检、Stored/Deflate Entry 内存/流式读取、根 App 与约定嵌套 Framework/Extension 的 XML/Binary Info.plist 事件流身份和声明可执行 Entry 解析、通过匿名临时文件完成的声明主程序 Mach-O 结构检查、合并精确声明与范围内小写 dylib 且必须通过 Mach-O 解析的声明标准 Bundle 确定性清单、自动清理且防 Symlink/Path Escape 的私有有界 IPA 工作树、从该工作树生成字节级可重复且未签名分析 IPA 的库内 Packager,以及把源/输出 Archive SHA-256、Canonical 清单摘要、排除项、打包政策、逐 Code Hash 和全部 Mach-O Slice 绑定到 Version-3 Manifest 的无设备 Builder,连同 oprobe inspect、capability/error/export 三类带版本的 pre-v1 JSON 契约、有界 Host/Helper 协议规范和相应对抗测试已落地并由必需 CI 覆盖。工作树与 Packager 均排除 Receipt/SC_Info;Packager 会归一化 Metadata、执行最终有界预检并自动清理临时产物;Manifest Builder 则强制逐二进制结果保持 inconclusive,绝不把 Hash 相等冒充明文。该清单明确不覆盖任意嵌套 App、Watch/App Clip、未支持 Bundle 类型或看似可执行的普通资源;设备发现、真机 Helper、transport、导出后端、Mach-O 重建、产物原子发布与 oprobe decrypt 仍未实现,也没有任何正式设备兼容性声明。
不要再做一个 frida-ios-dump 的翻版。旧路线的主要问题不是少几个参数,而是依赖启动或附加目标 App,容易受到 target SDK、RASP、反调试、Frida 版本和越狱环境变化影响。
项目应抢占的新位置是:
自动选择导出后端、USB 优先、结果逐文件验证、失败原因可诊断、输出过程可审计。
成功标准不是“偶尔能生成 IPA”,而是用户能在十分钟内知道:
- 当前设备和目标是否受支持;
- 工具选择了哪个后端;
- 主程序、Framework、dylib、Extension 分别是否完成;
- 哪个文件仍然加密或被跳过,以及原因;
- 输出的来源、哈希和签名状态。
维护者只为以下场景设计、测试和提供支持:
- 开发者本人或所属团队拥有的 App;
- 获得 App 所有者或其有权代表书面授权的移动安全测试;
- 项目自建 DemoLab 和研究教学;
项目不实现或维护:
- 搜索、下载、托管或分享未经授权的第三方解密 IPA;
- Apple ID 登录、自动购买或批量抓取 App Store 内容;
- 内购、订阅、许可证、反作弊或账号限制绕过;
- 提供或执行越狱、内核漏洞利用、PAC/PPL 绕过或针对具体商业 App 的反保护绕过;
- 重签、安装、功能修改和“一键分发”;
- Keychain、Documents、Cookie、数据库等数据容器导出;
- 云端代导出服务。
真实设备操作前显示简短授权确认;CI 可显式传入 --accept-authorized-use。这只能提醒使用者,不能证明授权或确保某项分析在其法域合法。项目默认无遥测,不上传 IPA、日志或设备信息。
上述内容是项目范围、维护政策与安全提示,不是 Apache-2.0 的附加许可条件。拥有 App、设备或测试授权也不当然意味着可以规避任何技术措施;使用者仍须自行遵守适用法律、合同和平台条款。本文件不构成法律意见。
截至 2026-07-21:
| 项目 | 现状 | 我们应吸收/避开的点 |
|---|---|---|
| frida-ios-dump | 历史用户多,但核心多年未更新 | 吸收一条命令的心智;避开 Python/手动 SSH/强依赖运行目标 |
| dumpdecrypted | 经典内存覆盖思路,代码和平台均老 | 只研究原理;仓库未声明许可证,不复制源码 |
| bagbak | UX 较好、支持多类二进制,但作者已将运行时附加路线标记为 deprecated | 吸收模式设计;Frida 只做 fallback |
| TrollDecrypt | 活跃的设备端 GUI | 证明现代设备端体验有需求;仓库未声明许可证,不复制源码 |
| ipadecrypt | 当前最直接的端到端 CLI 竞品 | 必须在 USB、诊断、验证、无凭据和集成能力上明显更好 |
| flexdecrypt | 奠定不完整运行目标 App 的方向,但实现面向旧环境 | 以能力探测封装相关路径,不承诺所有系统版本 |
待验证的项目假设是:历史高关注项目普遍老化,而现代活跃项目仍未形成兼容矩阵清晰、工程质量稳定的事实标准。公开 beta 前通过用户访谈、Issue 和可复现兼容报告验证该假设。
工作名:OrchardProbe
CLI:oprobe
一句话英文定位:
Local-first, auditable Mach-O decryption and app export from explicitly supported jailbroken iOS devices, for binaries you are legally authorized to analyze.
首版命令面:
oprobe decrypt <input.ipa> [--output <output.ipa>] [--json]
oprobe doctor [--json]
oprobe inspect <macho> [--json]
oprobe devices [--json]
oprobe apps [--json]
oprobe verify <ipa-or-app> [--json]
oprobe demo
其中 verify <ipa-or-app> 是未来产物验证接口;当前 pre-alpha 只实现
verify <manifest.json>,两者不能混为已经可用的同一命令。
关键体验:
- 正常用户只运行
oprobe decrypt MyApp.ipa,默认得到MyApp.decrypted.ipa和MyApp.decrypted.manifest.json。 - 输入 IPA 作为不可变本地重建模板;工具自动匹配受支持设备上已经安装的同一构建。输入文件本身不能替代授权设备端代码证据。
decrypt自动执行 Doctor、设备/构建匹配、后端选择、逐 Mach-O 重建、验证和原子打包;devices/apps只用于诊断。- 输出为未重签、仅供分析的 IPA/Bundle 与独立
manifest.json;嵌入签名可能仍存在但已经失效。 oprobe verify逐个 Mach-O 报告证据等级,不用cryptid == 0或“生成 ZIP 成功”冒充明文字节已验证。oprobe demo无需设备,使用项目自建 fixture 展示解析、重建和验证流程。
采用可插拔后端。Sprint 0 先对两个候选做 go/no-go 验证,再决定 MVP 默认项:
- 候选 A
suspended-spawn:只让系统完成必要的早期映射,不要求 App 完整运行。 - 候选 B
mapped-file:在确认系统、权限和目标格式受支持时使用映射解密路径。 - 后续候选
frida-runtime:仅作为兼容回退,在其他后端不可用且目标能够安全启动时评估。
可行性和优先级不能仅由 iOS 版本硬编码,应由 helper 返回的 capability handshake、SoC、页大小、entitlements、rootless/rootful 状态和目标格式共同决定。Sprint 0 必须验证:在不修改、重签或重装目标 App 的前提下,是否能取得所需能力并只读取精确的目标代码区间;若不能,缩减或调整 MVP,而不是维持未经证明的承诺。
首版不实现多个后端。MVP 只打通一个经过实机验证的现代后端,但协议从第一天允许增加 adapter。
- Host CLI:Rust,先支持 Apple Silicon macOS;后续评估 Intel macOS、Linux 和 Windows。
- Device helper:Objective-C/C,仅申请经 spike 证明的最小必要权限与 entitlements,并保持短生命周期。
- Frida adapter:TypeScript,仅作可选依赖。
- Host/device 协议:版本化、长度前缀消息;只开放目标枚举、受限代码区间读取,以及所选 bundle 根目录内经过 canonical path、symlink、文件数量与总大小限制的文件流,不开放任意 shell、任意路径、任意 PID 或任意内存 RPC。
- 连接:MVP 采用 usbmuxd 转发的 USB tunnel 和受限自定义协议;SSH 仅作开发期后备,helper 不监听局域网公网地址。helper 的安装和启动方式由 Sprint 0 根据首个实测环境写入兼容文档。
flowchart LR
IPA["授权输入 IPA"] --> Ingest["有界 Archive Ingest"]
Ingest --> Inventory["Bundle / Mach-O Inventory"]
Inventory --> CLI
CLI["Rust CLI"] --> Policy["授权与范围策略"]
Policy --> Doctor["Doctor / 能力探测"]
Doctor --> Router["Backend Router"]
Router --> Spawn["Suspended-spawn adapter"]
Router --> Map["Mapped-file adapter"]
Router --> Frida["Frida fallback"]
Spawn --> Helper["最小必要权限设备 Helper"]
Map --> Helper
Frida --> Helper
Helper --> Stream["受限代码区间流"]
Helper --> Bundle["受控 Bundle 文件流"]
Stream --> Rebuild["Mach-O 精确重建"]
Bundle --> Pack["Bundle / IPA 打包"]
Rebuild --> Pack["Bundle / IPA 打包"]
Pack --> Verify["逐二进制验证 + Manifest"]
Verify --> Output["*.decrypted.ipa + Manifest"]
核心模块:
ingest:把 IPA 当作不可信 Archive,在物化前执行 Entry、路径、链接、压缩比、文件数量和总大小限制;源 IPA 永远不原地修改。doctor:设备、iOS、SoC、页大小、rootless/rootful、可用权限、依赖和磁盘空间。transport:USB tunnel、开发期 SSH fallback、断线重连、chunked streaming。catalog:从输入 IPA 建立主程序、Framework、dylib、Extension 清单,并将其唯一匹配到设备上的同一已安装构建。macho:安全解析 load commands,只替换明确标记的代码区间,不覆盖已发生 relocation/PAC fixup 的其他内存页。collector:只复制.appbundle,阻止路径穿越和 symlink escape,默认剔除 receipt、SC_Info和数据容器。packager:确定性 ZIP、保持相对路径和权限,不重签、不安装。verifier:逐 slice/二进制报告四级证据:metadata 状态、结构完整性、后端读写区间哈希一致性,以及仅对自有 fixture 可用的已知明文预期。没有明文 oracle 时必须输出inconclusive,不能把cryptid == 0当作完整证明。report:v1 前使用显式版本号且允许演进的 JSON schema;后续支持 SARIF/HTML 和企业流水线。签名信息拆成互不混淆的字段:presence(absent/present/unknown)、kind(如cms/ad_hoc/unknown/not_applicable)和validation(valid/invalid/not_checked/not_applicable)。
orchardprobe/
├── crates/
│ ├── cli/
│ ├── core/
│ ├── macho/
│ ├── archive/
│ ├── protocol/
│ └── report/
├── device/
│ ├── helper/
│ └── adapters/
├── fixtures/
│ └── DemoLab/
├── docs/
│ ├── architecture/
│ ├── compatibility/
│ ├── security/
│ └── troubleshooting/
├── schemas/
└── .github/
MVP 只承诺:
- Apple Silicon macOS host;
- 一种明确记录的越狱/设备组合;
oprobe decrypt <input.ipa>一条命令的成功路径;输入 IPA 与设备上已经安装的同一构建必须唯一匹配;- 首个实测设备的 native slice;arm64e/A12+ 只有通过独立实机验证后才加入支持矩阵;
- 主可执行文件;如果 Framework/Extension 未完成,manifest 必须明确标记;
- USB 连接、结构化日志、输出哈希、验证报告;
- 未重签、仅供静态分析的 IPA/Bundle;原签名可能存在但失效。
MVP 不承诺:
- “支持所有 iOS 版本/所有越狱”;
- Stock iPhone 上处理生产签名的普通 App Store App;
- Universal IPA、ODR、Watch App、App Clip;
- 自动下载、重签、安装或绕过应用自带保护;
- 远程服务和 GUI。
本节保留里程碑视角,不直接驱动开发顺序。实际工作必须逐项遵守
串行执行计划,同一时间最多只能有一个
active 步骤。
- 固化
RFC-0001 Scope and Threat Model。 - 建立 Apache-2.0、
LEGAL.md、ACCEPTABLE_USE.md、SECURITY.md。 - 创建 DemoLab:Swift 主程序 + Objective-C 动态 Framework + Extension。
- 定义 capability、export manifest、error code 三个带版本、边界明确且由 Rust/CI 验证的 JSON schema。
- 固化
RFC-0002有界 Host/Helper 协议、状态机、资源上限与 No-Go 条件;该 RFC 不实现 transport、Helper 或设备后端。 - 用一台目标设备分别验证候选后端,在不修改或重装目标 App 的前提下能否取得所需能力并读出精确代码区间。
- 退出条件:能对自有 fixture 生成可重复的字节级真机验证结果;若声称受保护到明文的能力,fixture 必须确实处于有独立证据的相应初始保护状态,普通未加密开发构建不能满足该声明。
- 一条命令的
oprobe decrypt <input.ipa>用户流程,以及用于排错的doctor/devices/apps。 - USB transport 与最小 helper。
- 单一后端处理主程序。
- Host 端 Mach-O 重建、打包和
verify。 - 原子输出、断线处理、JSON 日志、隐私脱敏。
- 发布
v0.1.0-alpha,只邀请 10–20 名授权测试者。
- Framework/dylib 递归识别与逐文件状态。
- Extension 按独立进程处理;不能启动时明确 skipped。
- 第二后端或 Frida fallback。
- Homebrew tap、shell completion、签名制品、SHA-256、SBOM。
- 公开兼容矩阵和双语文档。
- 断点恢复、批处理、带 schema 版本且仍可演进的 JSON API。
- library/JSON-RPC 集成接口。
- Mach-O、plist、ZIP、RPC fuzzing。
- 自托管真机矩阵;fork PR 永不接触设备凭据或高权限 runner。
- 协议和 manifest schema 稳定。
- 安全审查、兼容性报告、迁移说明和维护者流程。
- 至少两名能评审 Release 的维护者。
- 只有 Quick Start 中位时间不超过 10 分钟、支持矩阵通过率不低于 90% 时才发布 v1.0。
- 单元测试:Mach-O 边界、异常 load command、整数溢出、不同页大小、FAT/thin、UTF-8 路径。
- 合成 fixture:仓库只提交自行生成的“磁盘区间 + 预期区间”样本,不提交第三方二进制。
- Fuzz:Mach-O、plist、ZIP 和 RPC;重点覆盖 Zip Slip、symlink escape、解压炸弹、长度欺骗。
- 故障注入:拔线、进程提前退出、短读、低磁盘、helper 重启、Extension 无法启动。
- 实机矩阵:每个 Release 发布具体设备/iOS/SoC/环境/commit 的验证记录,不使用“理论支持”冒充“实测支持”。
- 真机 CI:专用设备和账号;不得上传 IPA、receipt、原始 UDID 或未脱敏日志。
README 默认英文,完整提供 README.zh-CN.md。首屏依次展示:
- 一句话定位与 Authorized use only;
- 安装命令与
oprobe decrypt DemoLab.ipa的一条命令 Quick Start; oprobe demo;- 30–45 秒终端 GIF;
- 真实支持矩阵;
- 输出 manifest 示例;
- 架构、隐私、威胁模型和非目标。
仓库首发即具备:
- README、Apache-2.0、Contributing、Code of Conduct、Security Policy;
- Issue Forms、PR 模板、Discussions、Private Vulnerability Reporting;
- 10–15 个已拆小的
good first issue; - 分支保护、最小 Actions 权限、依赖锁定、CodeQL/静态分析;
- 签名 tag、checksums、SBOM 和 artifact attestation;
CITATION.cff、架构 ADR、带版本的错误码和 troubleshooting 文档。
公开发布前先完成闭门 alpha,不宣传空仓库。公开 beta 所需素材:
- 30–45 秒终端 GIF;
- 3 分钟从 DemoLab 到验证报告的视频;
- 一篇技术文章:为何 iOS 授权二进制导出需要可审计、可复现;
- 一篇架构与威胁模型文章;
- 真实兼容矩阵和失败案例。
Star 不是北极星指标。以下是 90 天目标,不是对外承诺;首次成功率只统计支持矩阵内、版本有效且授权明确的测试:
- 首次成功率至少 90%;
- 首次成功中位时间不超过 10 分钟;
- 15 个以上真实验证组合;
- 15 名以上外部贡献者、5 名以上重复贡献者;
- 30 个以上外部合并 PR;
- 90% 的 Issue 在 48 小时内得到首次响应;
- Release asset 下载量达到 1,500。
Release 下载量包含机器人和重复下载,只作趋势信号。Stars 可设 1,000 为 target、3,000 为 stretch,但不买星、不互刷、不以 Star 换福利。
主要风险:
- iOS、Frida 和越狱环境快速漂移;用能力探测、后端隔离和机器可读兼容矩阵控制。
- arm64e/PPL 和目标格式变化导致部分组合不可行;必须诚实失败,不承诺“全版本”。
- 输出被误认为可直接安装;每次输出都标记签名状态,项目不提供 signer/installer。
- 具备特殊 entitlements 或高权限的 helper 变成攻击面;禁止 shell、任意路径/PID/内存接口,发布版默认只经 USB tunnel 且保持短生命周期;开发期 SSH fallback 必须显式启用并与发布配置隔离。Spike 后公开准确的 entitlement 与威胁模型。
- 恶意 IPA 攻击 Host;复杂解析放在内存安全语言中并持续 fuzz。
- 许可证污染;未明确许可的旧项目只做行为研究,禁止复制其代码,采用独立实现并在 ADR 中记录来源和贡献者声明;除非建立了真正隔离的流程,否则不宣称 clean-room。
- 法律与声誉;只用 DemoLab 展示,不出现商业 App 名称、图标、IPA 或商店截图。
公开仓库当前处于 foundation/pre-alpha 阶段。下一步不再由本节的静态清单决定,
而是以串行执行计划中第一个可激活的 planned
条目为准。该条目必须先经过计划激活 PR;当前步骤未完成时,不得启动下一步。
OrchardProbe 目前仅是工作名。除本仓库外,GitHub 仓库搜索未发现明显同名项目,但这不等于商标许可;仍需检查 organization、crates.io、Homebrew、npm/PyPI、域名和相关商标。当前公开仓库为 jacklv-coder/OrchardProbe,本地已初始化 Git 并连接 origin/main。