Hacker News 中文摘要

RSS订阅

用 AI 实现硬件逆向工程 -- Using AI to reverse engineer hardware

母亲去世后,我接手一箱胶片底片,于是买了在 Linux 下支持的 Plustek 8200i 底片扫描仪,却发现芯片组已换成 Linux 不再支持的一款。此前我用克劳德(Claude)做过硬件 Linux 配置工具,便想让它帮忙弄出可用的 SANE 驱动,但长期毫无进展,甚至放弃数月。后来看到汤姆·克莱德(Tom Crider,网名 Glorious Eggroll)在 X 上说用 AI 工具修好鼠标驱动,让 AI 代理控制 Windows 实例抓取数据;我把推文贴进 Claude,请它搭 Windows 虚拟机,对扫描仪做同样的事。

正文

母亲去世后,我留下了一个装满旧胶片底片的大盒子,里面是童年家庭旅行等照片。我因此决定买一台底片扫描仪,发现 Plustek 8200i 在 Linux 下受支持,就买了它。结果却发现扫描仪里的芯片组已经换成 Linux 不再支持的型号。我之前用 Claude code 为一些硬件做过 Linux 配置工具,比如 Dell 摄像头控制器应用,所以我想,也许 Claude 能帮我做出一个可用的 SANE 驱动。但我基本上卡住了,很久毫无进展,甚至有几个月干脆放弃了该项目。

后来我看到 Tom Crider(也就是 Glorious Eggroll)在 X 上的一则帖子,讲他如何用 AI 工具修好了一个鼠标驱动。他描述了自己如何让 AI 代理完全控制一个 Windows 实例,以抓取修复驱动所需的数据。我把他的推文贴进 Claude,让它帮我搭建一个 Windows 虚拟机,对我的扫描仪做同样的事。我觉得关键在于:既能在 Windows 下运行扫描,又能在扫描时抓取 USB 数据,再加上 Claude code 本身的改进,效果非常显著。几小时内,我就得到了第一次在 Linux 下成功扫描的结果,虽然有些质量问题,但 100% 能认出底片上的图像。几天后,我有了一个接近完美的驱动,包括支持红外扫描,却发现在放弃到重试的这段时间里,已经有人向 SANE 提交了支持该扫描仪的代码……这种事时有发生。我还用 Claude 写了一个用于底片扫描的应用,命名为 Negative Vibes,觉得这个名字挺可爱。

扫描仪成功后,我想,能不能用同样的方法最终解决我笔记本上 MIPI 摄像头支持的遗留问题。于是我让 Claude 复用我创建的 harness,按需更新内核驱动和 libcamera,试着修复笔记本上的 MIPI 摄像头。我早上启动任务,到一天结束时,情况已经有了很大改善,内核和 libcamera 的补丁都已就绪。

我觉得这值得分享出来。虽然任何人都可以从零开始,但我还是让 Claude 把 harness 做得更通用,并写了文档,让其他想在自己硬件上尝试的人更容易上手。为没有文档的硬件写驱动向来枯燥:你要抓取总线流量,盯着十六进制转储,对各个寄存器或控制传输的作用提出假设,然后逐个测试,通常要花几周。这活儿概念上不难,但需要大量耐心和技能。

这种工作很适合 AI 模型。它可以读取成千上万行 USB 捕获数据,注意到某个序列在重复、只有一个字节在变,然后提出这个字节的含义。它能写出测试来验证,而且不会感到无聊。人仍然负责决定要构建什么,并检查它在真实硬件上能否工作,但那些苦差事少了很多。

hw-harness

需要说明的是,我在做这些项目时并没有以这种形式使用 hw-harness,当时它基本上是我专用的代码;所以这个项目是把我工作中用的脚本变得更通用、可分享的一次尝试。hw-harness 旨在帮助你的 Claude 或 Codex 会话完成以下事项:

  1. 记录参考会话。在 KVM 虚拟机中运行厂商的 Windows 驱动,并把真实设备直通给 guest。
  2. 从 VM 外部捕获。在 Linux 主机上用 usbmon 记录流量。它位于直通层之下,因此 guest 看不到。
  3. 在 Linux 下用自己的驱动重复相同操作,并以同样方式捕获。
  4. 对比两份跟踪记录。两者来自同一工具,可直接比较。差异就是驱动 bug 的清单。

对于没有可窃听总线的设备,比如内置 MIPI 摄像头,harness 改用 Windows 端检查,也就是 INF 文件、注册表数据、ACPI 表和设备属性。

这种方法应该没问题,因为它不依赖复制任何代码,而是观察硬件的行为,只从 Windows 驱动中提取配置数据,因此新驱动里的每个常量都能追溯到某次记录。

所以对感兴趣的人,我简单描述一下我做的三个项目以及各自需要什么。

项目 1:Plustek OpticFilm 8200i 的 SANE 后端

图1:两款可用扫描仪驱动在同一张底片上的输出对比

第一个项目是较新型号 Plustek OpticFilm 8200i 的 SANE 后端。它使用 Genesys GL128 控制器(USB 07b3:1825),原本没有 Linux 支持。同名的旧型号使用 GL845,SANE 已经支持。

该后端支持:

  • 彩色、灰度、红外以及彩色+红外模式
  • 300 到 7200 dpi 的分辨率,每通道 8 位或 16 位
  • 利用红外通道进行灰尘和划痕修复
  • 针对高密度底片的曝光倍数

它以 Fedora RPM 打包,每次 push 都会自动构建。我主要用自己的 Negative Vibes 应用测试,因为 Linux 下用于底片扫描的选择并不多。

上游 SANE 的 genesys 后端在 2026 年 9 月也获得了对该扫描仪的支持,所以我比较了两款驱动。在 3600 dpi 下,两者解析出的细节相同。我的版本在全分辨率下更快(34.6 秒对 54.4 秒),并支持红外除尘;上游提供更多分辨率档位。网页上有一个可交互的并排对比,你可以看看。这些是单机单帧的结果,只能当作一个数据点。我做的这个交互页面展示了两款驱动的当前状态,希望我的发现能被 SANE 项目用来修复上游驱动里一些小问题。无论如何,由于这个原因,我把本项目更多是作为概念验证放出来,因为等上游驱动达到同等水平后,包括我在内的人应该都会去用上游驱动。

项目 2:Negative Vibes

图2:一张完成扫描、并经过红外清洁的底片

如果扫描底片仍然很痛苦,光有驱动也没多大用,于是我做了 Negative Vibes。它是一个用 Rust 编写的 GNOME 应用,用于在任意支持胶片扫描的 SANE 扫描仪上扫描彩色和黑白底片以及幻灯片。

扫描结果完全保留扫描仪交付时的样子:16 位、线性,并带有红外平面。其他一切都叠加在之上的非破坏性设置,所以你可以改变观感并再次导出。它包括:

  • 带片基和染料串扰校正的密度空间负片反转
  • 整卷统一设置,并支持逐帧覆盖
  • 红外和软件除尘
  • 通过 ArgyllCMS 进行 IT8 校准
  • 导出为 TIFF、JPEG、PNG 和 DNG,并带有 ICC 配置文件和元数据

它以 Flatpak 形式发布,内含扫描仪后端。目前只在 8200i 上测试过。目标是支持 SANE 支持的任何胶片扫描仪。为此,SANE 需要一种标准方式来暴露红外通道,而目前还没有。

项目 3:修复我的 ThinkPad 上的 MIPI 摄像头

图3:修复前后的 MIPI 输出。由于会话结束时我坐在相对较暗的房间里,实际颜色比画面看起来更好

我的 Lenovo ThinkPad X1 Carbon Gen 14(Aura Edition)里的摄像头采用 Sony IMX471 传感器,背后是 Intel IPU7。在 Linux 下,它输出的图像很暗,有严重暗角和强烈的黄绿色偏色。mipi-fixes-x1-aura 收集了这些修复。它只适用于这台笔记本,所以不属于更大的打包项目;但我已经把内核补丁提交给 Kate Hsuan,libcamera 补丁正在由 Wim Taymans 审阅,以提交给 Libcamera。

内核(IMX471 驱动):

  • 一个裁剪选择 bug 在保存裁剪矩形前就返回了错误,导致 libcamera 以为在使用完整像素阵列。
  • 测试图案寄存器声明的宽度不对。
  • 模拟增益上限太低,损失了约 1.8 档灵敏度。

libcamera 软件 ISP:

  • 完全没有镜头阴影校正,导致四角大约暗 2.7 档。
  • 白平衡统计是在传感器原生位深下,与 8 位黑电平相加。这扭曲了白平衡,该修复适用于任何 RAW10/RAW12 传感器。

在受控弱光测试中,帧亮度从 31.1 提升到 90.9。红/绿和蓝/绿比从 0.890 和 0.672 变为 1.047 和 0.823,接近 USB 网络摄像头的参考值。弱光下蓝色仍差约 17%,我认为这是灰度世界白平衡所致。Fedora 44 的 RPM 在 releases 页面。

我学到了什么

  • 参考捕获是很大的一步。让 AI 把已知正常的跟踪记录与失败的跟踪记录做对比,能把模糊的“它不工作”变成具体的差异清单。例如对 MIPI 摄像头来说,同时接一个 USB 摄像头,让 Claude 能比较两份捕获,这一点很关键。
  • AI 擅长苦差事,包括解码捕获、编写探针和交叉核对常量。但我仍然必须是那个拿着真实硬件的人。
  • 真实硬件是唯一裁判。以上每项说法都在实际的扫描仪或笔记本上验证过。

如果你有硬件没有 Linux 驱动,试试 hw-harness。再次感谢 Glorious Eggroll 带来的启发。

注意:我并不是说自己的扫描或 MIPI 摄像头现在已经完美,但扫描仪能给出看起来不错的扫描结果,MIPI 摄像头也比之前好很多。随着时间推移,我相信还能继续微调打磨;不过让我高兴的是,尽管缺乏这类工作的深入知识,它还是让我取得了进展。

评论

讨论气氛以惊叹和兴奋为主,不少开发者分享用 Claude、DeepSeek 等模型逆向设备固件并写出可用驱动或固件的经历;分歧主轴在于:这究竟是打破厂商封锁、让用户掌控硬件的解放,还是让闭源算法与硬件护城河瞬间消失、小公司被随意抄袭的威胁。

AI 逆向已让个人能低成本复活或掌控旧设备与专用硬件

  • 多位开发者表示,只要设备有 USB、UART 等接口,接上电脑让强模型分析固件或十六进制转储,就能在几小时内得到驱动、自定义固件甚至现代系统支持;有人把模型指向工作笔记本的 MIPI 驱动,有人给老旧 MP3 播放器写自定义固件,有人给佳能 Zoemini 2 照片打印机写了 Linux 上的 CUPS 蓝牙驱动,也有人靠焊接 UART 让未知路由器跑上 OpenWRT,成本可以低到不到一美元。(较多人) > 写打印机驱动时,Claude 把我当成“肉身探针”,指挥我装纸、看灰度、查双面打印来定位每行字逐渐变淡的故障。(@revolvingthrow)

闭源厂商和专有算法的护城河正在消失

  • 不少人认为,模型能直接反编译竞品固件、提取算法并转成可复用代码,硬件效果器、音频算法等曾靠封闭固件建立的壁垒已经不存在;软件也一样,许可和混淆本来就不真正保护代码,现在只差一条提示词。小公司担心自己的顶级算法会被随意扒走,大公司也会失去故意降速或拖延修 bug 的借口。(较多人) > 我用一条提示词和三小时就反编译了三款竞品效果器,还让模型先模拟执行原厂 ROM 确认不是“仿写”,现在随便一个订阅用户都能扒走顶级算法,硬件效果器的护城河消失了。(@valdiorn)

应当把目标对准 Apple、Nvidia 等真正封闭且有用的软硬件,而非冷门古董

  • 少数人主张,与其逆向几乎没人用的古老硬件,不如让模型去啃 Apple、Nvidia 这类封锁最严、但用户最多的目标,从而让 Nvidia 显卡在 Intel Mac 上工作、让 Apple Watch 与 Android 配对,并最终让它们在 Linux 上跑得更好,不必等厂商修 bug 或故意降速。(少数人) > 别再折腾没人用的老古董了,更有意义的是逆向 CUDA、Nvidia 固件和 Apple 软件,让它们在 Linux 上跑得更好,厂商再没借口故意拖慢硬件。(@rvz)

未来的逆向目标会延伸到智能电视、iOS 和廉价平板,大公司将难以招架

  • 少数人期待把能力用于智能电视以清除广告和僵尸网络,或把 iOS 搬到 Linux 沙盒、把廉价平板变成 iPad,并认为大公司将因此陷入挣扎。(少数人) > 很快就会有人让模型把 iOS 翻译到 Linux 沙盒里运行,或者把廉价平板变成 iPad,看大公司怎么挣扎。(@amelius)

专利和许可面对 AI 逆向正失去意义

  • 少数人问“专利不就是用来防这个的吗”,但回应指出,许可和混淆从来只是让复制更费劲,并不真正保护代码;现在模型让复制变成一条提示词,说明这类保护更多是心理安慰。(少数人) > 软件也一样,许可和混淆从来没真正保护过什么,只是复制太费劲,而现在只要一条提示词。(@jack_sunsetless)

有价值的补充

  • 技术验证方法:为确保反编译不是“仿写”,可让模型先写模拟器执行原厂 ROM/固件,再把结果转成独立 C++ 库并与模拟器输出对比,从而确认算法行为一致。(@valdiorn)
  • 具体逆向流程:给未知设备焊 UART、接 USB 转接器,让模型看固件和十六进制转储;借助过时的原厂内核识别 SoC,再用 Frida 分析动态库和内核模块文件,还原专有 Wi-Fi 与蓝牙驱动修改,最后在隔离的 Podman 容器里编译出上游现代内核的 OpenWRT;有人用类似流程只花了 0.86 美元,称过去要数周甚至数月。(@cookiengineer)
  • 能力迭代极快:同一人用 Claude 写 GTK4 应用,2025 年 12 月到 2026 年 1 月还几乎没用,到 9 月已几乎不用提示就能写出很好的程序,说明模型能力在数月内大幅跃升。(@javier2)
  • 精巧类比:AI 逆向的低成本与高可及性已“像自来水一样”,没有理由不考虑使用;专有硬件和软件因此失去意义。(@cookiengineer)
  • 协作建议:若发现社区已有人提交过相关支持代码,应拿自己手里的版本去审计补充,而不是重复造轮子,把缺失部分基于现有贡献结构补上。(@LoganDark)