IPA 结构分析实战:用 REA 静态分析四步看清启动项与 dylib 加载链
【免费下载链接】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 的逆向工程工具,它的 Apple 应用分析链路走完了「认证清单 → 结构投影 → 动态库加载追踪」,全程静态分析,不运行目标应用的一行代码。读完本文,你可以在 IPA 或 .app 上独立跑通整条链路,并清楚知道哪些结论还需要二次核实。
动手前:先划清这条静态链路的边界
这条链路给出的全部是观察事实。清单记录的是路径、哈希和权限位;投影给出的是结构与角色归类;加载追踪给出的是按 dyld(macOS 的动态链接加载器)规则做的模拟解析。过程不执行目标代码,也不依赖 Apple 工具链,Linux 上一样能跑。边界同样明确:链路不读取 plist 语义、不解析签名声明、不声称任何运行时行为。凡是"应用声明了某权限""签名包含某 entitlement"这类表述,都不属于这条链路的结论范围,需要专门工具二次核实(见第三节)。候选文件字节读不出来时,条目会写进limitations字段,而不是被悄悄丢掉。
这条边界也是整套流程的承诺:后面每个结论都能回指到清单里某条具体哈希。那就从建立清单开始。
四步主线:从清单到加载链
第一步:建一份带哈希指纹的库存清单
清单要回答"有什么、是否完整"。这是整条链路的信任基础。
怎么跑:对 IPA、DMG、ZIP 或 macOS.app目录执行库存操作:
rea inspect-artifact MyApp.ipa --json跑完这一步,你会多拿到一条inventory_artifact证据记录,相当于给这箱文件附上了带指纹的装箱单。
盯这几个字段:root_sha256/root_format是根文件的哈希指纹与格式(ipa、dmg等);nodes记录每个组件的格式、架构、可执行位、内容状态;occurrences记录每条出现的逻辑路径、声明大小和哈希校验状态(如verified);limitations收走所有无法核实的条目。
容易踩的坑:清单只记录观察到的事实,不解释 plist 与签名语义,别拿它直接下语义结论。
第二步:把文件树压成应用结构图
投影命令把清单的文件树变成一张带精确路径、内容哈希和解剖信息的结构图。
怎么跑:把上一步的证据交给投影命令:
rea project-apple-application-graph '{"inventory_evidence":[<inventory_artifact Evidence>]}'实现见 AppleApplicationService.ts,工具契约见 applicationToolContracts.ts。
盯这几个字段:应用根识别规则是——IPA 里每个Payload/<Name>.app各是一个应用根;.app目录以被库存的目录本身为根;目录 / ZIP / DMG 取每个最外层<Name>.app(后接Contents/)。bundles部分逐个列出应用根及其嵌套 bundle,报告info_plist_path、executable_candidates(可执行候选)、signing_paths(签名路径)。布局分三类:macos-deep(含Contents/,可执行文件在Contents/MacOS/)、versioned-framework(含Versions/,按每个真实版本目录分析)、shallow(无上述结构,典型 iOS 形态,凭Info.plist判定为ios平台)。
容易踩的坑:DMG 只有根身份、没有子卷清单时投影会标记partial并说明缺失状态未知;APK、ASAR 等其他格式会被直接拒为输入错误。
第三步:按路径惯例筛出启动项与提权点
REA 按路径惯例把嵌套组件自动归类,"这个应用还悄悄装了什么"不用逐个目录翻。
怎么跑:不需要额外命令,直接在第二步输出的bundles组件里按角色筛选即可。
盯这张角色对照:
| 角色 | 路径惯例 | 通常是什么 |
|---|---|---|
app-extension | *.appex | 应用扩展 |
xpc-service | *.xpc | XPC 服务 |
framework | *.framework | framework |
system-extension | *.systemextension | 系统扩展 |
login-item | Contents/Library/LoginItems/ | 登录项 |
| privileged helper | Contents/Library/LaunchServices/ | 特权助手 |
容易踩的坑:登录项和特权助手是权限提升点的高频藏身处,排查时优先看这两类。
第四步:查每条 dylib 的加载落点
加载追踪回答"每条 dylib 加载最终命中哪个文件"——REA 用纯 TypeScript 解析 Mach-O / FAT 头与加载命令来模拟 dyld 解析规则,在非 macOS 系统上也能跑,依旧不执行一行目标代码。
怎么跑:
rea trace-dylib-resolution MyApp.app --json跑完这一步,你会多拿到一张 dyld 解析图:每条依赖边尝试过的全部候选路径与结果,外加四级判定。
盯这几个字段:bundle 内每个可执行文件(主程序、XPC 服务、扩展、登录项、助手)都是独立进程根,拥有各自的@executable_path;解析模拟覆盖@executable_path、@loader_path、@rpath搜索链、符号链接跟随,以及分级架构兼容(x86_64h进程可加载x86_64)。每条边的候选结果会标resolved/absent/architecture-missing/escapes-target等,边级判定则按下表处理:
| 看到该状态 | 你该做什么 |
|---|---|
resolved | 根内有一个镜像成功加载,该依赖已定,无需再查 |
conditional | 根内可解析,但更早的根外候选若存在于运行系统则优先——确认运行系统上是否存在同名库 |
unresolved | 根内所有候选确定缺失或不可用——核对包内是否漏装依赖文件 |
undetermined | 候选在根外或依赖运行环境——留待设备或目标环境二次验证 |
想核对清单预测的加载顺序,还可以用 Hopper 等反汇编引擎查看 IPA 内原生二进制的实际汇编:
trace_dylib_resolution在原生调查流程中的位置,见 docs/native-investigation.md。
容易踩的坑:conditional与undetermined的结论依赖运行环境,别直接写成"一定会加载 X"。
加载链路到此结束,但它全是模拟结论;涉及 plist 与签名的内容该去哪里核实,下一节讲清。
二次核实:plist 与签名结论去哪读
结构结论都基于"路径 + 哈希",凡涉及 plist 字段或签名声明的内容,必须用专门工具补一次核实:
- 投影不读 plist 语义。要看
CFBundleExecutable、URL Scheme、权限描述,对 bundle 的info_plist_path使用inspect_plist;签名声明则用inspect_signature核查可执行候选。 - AppleDouble 侧车文件(
._*、__MACOSX/)会被识别为清单事实,但自动排除在 bundle 角色与解剖组件之外。 - 候选截断是透明的:桥接假设最多序列化 2 MiB,超出时结果携带
bridge_candidate_coverage报告省略数量,覆盖度降级为partial。 - 目录型库存即使名为
.app也视为独立根;DMG 子卷清单依赖原生 macOS 挂载适配器。
核实边界划完,最后用一张速查表收口。
速查:一张表看懂命令、输入与坑
| 步骤 | 命令 | 输入 | 产出 | 易踩坑 |
|---|---|---|---|---|
| 库存清单 | rea inspect-artifact MyApp.ipa --json | IPA / DMG / ZIP /.app目录 | inventory_artifact证据(root_sha256、nodes、occurrences、limitations) | 清单只记事实,不解释语义 |
| 结构投影 | rea project-apple-application-graph '{"inventory_evidence":[<inventory_artifact Evidence>]}' | inventory_artifact证据 | 应用根识别、bundles解剖、桥接假设 | DMG 缺子卷清单时标记partial |
| 角色归类 | 随投影输出按角色筛选 | 同上 | 启动项与提权点清单 | AppleDouble 侧车不参与角色归类 |
| 加载追踪 | rea trace-dylib-resolution MyApp.app --json | .app或 Mach-O 可执行文件 | dyld 加载解析图与未决发现 | conditional/undetermined依赖运行环境 |
| 二次核实 | inspect_plist/inspect_signature | info_plist_path/ 可执行候选 | plist 字段取值与签名声明 | "声明权限 / entitlement"表述必须复核 |
完整静态分析链路到此走了一遍:清单建立信任、投影给出结构、角色定位启动项、加载追踪回答落点、核实工具补上语义。首次使用前,请先阅读 安装文档 完成安装与 Provider 配置;更完整的语义与状态表见 Apple 应用分析文档。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考