我们先从头说起:面容 ID 系统是什么样的,又是如何运作的:


从硬件上来说,这套系统由一对摄像头(红外和 RGB)以及两种红外发射器组成:一种是普通泛光照明器,另一种是专门的点阵投影器。
我们剥开 iPhone X 的外壳,移除所有多余部件,就能看到裸露的前置摄像头模块。红外泛光照明器是独立存在的,但所有其他组件都在我们手中——它们牢固地固定在这个金属框架中。
在这里我们看到了红外摄像头和红外点阵投影器。TrueDepth 和面容 ID 系统的运作就依赖于这对红外搭档。而今天故事的主角,正是这个点阵投影器。
面容 ID 的简要工作原理

红外点阵投影器的作用正如其名——按照指令向周围环境投射数万个红外点。而红外摄像头(也是它发出指令)则立即拍摄这些点。
处理器 ISP 知道投影器、摄像头的光学特性以及它们之间的距离,就可以估算出每个点离设备的远近。我本人也不完全理解这个过程的数学原理,反向工程分析也会很困难——但通过拍摄一系列不同点阵图案的图像,可以非常精确地推算出每个点的具体位置,从而生成完整的深度图。无需激光雷达,也无需 ToF。
正是深度图让面容 ID 不会被打印的照片所欺骗。照片是平面的——而人脸是有起伏的,对于面容 ID 来说,脸部的地形图比其颜色更重要。

当然,系统也会关注面部的颜色。红外摄像头与 RGB 摄像头在硬件上是同步的,两部摄像头同时拍摄面部。而且 iPhone 不仅可以闪烁红外投影器,还可以闪烁红外泛光照明器——并在红外光谱下拍摄整个面部。
深度图本身相当粗糙,而通过神经网络分析红外和 RGB 图像中的面部纹理,既可以更精确地确定深度,也可以更好地识别诸如面部表情之类的细节——无论是在白天还是黑夜。
如果你觉得这套系统很眼熟,那可能是因为它直接脱胎于 Xbox 360 的 Kinect。只不过 Kinect 是个巨大的笨重设备,而这里却被压缩到了智能手机屏幕“刘海”的大小。
PrimeSense 公司完成了这项壮举,他们开发了 Kinect 1 的核心技术——之后被苹果以 3.5 亿美元的价格收购。整个公司都被收购了——包括所有专利、研发成果、员工和其他所有内部资源。
拆解投影器的内部构造

我们继续深入反向工程分析:从 iPhone X 的摄像头模块中取出点阵投影器,并将其拆解成组件。它由 FPC 软板、发射组件和光学组件组成。
软板完全是被动的,因此没什么意思。它焊接到发射组件上,并将信号引到 FPC 连接器,连接器再连接到 iPhone X 的主板。连接器采用 0.35 毫米的触点间距,是定制的(苹果这帮混蛋),看起来像是 JAE 公司生产的。
我们来看看光学组件的主要部件:

再来看看发射器内部有什么:

MOSFET 和神秘芯片的作用引起了我的兴趣。为什么?因为不清楚它们在那里到底干什么。
第一个显而易见的猜测是,神秘芯片是用于存储序列号和校准数据的存储器。芯片采用典型的 I2C 存储器接口,内部肯定有存储器。投影器有序列号,通过序列号可以确定生产日期——如果整个投影器被更换,iPhone 会检测到序列号不匹配,并拒绝使用。但最常见的 I2C EEPROM 采用微小的 WLCSP-4 封装——如果非常想要,甚至可以阻止其被重新写入。因此,这个芯片不可能是简单的存储器。它肯定还做了其他事情。

第二个显而易见的猜测是,神秘芯片是激光驱动器,而 MOSFET 是它的开关。没错,MOSFET 确实是由芯片控制的。但这个芯片也不可能是什么至关重要的组件,比如激光驱动器。
首先,MOSFET 位于激光组件共阴极的断点处——而 4 个独立阳极直接连接到软板,并进一步连接到 iPhone 层叠主板的内部。其次,在为反向工程收集数据的过程中,我偶然发现了一些来自中国维修师傅的说明。

他们没有直接说明问题的本质,但在许多这些说明中都提到:要维修“损坏的”投影器,需要将其拆开,移除 MOSFET,并用跨接线连接漏极和源极。最终,内部装有跨接线的投影器能够工作,面容 ID 功能也会恢复。既然用跨接线代替 MOSFET 的投影器也能正常工作,那么这个 MOSFET 在那里是做什么用的呢?
我恍然大悟:这就是维修的关键所在。MOSFET 由芯片控制——因此芯片可以随意断开激光器的电源电路,从而损坏投影器。而这种维修方法消除了这种断开。
它的名字说明了一切
既然已经清楚,神秘芯片与 MOSFET 串通一气,阻碍投影器的正常工作,那么问题就来了——它为什么要这样做?为什么要在投影器中安装一个会“杀死”投影器的芯片?
为了找到答案,我深入研究了 iPhone 处理器中 ISP 模块的固件——正是它通过 I2C 与摄像头传感器和投影器进行通信。
我首先下载了适用于 iPhone X 的最新 iOS 15 固件镜像。iPhone 的固件镜像本质上是 zip 文件。在内部,我找到了想要的 ISP 固件——以 Firmwareisp_bniadc-nike-d22.im4p
文件的形式。从压缩的 im4p 文件中提取出了二进制文件,格式为 Mach-O,内部包含 AArch64 代码。与典型的“未知微控制器固件镜像”不同,Mach-O 是一种有文档记录的可执行文件格式,类似于 PE 或 ELF。无需猜测文件结构、处理器架构或代码加载地址。只需将文件拖入 Ghidra,一切都会自动整理得井井有条。非常方便。

之后,本能驱使我决定剖析更旧的固件。在 iOS 13 固件镜像中,我找到了 adc-nike-d22 文件。甚至大小也几乎相同。只是新固件中的代码更多——而旧固件中的代码较少,但却有符号。所有函数名称都在。永远都要检查旧版本!
ISP 固件中包含大量信息,包括 iPhone 如何通过 I2C 与各种芯片通信——与摄像头传感器、摄像头 PMU、闪光灯和自动对焦控制芯片通信。同样要感谢这些符号,我得以提取出系统各个组成部分的“名称”——其中一部分与固件其他部分以及其他逆向工程师和维修人员的资料相符。例如,红外摄像头传感器是意法半导体 VD56G0 “Savage”。整个 TrueDepth 系统在代码中被称为 “Pearl”,其主要模块以《罗密欧与朱丽叶》中的人物命名。红外投影器名为 “Romeo”(罗密欧),红外摄像头名为 “Juliet”(朱丽叶),红外泛光照明器名为 “Rosaline”(罗瑟琳)。激光驱动器 “Rigel”(参宿七)位于 iPhone 主板上,为 “Romeo” 内部的激光器和 “Rosaline” 泛光照明器内部的激光器供电。
我们感兴趣的神秘芯片呢?它也有名字。在代码中它被称为 “MamaBear”(熊妈妈),简称 “MB”,看起来它的功能非常简单。它位于 I2C 总线上。它存储 OTP 数据,包括序列号和各种校准数据。它可以按照指令打开和关闭 MOSFET。而且它还会测量……电容?不是温度,它根本没有连接到 NTC 热敏电阻,而是电容。只是,测的是什么电容?
罗密欧的悲剧性陨落

中国电路图再次帮助我们找到了这个问题的答案。在 JCID 的电路图中,可以看到 “Romeo” 模块中有三个触点用于连接发射组件和光学组件。一个是接地,另外两个直接连接到 “MamaBear” 芯片。这些触点通过光学组件侧面的专用转接器,到达其顶部——衍射光学元件。
衍射光栅光束分离器是不可控的,对电流没有反应。但它有电容。通过这三条线路可以测量这个电容。但为什么要测量呢?
关键在于这个衍射光栅光束分离器发挥着至关重要的作用。投影器使用的点阵图案是由 VCSEL 晶体上微型激光器“凹坑”的排列方式决定的。然后,这个图案通过衍射元件复制,衍射元件将一束光线变成数百束光线。

那么,如果这个衍射元件被撕掉会怎么样呢?
光线将不会被分离。原本数百束激光束将变成一束——但强度会增强数百倍。而这毕竟是激光。红外激光比红色激光更危险,因为人眼看不到它——因此即使面对危险的强光源,也不会本能地移开视线。而且很有可能在这种情况下,用户视网膜上会被烧出一个特征性的点阵图案。
为了防止这种情况发生,才需要这个“杀手”芯片。开启后,它会持续监控衍射元件的电容——如果元件被撬掉或损坏,电容值超出允许范围,芯片会立即切断 MOSFET,断开 VCSEL 的电源。由于元件位于光学组件的最顶部,因此在不损坏元件或破坏触点的情况下,通过撞击损坏其余组件几乎是不可能的。
在激光器紧急断电后,芯片会在 OTP 中写入一个标志位,将投影器标记为有缺陷——这意味着断开的电源将永远保持断开状态。来自 ISP 的任何指令都无法再对其产生影响。MOSFET 将始终保持关闭状态,投影器将永远无法再次工作。
“MamaBear” 芯片,正如其名称所示——是一个保护芯片。它是用于紧急停止激光器的“自毁开关”。它“杀死”投影器是为了防止损坏的激光设备照射用户的眼睛。而 “Juliet” 模块,在失去与其配对的 “Romeo” 后,也失去了存在的意义——整个 TrueDepth 系统都因此瘫痪。
技术祭司们的日常工作
但是,这种保护机制存在缺陷。问题在于,点阵投影器位于设备顶部边缘,靠近扬声器。如果液体进入 iPhone 内部,最常见的入口之一就是那里。而电容式传感器对导电流体非常敏感。因此经常发生的情况是,即使进水极少,也没有其他损坏,面容 ID 也会在设备掉入水中后损坏。只是 “Romeo” 误判了形势,无端地进行了自我了断。
这些设备会被送到维修店。通常是非官方维修店。由于 iPhone 会验证零部件的序列号(感谢苹果),因此无法简单地将整个摄像头模块换成来自“供体机”的可用模块。手机会排斥新模块,面容 ID 仍然无法工作。这意味着,必须想办法修复旧模块。但是,如何“复活”一个已经自行故意停用的投影器呢?
非官方维修工具的制造商为此发明了一整套不同的“仪式”。而心灵手巧的技术祭司——维修人员则虔诚地遵循这些“仪式”,并对这个复杂且经过校准的光学系统进行微创手术。对手工技巧的要求难以想象——内部组件尺寸只有几毫米,光学元件又极其敏感。如果手术干预导致校准参数偏移过大,系统将无法工作。没有用于软件重新校准的工具(再次感谢苹果)——你要么找到恢复原始参数的方法,要么就只能告别面容 ID。

它是如何工作的呢?嗯,首先要从原始 “MamaBear” 芯片中读取 OTP 数据。
即使投影器认为自己已损坏,数据仍然可以读取。为了读取数据,中国人制造了专门的“维修”编程器——这些编程器随附一系列连接器转接板,可用于各种不同型号 iPhone 的各种组件,包括投影器。
然后需要做两件事——解决断开电源的 MOSFET 问题,并替换原始的保护芯片。这里有很多不同的方法。

例如,可以像文章前面的照片中那样,用跨接线代替 MOSFET,然后替换 “MamaBear” 芯片,方法是焊下原始 FPC 软板,并将其替换为带有中国制造的欺骗芯片的专用软板。
原始 “MamaBear” 芯片此时可能仍然留在内部,无力地尖叫着投影器绝不应该工作。但它不再拥有 MOSFET 来强制关闭投影器,而 iPhone 方面只能看到中国芯片——它会提供由编程器写入的原始数据副本,并报告投影器绝对绝对是完好无损的。

也可以完全拆下 “MamaBear” 芯片,并在其原始位置安装中国制造的二合一替代品——它既能闭合 MOSFET 的触点,又能向手机提供 OTP 数据的副本。

还有一种焊接量最少的方法。带有欺骗芯片的“转接器”,安装在原始软板和 iPhone 主板之间。
它无法解决 MOSFET 的问题,但中国人也为这个问题找到了独辟蹊径的解决方法,制造了“高压”编程器。
你知道吗,可以使用专用的高压编程器来“起死回生”并重新写入各种 ATtiny 吗?这里的情况完全不同。中国产高压编程器会野蛮且不可逆地将投影器内部的 MOSFET “编程”为漏极和源极之间的短路。
在维修的最后阶段,我们再次将投影器连接到编程器,并将第一阶段保存的转储文件写入其中。投影器就可以正常工作了,伪装成原始且未修改过的样子。
所有这些不同的装置都由不同的维修设备销售商制造和推广。各种欺骗芯片只能与“原厂”编程器配合使用,而编程器通常具有 DRM 功能,例如帐户绑定和有限的“维修”次数,需要付费才能补充。
维修人员是否知道他们的维修行为完全摧毁了苹果公司为保护用户眼睛而设计的系统?实际上,他们并不知道。他们不是逆向工程师——他们是巫师。他们不理解工作原理。他们掌握的是“仪式”和结果,这对于他们来说已经足够了。而来自中国的精明逆向工程师不愿向公众分享他们的秘密。我在这篇文章中描述的内容,只有苹果公司的工程师和十几位“圈内”中国人完全知晓。还有我。现在也包括你了。
苹果为什么是混蛋
说实话,我无法过多地责怪苹果公司的工程师,因为他们的“自毁开关”过于敏感,损坏了本可以继续工作的投影器。激光器是个危险的东西,保护用户免受“最坏情况”的想法绝对是明智的。尽管这种保护措施的实现方式还有待改进。
但是,苹果公司打击非官方维修的政策才是所有罪恶中最糟糕的。如果 TrueDepth 模块可以随意在设备之间更换,而无需考虑序列号,那么这种令人毛骨悚然的扭曲维修“仪式”几乎就没有意义了。如果可以从另一台屏幕已碎的“供体机”上取下完全可用的 TrueDepth 模块,将其安装到客户的手机中,完全恢复功能,并安心使用,那又何必费尽心思进行微创焊接,并与编程器共舞呢?这对维修人员来说更简单,对设备所有者来说也更安全。
但苹果公司可憎的反维修行为历史清楚地表明,这种情况不会发生。除非在美国或欧盟,各种 “Right to Repair”(维修权)运动能让零部件按序列号绑定的做法成为非法。而现在这种情况是可能发生的。关于欧盟在新 iPhone 型号中添加的功能比苹果公司还多的笑话,其中有很高的真实性。因此,我们将密切关注立法倡议。
本文由俄语翻译而来。文章作者:acc0unt。我们在翻译过程中力求保留作者的原始风格和措辞,尽最大可能贴近原文。