如何完整解析 iOS 应用结构与动态库加载链路
如何完整解析 iOS 应用结构与动态库加载链路
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
交付物常常只有一个 IPA(Apple 应用分发封装格式):里面有什么、哪些组件会随应用启动、每条动态库加载最终命中哪个文件?REA 是一款面向 AI Agent 的逆向工程工具,能把 IPA 库存、bundle 结构投影、Mach-O 动态库加载追踪三段链路全程静态跑通,不运行目标应用的一行代码。
核心概念
解包 IPA 后你拿到的文件树只记录路径,不记录完整性,所以 REA 的设计是"证据先行":先对 IPA、DMG、ZIP 或.app目录做库存操作,产出一条带哈希指纹的inventory_artifact证据记录;再把这条证据投影成应用结构图。因为投影是无执行的静态解析,不触碰 plist 与签名语义,所以每个结论都能回指到清单里某条具体的 SHA-256 哈希,也不会产生运行应用的副作用。
加载链路部分则回答"dylib 依赖最终命中哪个文件"。REA 用纯 TypeScript 解析 Mach-O 与 FAT 头及加载命令,静态模拟 dyld(macOS 动态链接加载器)的搜索规则:@executable_path、@loader_path、@rpath搜索链、符号链接跟随、分级架构兼容。因为不依赖 Apple 工具、不执行任何代码,所以 Linux 上也能跑。实现位于 AppleApplicationService.ts,工具契约定义在 applicationToolContracts.ts。
工作流
三步按执行顺序推进,前一步的输出是后一步的输入。
1. 清单构建
rea inspect-artifact MyApp.ipa --json这条命令为 IPA 内每个组件建立格式、架构、可执行位与内容状态的记录。输出里最该看两个字段:root_sha256是根文件指纹,用来确认分析对象版本;limitations列出无法核实的条目,未被静默丢弃。
2. 结构投影
rea project-apple-application-graph '{"inventory_evidence":[<inventory_artifact Evidence>]}'把上一步的证据回传,文件树变成带精确路径、内容哈希与 bundle 解剖信息的结构图。最该看bundles部分:每个应用根与嵌套组件的info_plist_path、executable_candidates、signing_paths三件套。应用根按规则识别:IPA 中每个Payload/<Name>.app各是一个根;含应用的目录、ZIP、DMG 取每个最外层<Name>.app。
3. 加载链路追踪
rea trace-dylib-resolution MyApp.app --json这条命令为每条依赖边列出所有尝试过的候选路径及其结果。bundle 内每个可执行文件——主程序、XPC 服务、扩展、登录项、助手——都是独立进程根,拥有各自的@executable_path,你直接读哪条候选是缺失的即可。
输出解读
下面两张表分别回答"布局如何识别"与"加载状态如何读"。
| layout 取值 | 识别规则 | 典型形态 |
|---|---|---|
macos-deep | 含Contents/ | macOS 应用,可执行文件在Contents/MacOS/ |
versioned-framework | 含Versions/ | framework,按真实版本目录分析 |
shallow | 均不含 | 典型 iOS 应用,凭Info.plist判ios |
嵌套组件还会按路径惯例自动归类角色:*.appex是应用扩展,*.xpc是 XPC 服务,*.framework是框架,*.systemextension是系统扩展,Contents/Library/LoginItems/是登录项,Contents/Library/LaunchServices/是特权助手。因为登录项和特权助手是提权入口的高频藏身处,所以排查"应用还悄悄装了什么"时优先看这两类角色。
| 加载状态 | 含义 |
|---|---|
resolved | 根内有一个镜像成功加载 |
conditional | 根内可解析,但更早的根外候选可能优先 |
unresolved | 根内所有候选确定缺失或不可用 |
undetermined | 候选位于根外或依赖运行环境,无法定论 |
候选路径级别的结论还包括absent(不存在)、architecture-missing(缺对应架构)、escapes-target(越出分析根)等,它们只描述单个搜索路径,最终判定看边的resolution.status。
边界与核实
⚠️ 这套链路输出的是观察事实,不是语义解释,涉及声明性内容的结论必须二次核实。
投影不读 plist 语义。CFBundleExecutable、URL Scheme、权限描述等字段要对 bundle 的info_plist_path用inspect_plist复核;签名声明用inspect_signature核查可执行候选。其余已知边界:
- AppleDouble 侧车文件(
._*、__MACOSX/)是清单事实,但自动排除在 bundle 角色与解剖组件之外; - 桥接假设最多序列化 2 MiB,超出时覆盖度降级为
partial,省略数量记在bridge_candidate_coverage; - DMG 子卷清单依赖 macOS 原生挂载适配器;若只有 DMG 根身份,投影标记
partial且缺失状态未知; - APK、ASAR 等其他格式会被直接拒为输入错误。
速查表
| 命令 / 工具 | 输入 | 产出 |
|---|---|---|
rea inspect-artifact | IPA / DMG / ZIP /.app目录 | 带哈希指纹的库存证据 |
rea project-apple-application-graph | inventory_artifact证据 | 应用根、bundle 解剖、桥接假设 |
rea trace-dylib-resolution | .app或 Mach-O 可执行 | dyld 解析图与未决发现 |
inspect_plist/inspect_signature | info_plist_path/ 可执行候选 | 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),仅供参考