gaelic-ghost/spelunking
GitHub: gaelic-ghost/spelunking
一套用于系统性调查 Apple 平台私有框架与服务(如 MediaRemote)的 Swift 研究工具和文档仓库,通过 runtime 探测、XPC 追踪与符号分析揭示私有 API 行为。
Stars: 2 | Forks: 0
# 洞穴探索
针对本地、经用户同意的辅助功能以及 SIP 已禁用状态下“幕后同行”探索的 Apple 平台私人研究。
本仓库用于对 macOS、iOS 和 Apple 平台的 framework、服务、daemon、私有 API、头文件、符号以及运行时行为进行专注的调查研究。每次研究应针对一个 framework、服务、子系统或紧密相关的类别进行,然后留下对未来工具和项目有用的文档。
第一个研究目标是 macOS 26.5 上的 `MediaRemote.framework` 以及已安装的 macOS 27 beta SDK,相关范围涵盖“正在播放”、媒体控制、路由以及用户态访问层。
## 仓库布局
- `docs/`:供日后阅读的持久性文档。
- `docs/frameworks//`:针对某个 framework、服务或子系统的精炼笔记。
- `research//`:针对某个研究目标的原始证据、命令笔记、符号转储、生成的头文件、实验以及仅限本地使用的工作资料。
- `Sources/`:用于可重用研究辅助工具和命令行工具的 Swift package 源码。
- `Tests/`:用于可重用辅助工具的 Swift package 测试。
- `tools/`:目前尚未作为 SwiftPM 目标的独立脚本和辅助说明。
## 当前工具
- `spelunk`:打印当前设定的研究目标路径。
- `mr-now-playing-probe`:只读的动态 `MediaRemote.framework` 探测工具,用于获取全局“正在播放”信息、应用 PID/播放状态/客户端状态、客户端/播放器列表以及短通知观察窗口。
- `mr-internal-probe`:Objective-C 辅助工具,用于需要进行直接 Objective-C runtime 调用的内部 `MediaRemote.framework` 包装器实验。
- `mr-interface-probe`:Objective-C runtime 接口描述工具,用于描述目标 `MediaRemote.framework` 的类、方法、属性、ivar 和 protocol。
- `mr-route-probe`:面向读取的 endpoint 和输出设备探测工具,用于路由边界实验。
- `MRXPCTraceInterpose`:私有动态 interposer,用于追踪来自本地探测进程的 MediaRemote XPC dictionary 发送。
- `now-playing-fixture`:仅包含元数据的 fixture,用于测试 `MPNowPlayingInfoCenter` 的发布是否通过 MediaRemote 显示。
- `tools/mediaremote-inventory.zsh`:可重复的本地捕获脚本,用于获取 dyld-cache 导出、导入、字符串、ObjC 名称、SDK 差异、支持二进制文件、资源和 entitlements。
- `tools/mediaremote-entitlement-experiment.zsh`:可重复的本地运行器,用于构建 `mr-internal-probe`,使用候选的私有 entitlements 对副本进行签名,并捕获运行时的差异。
- `tools/mediaremote-daemon-observe.zsh`:可重复的本地运行器,用于执行探测并在同一时间窗口内捕获聚焦的 `mediaremoted`/unified-log 证据。
- `tools/mediaremote-interface-capture.zsh`:可重复的本地运行器,用于将已加载 framework 中选定的 Objective-C runtime 接口捕获到被忽略的研究输出中。
- `tools/mediaremote-message-surfaces.zsh`:可重复的提取器,用于从清单捕获中提取 XPC key、消息日志、请求处理程序、protobuf/message 符号以及 transport 辅助工具。
- `tools/mediaremote-message-id-callsites.zsh`:可重复的反汇编解析器,用于直接解析 MediaRemote XPC 消息类型的调用点。
- `tools/mediaremote-xpc-trace-observe.zsh`:可重复的 DYLD interposer 运行器,用于将 XPC message-ID 追踪与聚焦的 daemon 日志配对。
## 研究形式
每个目标都应回答相同的核心问题:
- 存在哪些公开、私有以及运行时发现的入口点?
- 哪些类型、函数、通知、常量、回调以及 XPC 或 daemon 边界看起来是有用的?
- 当前 OS framework 中存在哪些符号,而已安装的 beta SDK 中又出现了哪些符号?
- 用户态可以直接调用什么,什么需要 entitlements 或 TCC,什么仅在 SIP 已禁用/私有通道条件下有效?
- 哪些观察结果是在本地验证过的,哪些仍然是根据头文件、符号、字符串或行为推断出来的?
将原始捕获内容保留在 `research//` 中,并仅将清理后、可重用的知识提升至 `docs/frameworks//`。
## 当前目标
`MediaRemote.framework` 及相关媒体控制层:
- “正在播放”的元数据和队列
- 播放状态和命令调度
- 来源、路由和目标发现
- 应用、daemon、XPC、通知和私有 framework 边界
- macOS 26.5 与 macOS 27 beta SDK 的差异
有关起始大纲,请参阅 `docs/frameworks/MediaRemote/README.md`。
`UserNotifications` 和 `NotificationCenter.app` 辅助功能研究:
- Notification Center 支持的、应用作用域内的 UserNotifications API 边界
- 对系统 Notification Center UI 的只读 Accessibility 检查
- 活跃 macOS 版本的观察者能力证据
- 预览隐私和 TCC 限制
使用以下命令运行只读探测:
```
swift run spelunk notifications --max-depth 6
```
它不请求与通知 UI 进行任何交互,也不执行任何 Accessibility 操作。宿主进程必须已经拥有 Accessibility 权限。有关研究边界,请参阅 `docs/frameworks/UserNotifications/README.md`;有关证据计划,请参阅 `research/UserNotifications/README.md`。
当前有用的命令:
```
swift run mr-now-playing-probe --all
swift run mr-now-playing-probe --origins
swift run mr-internal-probe
swift run mr-interface-probe
swift run mr-route-probe
swift run mr-now-playing-probe --observe 10 --application
tools/mediaremote-inventory.zsh
tools/mediaremote-entitlement-experiment.zsh
tools/mediaremote-daemon-observe.zsh
tools/mediaremote-interface-capture.zsh
tools/mediaremote-message-surfaces.zsh
tools/mediaremote-message-id-callsites.zsh
tools/mediaremote-xpc-trace-observe.zsh
```
标签:Apple生态, CVE监控, iOS, Swift, 云资产清单, 私有API, 系统框架研究, 逆向工程