我首先想到的方法是在主板上找一个 EEPROM,重写序列号。拆机并非胆小鬼能做的事——拆解过程很复杂,但不管怎样,要更换滚轮我也必须这么做。我没有找到任何 EEPROM,而且所用的 MCU 我没有对应的调试器。
我第二个想法是拦截网络连接,要么替换序列号,要么返回一个成功消息。然而各种应用安全措施让禁用证书固定比我想象中更麻烦。不是说做不到——只是我没找到简单的办法。
我的重点转向拦截切割机和电脑之间的通信。我启动了 Wireshark 捕获 Cricut 与我电脑之间的 USB 消息。它使用 USB CDC 通信,很快我找到了发送序列号的包。看起来没有任何校验和或加密。于是我借了一块来自 Droppy 的 RPi RP2040,这块板子既能做 USB Host 又能做 USB Client。
利用 TinyUSB 的 USB Host 和 CDC 简单 echo 的 Arduino 示例,我拼凑出一个简单的代理/重写设备。这没什么特别,不过我花了一点时间才搞明白,USB Host 必须超频到 240MHz 才能正常工作。我还配置了所有 USB 元数据,比如 vendor/product id 和描述信息,使其与真机一致。当它检测到来自切割机的数据包长度匹配且包含命令/序列号时,就会将其替换为另一个序列号。序列号似乎是按顺序发放的,你可以在 Cricut 自己的页面 上查看所有设备的状态。
由于重写设备在硬件层面替换了序列号,软件完全察觉不到。设备出现在我的账户里。我甚至能注册在 Cricut 机器状态页面上不存在的序列号。
这显然引发了一个问题:随机陌生人是否可能拿到其他用户的 Cricut 序列号,并将其锁定,或添加到自己的账户里……
在清理设备、更换滚轮(提示:用热水软化新滚轮以便安装)、重新组装 Cricut,并为 RP2040 打印了一个小外壳之后,我就能像用全新设备一样使用它了。
然而,我让这台 Cricut 恢复工作的方式可能是最不用户友好的,因为我相信存在纯软件解决方案。我想到的一些替代方案是: