{"id":"mb-20261103-3357b3","kind":"deep","title":"一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录","summary":"澳洲老极客 Dave Jones 尝试用 Claude Code 逆向 121GW 万用表的 124KB 闭源固件。在没有源码的情况下，AI 自行调用 Ghidra 反编译、结合原理图对齐寄存器语义，并自建模拟器跑完 591 轮硬件状态比对与投毒测试，甚至修复了原版漏写 volatile 的底层缺陷。新编译的 90KB 固件刷回真机，电压、电阻及蓝牙遥测全部一次跑通。","body":"一块单片机里编译好的 124KB 机器码，没有任何源码，能不能还原成干净的纯 C 语言？\n按以前的做法，资深逆向工程师带着反汇编器和示波器，至少要抠上一个月。\n澳洲做硬件测评的老极客 Dave Jones，最近干了一件极其硬核的事。\n他找出一台自己参与设计的 121GW 万用表。\n拿电烙铁把塑料外壳切开一个口子，焊上烧录插针，接上电脑。\n然后给 Claude Code 扔了一段提示词：\n把芯片里的机器码，全部逆向重构成标准的纯 C 语言，再重新编译刷回硬件。\n中间没有加钱买高级算力，用的是普通 20 美元的月费账号。\n睡了一觉起来，不到 24 小时。\n796 个函数，全部重写完成。\n重新编译出来的固件刷进万用表，测电压、测电阻、连蓝牙，全部一次跑通。\n\n这到底是怎么搞出来的？\n很多人以为大模型做逆向，就是把机器码扔进去，让模型猜源码。\n要是真这么干，早就满屏幻觉、连编译都通不过了。\n你看它在后台实际干了什么。\nClaude Code 先在电脑里给自己配了一套完整的逆向工具链。\n有交叉编译器 GCC，有开源逆向工具 Ghidra，还有 Java 运行环境。\n万用表芯片里导出的机器码，分成两个部分：\n24KB 的自定义引导程序，和 124KB 的万用表主程序。\n逆向最大的难点从来不是把机器码翻译成指令。\n难点在语义：\n代码里调用 0x40011000 这个物理地址，到底是在读数模转换芯片，还是在刷新液晶屏？\nDave 把万用表的电路原理图和用户手册喂给了它。\n模型一边用 Ghidra 反编译，一边对照原理图和台湾晶宏 HY3131 测量芯片的数据手册找对应关系。\n把芯片里的每一个寄存器、每一个物理引脚，全都还原成了人类看得懂的变量名。\n\n接下来才是最绝的地方。\n写出来的 C 代码，怎么保证功能跟原来一模一样？\n它在电脑里，自己写了一个 STM32 芯片和外围电路的软件模拟器。\n整个固件一共拆出 796 个函数。\n除了库函数和中断，691 个应用函数全部用纯 C 语言重构。\n它给每一个函数配了测试用例，总共跑了 591 轮模拟比对。\n在模拟器里，原版机器码跑一遍，新写的 C 代码也跑一遍。\n对比寄存器输出、对比内存数据、对比外设写入。\n为了防止自己偷懒，它甚至故意往测试用例里塞错误代码，确认测试框架能不能抓出异常。\n\n甚至还顺手修了一个原版代码隐藏的缺陷。\n万用表开机有一个 1 毫秒倒计时的启动画面。\n原版代码把计数变量放在中断服务程序里累加，主循环在死循环里不停读取这个变量。\n但原作者漏写了一个关键的 volatile 关键字。\n以前的老编译器可能没问题，但用现代 GCC 编译时，优化器直接把变量缓存到寄存器里了，导致主循环死锁。\nAI 在模拟器里抓出了这个时序异常，随手给变量补上了 volatile。\n\n最后重新编译出来的固件，体积只有 90KB。\n原版的官方固件是 124KB。\n之前社区网友手工逆向出的汇编版本，有 142KB。\n体积缩水了近三分之一，代码更紧凑了。\n\n真机实测怎么样？\nDave 把重新编译好的固件刷回这台被切开外壳的万用表。\n开机，屏幕正常亮起，显示版本号 V2.05。\n拿基准源测 10V 直流电压，读数精准。\n测 10kΩ 电阻，通过。\n读内部温度，26.6 度，跟实验室空调开机后的室温一模一样。\n最后测最容易出问题的蓝牙通信：\n打开电脑端的配套软件，万用表瞬间被识别，测量数据实时传输过来。\n在嵌入式开发里，蓝牙通信能跑通，说明底层的时钟、中断嵌套、状态机和外设协议栈全是对的。\n\n不过，整个过程也有让人哭笑不得的插曲。\n在把固件刷回硬件的那一刻，Dave 差点被逼疯。\n本来人工往单片机里烧录 90KB 数据，插上烧录器 20 秒就能搞定。\n结果这个 AI 严谨过了头。\n点下烧录后，它非要反向反编译一遍刚刚编译好的固件，重新校验时钟、重新比对内存对齐。\n在终端里足足折腾了 12 分钟，烧掉了上万个计算额度。\nDave 在视频里直翻白眼：\n它是不是故意绕远路帮公司消耗用户额度？\n而且硬件的物理开关它依然动不了。\n遇到切换测量量程的挡位开关，AI 只能在终端里打字求助：\n请人类帮我把旋钮拧一下。\n\n但牢骚归牢骚，结果摆在眼前。\n以前嵌入式软件的逆向工程，是极少数资深工程师的独门绝技。\n不仅要懂汇编、懂芯片架构，还要对着厚厚的数据手册一点点抠时序。\n现在一个工程师，花 20 美元账号月费，给一个明确的目标，放手让它自己调工具、搭模拟器、跑闭环测试。\n不到 24 小时，一套原本闭源的万用表固件，变成了人人可读、随时可以二次开发的开源 C 源码。\n整个软件工程的底层规则，真的彻底变了。","topic":"一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录","frame_type":["机制"],"citations":[],"channel_note":"","identity_notice":"","source_type":"generated","status":"published","generated_at":"2026-11-03 21:29:27","legal_anchor_count":0,"transcript_citation_count":0,"seo_title":"一块芯片逆向一整夜：Dave Jones 用 Claude Code 还原万用表固件实录","description":"澳洲老极客 Dave Jones 尝试用 Claude Code 逆向 121GW 万用表的 124KB 闭源固件。在没有源码的情况下，AI 自行调用 Ghidra 反编译、结合原理图对齐寄存器语义，并自建模拟器跑完 591 轮硬件状态比对与投毒测试，甚至修复了原版漏写 volatile 的底层缺陷。","domain":"ai","domain_label":"AI 与大模型","domain_label_en":"AI & LLMs","domain_url":"https://mubeitech.com/deep?domain=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","published_at":"2026-11-03T21:29:27Z"}