克魔助手
全部文章

不越狱,在 iOS 上能走多远?

4 分钟阅读设备入门

搜“怎么在 iPhone 上看某某东西”,第三条结果多半会让你先越狱。有时候那确实是唯一的路,但更多时候,那是从“当年确实如此”的年代继承下来的建议,在系统早已开放了受支持的通道之后,仍然被反复转述。

值得搞清楚这条线到底在哪,因为越狱设备是一个糟糕的测量仪器:它跑的不是用户跑的那套软件、过不了完整性校验、内存行为不同,而且它再也回不到发布流程里去了。

一台受信任的电脑本来就能拿到什么

当设备解锁并信任了一台电脑,iOS 会通过这条连接开放一组服务。这些服务和“电脑给手机做备份”、“给它装包”、“在访达里显示它”用的是同一批。通过它们你能拿到:

  • 性能计数器 —— 每进程的 CPU、内存、GPU、帧呈现、网络字节数、能耗归因
  • 系统与应用的实时日志
  • 崩溃报告,包括 jetsam 和看门狗终止
  • 应用沙盒 —— App 自己的 Documents、Library、tmp
  • 已安装应用 —— 列出、安装、卸载、启动、终止
  • 设备信息 —— UDID、存储、电池健康与循环次数、各类序列号
  • 配置描述文件 —— 列出、安装、删除
  • 屏幕截图
  • 虚拟定位
  • 备份,完整或部分
  • 使用与耗电记录,可回溯数月

这是一个相当大的面,而且没有一项需要改动设备。

墙到底在哪

越狱真正买到的东西,比传说中窄得多,而且大部分不是“测量”:

  • 读另一个 App 的沙盒。 沙盒由内核强制执行。这就是那堵墙,而且是应该存在的墙。
  • 对任意进程做 hook 或打补丁。 对你不掌握的代码做运行时改写。
  • 绕过平台安全校验 —— 证书绑定、完整性证明、越狱检测。
  • 超出设备开放范围的完整文件系统访问。
  • 内核级插桩。

注意这份清单上没有的东西:几乎所有一个开发者理解自己的 App 为什么慢、为什么漏、为什么崩、为什么往磁盘写错东西所需要的一切。

为什么“先越狱”的说法一直在

三个原因,都属于历史遗留。

设备服务多年缺少像样的文档,所以用它们的工具很少,用越狱的工具遍地都是。那条建议写下来的时候是对的,而搜索结果的寿命很长。再者,“越狱”是一个让人满意的答案 —— 它听起来像解锁,而“系统本来就开放了这个”听起来像限制。

没人提的代价

越狱设备是一个很差的下结论的地方:

  1. 它不是用户手上的东西。 运行时不同、保护机制不同,有时性能特征也不同。在上面量到的内存数字,不是用户拿到的那个。
  2. 它没法进发布流程。 这台设备永久出局。
  3. 每次系统更新都会坏。 你的测试机被钉在越狱工具支持的那个 iOS 版本上,而那通常不是用户在用的版本。
  4. 完整性校验会失败。 任何做校验的东西 —— 支付、DRM、企业策略 —— 行为都会不同或者直接拒绝运行,于是你 App 里的一整类功能变得不可测。
  5. 它是一个安全决策,而做决策的那台设备可能并不属于你。

老实的结论

如果你的问题是我的 App 为什么会这样,受支持的通道几乎肯定覆盖得了,而且是在一台事后还能还给测试同事的原装设备上。

如果你的问题是别人的 App 在干什么,答案就是沙盒 —— 而且这是设计使然:拦住你读别人沙盒的那道边界,同时也拦住了所有人读你的。

有意思的是,第二个问题通常本来就问错了。多数时候它其实是某个可以直接测的东西的替代问法:竞品 App 的性能表现(可测)、网络上发生了什么(抓包的活)、某件事耗多少电(在历史记录里)。为了回答它去越狱,是给一个本来有更好仪器的问题,选了一个更差的仪器。