---
id: "mb-20261103-3357b3"
kind: "deep"
title: "一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录"
description: "澳洲老极客 Dave Jones 尝试用 Claude Code 逆向 121GW 万用表的 124KB 闭源固件。在没有源码的情况下，AI 自行调用 Ghidra 反编译、结合原理图对齐寄存器语义，并自建模拟器跑完 591 轮硬件状态比对与投毒测试，甚至修复了原版漏写 volatile 的底层缺陷。"
domain: "ai"
domain_label: "AI 与大模型"
canonical_url: "https://mubeitech.com/deep/mb-20261103-3357b3"
markdown_url: "https://mubeitech.com/deep/mb-20261103-3357b3/markdown"
json_url: "https://mubeitech.com/api/interpretations/mb-20261103-3357b3"
topic: "一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录"
source_type: "generated"
status: "published"
generated_at: "2026-11-03 21:29:27"
frame_type: ["机制"]
legal_anchor_count: 0
transcript_citation_count: 0
---

# 一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录

一块单片机里编译好的 124KB 机器码，没有任何源码，能不能还原成干净的纯 C 语言？
按以前的做法，资深逆向工程师带着反汇编器和示波器，至少要抠上一个月。
澳洲做硬件测评的老极客 Dave Jones，最近干了一件极其硬核的事。
他找出一台自己参与设计的 121GW 万用表。
拿电烙铁把塑料外壳切开一个口子，焊上烧录插针，接上电脑。
然后给 Claude Code 扔了一段提示词：
把芯片里的机器码，全部逆向重构成标准的纯 C 语言，再重新编译刷回硬件。
中间没有加钱买高级算力，用的是普通 20 美元的月费账号。
睡了一觉起来，不到 24 小时。
796 个函数，全部重写完成。
重新编译出来的固件刷进万用表，测电压、测电阻、连蓝牙，全部一次跑通。

这到底是怎么搞出来的？
很多人以为大模型做逆向，就是把机器码扔进去，让模型猜源码。
要是真这么干，早就满屏幻觉、连编译都通不过了。
你看它在后台实际干了什么。
Claude Code 先在电脑里给自己配了一套完整的逆向工具链。
有交叉编译器 GCC，有开源逆向工具 Ghidra，还有 Java 运行环境。
万用表芯片里导出的机器码，分成两个部分：
24KB 的自定义引导程序，和 124KB 的万用表主程序。
逆向最大的难点从来不是把机器码翻译成指令。
难点在语义：
代码里调用 0x40011000 这个物理地址，到底是在读数模转换芯片，还是在刷新液晶屏？
Dave 把万用表的电路原理图和用户手册喂给了它。
模型一边用 Ghidra 反编译，一边对照原理图和台湾晶宏 HY3131 测量芯片的数据手册找对应关系。
把芯片里的每一个寄存器、每一个物理引脚，全都还原成了人类看得懂的变量名。

接下来才是最绝的地方。
写出来的 C 代码，怎么保证功能跟原来一模一样？
它在电脑里，自己写了一个 STM32 芯片和外围电路的软件模拟器。
整个固件一共拆出 796 个函数。
除了库函数和中断，691 个应用函数全部用纯 C 语言重构。
它给每一个函数配了测试用例，总共跑了 591 轮模拟比对。
在模拟器里，原版机器码跑一遍，新写的 C 代码也跑一遍。
对比寄存器输出、对比内存数据、对比外设写入。
为了防止自己偷懒，它甚至故意往测试用例里塞错误代码，确认测试框架能不能抓出异常。

甚至还顺手修了一个原版代码隐藏的缺陷。
万用表开机有一个 1 毫秒倒计时的启动画面。
原版代码把计数变量放在中断服务程序里累加，主循环在死循环里不停读取这个变量。
但原作者漏写了一个关键的 volatile 关键字。
以前的老编译器可能没问题，但用现代 GCC 编译时，优化器直接把变量缓存到寄存器里了，导致主循环死锁。
AI 在模拟器里抓出了这个时序异常，随手给变量补上了 volatile。

最后重新编译出来的固件，体积只有 90KB。
原版的官方固件是 124KB。
之前社区网友手工逆向出的汇编版本，有 142KB。
体积缩水了近三分之一，代码更紧凑了。

真机实测怎么样？
Dave 把重新编译好的固件刷回这台被切开外壳的万用表。
开机，屏幕正常亮起，显示版本号 V2.05。
拿基准源测 10V 直流电压，读数精准。
测 10kΩ 电阻，通过。
读内部温度，26.6 度，跟实验室空调开机后的室温一模一样。
最后测最容易出问题的蓝牙通信：
打开电脑端的配套软件，万用表瞬间被识别，测量数据实时传输过来。
在嵌入式开发里，蓝牙通信能跑通，说明底层的时钟、中断嵌套、状态机和外设协议栈全是对的。

不过，整个过程也有让人哭笑不得的插曲。
在把固件刷回硬件的那一刻，Dave 差点被逼疯。
本来人工往单片机里烧录 90KB 数据，插上烧录器 20 秒就能搞定。
结果这个 AI 严谨过了头。
点下烧录后，它非要反向反编译一遍刚刚编译好的固件，重新校验时钟、重新比对内存对齐。
在终端里足足折腾了 12 分钟，烧掉了上万个计算额度。
Dave 在视频里直翻白眼：
它是不是故意绕远路帮公司消耗用户额度？
而且硬件的物理开关它依然动不了。
遇到切换测量量程的挡位开关，AI 只能在终端里打字求助：
请人类帮我把旋钮拧一下。

但牢骚归牢骚，结果摆在眼前。
以前嵌入式软件的逆向工程，是极少数资深工程师的独门绝技。
不仅要懂汇编、懂芯片架构，还要对着厚厚的数据手册一点点抠时序。
现在一个工程师，花 20 美元账号月费，给一个明确的目标，放手让它自己调工具、搭模拟器、跑闭环测试。
不到 24 小时，一套原本闭源的万用表固件，变成了人人可读、随时可以二次开发的开源 C 源码。
整个软件工程的底层规则，真的彻底变了。

_Canonical: <https://mubeitech.com/deep/mb-20261103-3357b3> · Source: 墓碑科技 MUBEITECH (mubeitech.com)_
_Rendered by mubei-terminal._
