如何完整解析 iOS 应用结构与动态库加载链路

发布时间:2026/11/4 2:06:58
如何完整解析 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-artifactIPA / DMG / ZIP /.app目录带哈希指纹的库存证据
rea project-apple-application-graphinventory_artifact证据应用根、bundle 解剖、桥接假设
rea trace-dylib-resolution.app或 Mach-O 可执行dyld 解析图与未决发现
inspect_plist/inspect_signatureinfo_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),仅供参考