用 REA 静态解剖 iOS 应用:从 IPA 认证清单到 Mach-O 加载追踪的完整工作流
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
你手里只有一个 IPA(Apple 的应用分发封装格式),解出的文件树回答不了完整性、bundle(应用容器)归属、启动依赖这三个问题。REA 是面向 AI Agent 的静态逆向工具。从认证清单到动态库加载追踪,这条链路不运行目标应用的一行代码。
生成带哈希指纹的认证清单
文件树只记路径,不记完整性。IPA 静态分析的第一步,是产出一条带哈希指纹的证据记录;后面每个结论都能回指到某条具体哈希。
inspect_artifact对 IPA / DMG / ZIP /.app目录执行库存操作(工具名inspect_artifact),输入就是目标文件本身。产出inventory_artifact证据,关键字段:
| 字段 | 记录内容 |
|---|---|
root_sha256/root_format | 根文件哈希与格式(ipa等) |
nodes | 各组件格式、架构、可执行位 |
occurrences | 路径、大小、校验状态 |
limitations | 无法核实的条目,不悄悄丢弃 |
校验状态以verified这类值落进occurrences。这份清单只记录观察事实,不解释 plist 或签名语义。
把文件树投影成 bundle 结构图谱
投影回答的是树怎么组织的。路径和哈希在这里变成一张带解剖信息的应用结构图,每个结论都能落到精确路径。实现见 AppleApplicationService.ts,工具契约见 applicationToolContracts.ts。
rea project-apple-application-graph '{"inventory_evidence":[<inventory_artifact Evidence>]}'参数只有一个:把上一阶段的证据填进inventory_evidence数组。这是一次无执行投影。应用根按库存类型识别:
- IPA:每个
Payload/<Name>.app各是一个根 .app目录:被库存的目录本身- 含应用的目录 / ZIP / DMG:最外层
<Name>.app(后接Contents/)
DMG 的清单路径形如<image>.dmg/<Volume>/<Name>.app;只有根身份、缺子卷清单时,结果标为partial。其他格式(如 APK、ASAR)直接拒为输入错误。
bundles部分列出每个应用根及其全部嵌套 bundle,布局分三类:
| 布局 | 判定 |
|---|---|
macos-deep | 含Contents/的 macOS 应用 |
versioned-framework | 含Versions/,按真实版本目录分析 |
shallow | 无上述结构,典型 iOS 应用形态 |
同字段还有parent_path、info_plist_path、executable_candidates、signing_paths。含Contents/的根判为macos,浅层 bundle 凭根Info.plist判为ios。这就是 bundle 结构分析的完整产出。
按 dyld 规则追踪动态库加载
加载追踪回答每条依赖最终命中哪个文件。清单管"有什么",这里管"怎么加载"。模拟用 dyld(macOS 动态链接加载器)的解析规则完成,是 iOS 应用逆向链路里最硬的一段。
rea trace-dylib-resolution MyApp.app --json可加--root指定进程根、--architecture锁定架构。Mach-O(Apple 平台二进制格式)与 FAT 头的解析用纯 TypeScript 完成,不依赖 Apple 工具,非 macOS 系统上同样能跑。bundle 内每个可执行文件——主程序、XPC 服务、扩展、登录项、助手——都是独立进程根,各带自己的@executable_path。
解析模拟了 dyld 搜索链:@executable_path、@loader_path、@rpath逐级展开,符号链接在根内跟随,x86_64h进程可加载x86_64。每条依赖边列出全部候选路径及结果(resolved/absent/architecture-missing/escapes-target等),边级判定分四级:
| 状态 | 含义 |
|---|---|
resolved | 根内有一个镜像成功加载 |
conditional | 根内可解析,根外更早候选可能优先 |
unresolved | 根内候选确定缺失或不可用 |
undetermined | 候选在根外或依赖运行环境 |
想核对实际加载顺序,可把可执行文件交给反汇编引擎看汇编:
角色归类:启动项与提权入口
嵌套组件不用逐个目录翻。投影按路径约定自动归角色(role_basis: "path-convention"),随应用启动的组件与提权点变成一份可读清单。分类随投影命令一起返回:
rea project-apple-application-graph '{"inventory_evidence":[<inventory_artifact Evidence>]}'| 角色 | 路径惯例 | 说明 |
|---|---|---|
app-extension | *.appex | 应用扩展 |
xpc-service | *.xpc | XPC 服务 |
framework | *.framework | 框架 |
system-extension | *.systemextension | 系统扩展 |
login-item | LoginItems/*.app | 登录项 |
| 特权助手 | LaunchServices/ | SMJobBless 助手 |
排查"应用还悄悄装了什么",先看login-item与特权助手两行。这也是 iOS 应用逆向里找隐藏组件的常用入口。
边界与二次核实
路径与哈希类结论可直接采信:格式、布局、角色、加载判定状态。涉及 plist 字段或签名声明的内容,投影一概不读,必须二次核实:
CFBundleExecutable、URL Scheme、权限描述:对info_plist_path用inspect_plist- 可执行候选的签名声明:用
inspect_signature核查
还有几个透明边界:
- AppleDouble 侧车文件(
._*、__MACOSX/)是清单事实,但排除在角色与解剖之外 - 桥接假设序列化上限 2 MiB,超出携带
bridge_candidate_coverage并降级为partial - 目录型库存即使名为
.app也视为独立根;DMG 子卷依赖原生 macOS 挂载适配器
这套 iOS 应用逆向链路输出的是观察事实,不是语义解释。任何"应用声明了某权限"或"签名包含某 entitlement"的表述,都必须回到
inspect_plist/inspect_signature的结果上复核。
落地速查
四步链路按表查。
| 操作 / 命令 | 输入 | 得到什么 |
|---|---|---|
库存操作(inspect_artifact) | IPA / DMG /.app | 带哈希的证据记录 |
rea project-apple-application-graph | inventory_artifact证据 | 应用根 +bundles解剖 |
rea trace-dylib-resolution | .app或 Mach-O 文件 | dyld 加载解析图 |
inspect_plist/inspect_signature | plist 路径 / 可执行候选 | plist 字段 + 签名声明 |
完整语义与状态表见 docs/apple-application-analysis.md;首次使用按 docs/installation.md 完成安装与 Provider 配置。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考