Noticias

Claude Code reconstruyó en C el firmware del multímetro EEVblog 121GW en menos de 24 horas

6 min de lectura

Cómo Claude Code reconstruyó el firmware del multímetro 121GW: volcado con un ST-LINK V2, Ghidra, reescritura en C de 691 funciones comprobadas en un emulador con Unicorn (591 de 591 pruebas), compilación con GCC y prueba en el aparato, donde un primer cuelgue al configurar el reloj se corrigió con una espera. Esquema de decodigo.com con datos del repositorio de EEVblog.

Dave Jones, el ingeniero australiano detrás del canal EEVblog, le pidió a Claude Code, en un solo prompt, que hiciera ingeniería inversa del firmware de su multímetro 121GW y lo pasara a C. En menos de 24 horas, el agente de Anthropic reconstruyó el bootloader y la aplicación, los compiló con GCC y los probó contra el original en un emulador. Los dos ya funcionan en el multímetro real, y el código está en GitHub con licencia MIT.

El 121GW es el multímetro que EEVblog vende con su marca. Lo controla un microcontrolador STM32L152 de ST y mide con un chip HY3131, y su firmware oficial llegó a la versión 2.05 en 2021. Jones quiere abrirlo para que los usuarios puedan modificarlo, y en el episodio anterior de su canal ya lo había intentado con Cursor, el servidor MCP de Reverse Engineer Anything (REA) y Claude Opus 5.5, con un primer fracaso y un multímetro que en algún momento dejó de responder. Para el episodio 1784, publicado esta semana, cambió de herramienta: Claude Code en la app de escritorio para Windows, con acceso directo a la computadora conectada al aparato.

El prompt cabe en un párrafo: el firmware corre en un STM32 conectado por un programador ST-LINK V2, el multímetro usa el chip HY3131, se adjuntan el esquema y el manual, y el objetivo es pasar todo a C, recompilarlo para comprobar que funciona igual y publicarlo como código abierto. Antes de empezar, Claude hizo cuatro preguntas. La más interesante: había encontrado en un disco de Jones el código fuente original de una versión antigua (la 1.02, de 2017) y preguntó si debía usarlo. Jones respondió que lo ignorara por completo, así que el proyecto partió solo del binario que estaba en el multímetro, y Claude decidió no abrir ningún archivo de código de ese disco.

Del binario al C, y de vuelta Cómo se reconstruyó el firmware del multímetro EEVblog 121GW 1 Volcar la memoria ST-LINK V2 por SWD lee la flash del STM32L152, dos veces: idénticas 2 Analizar en Ghidra Ghidra 12.1.4 desensambla y decompila: 794 funciones en la v2.05 3 Escribir C con Claude Code Módulo por módulo, cada función con su dirección original: /* orig: 0x08… */ 4 Comparar en un emulador Unicorn ejecuta la función nueva y la original con los mismos datos 591 de 591 pruebas iguales 5 Compilar con GCC GCC 9.2.1 y CMake generan bootloader.bin y app.bin 6 Grabar y probar ST-LINK escribe desde 0x08006000; calibración y bootloader intactos Funciona en el multímetro real Lo que el emulador no vio La primera prueba se colgó al iniciar el reloj: un detalle de tiempos. Corregido. Bucle punteado: si no coincide, se corrige.
Los pasos que siguió Claude Code para reconstruir el firmware del 121GW. Gráfica: decodigo.com con datos del repositorio de EEVblog en GitHub.

Claves del firmware reconstruido

  • Herramientas. Un ST-LINK V2 conectado por SWD a un conector del circuito, STM32CubeProgrammer para leer y escribir la memoria, Ghidra 12.1.4 para desensamblar y decompilar, y GCC 9.2.1 con CMake para compilar. El firmware original se había compilado con IAR, un compilador comercial.
  • Primero, el volcado. Claude leyó dos veces toda la memoria del microcontrolador y las dos lecturas coincidieron. La aplicación resultó idéntica, byte por byte, al archivo oficial de la versión 2.05; el bootloader del aparato, en cambio, era más nuevo que el que EEVblog tenía archivado, y fue el que se reconstruyó.
  • Las cifras. Ghidra encontró 794 funciones en la aplicación. De ellas, 691 se reescribieron en C; el resto es código de bibliotecas, como el sistema de archivos FatFs de la tarjeta SD (que se usa sin cambios) y el runtime de C, más rutinas de interrupción por omisión. En el bootloader se contabilizaron sus 234 funciones.
  • Un emulador para comprobarlo. Claude armó un emulador del STM32L1 con Unicorn que ejecuta cada función nueva junto a la original, con los mismos datos, y compara la memoria y cada escritura a los periféricos. Pasaron 591 de 591 pruebas, y la imagen completa hizo 294,266 escrituras a periféricos idénticas a las del original.
  • Lo que el emulador no vio. La primera vez que se grabó en el multímetro, el firmware se colgó al configurar el reloj. El original revisa una sola vez si el oscilador ya se apagó, y en el binario de IAR dos llamadas intermedias le daban tiempo; con GCC la revisión llegaba una instrucción después y el oscilador seguía encendido. Claude cambió esa revisión por una espera, y a partir de ahí funcionó.
  • Lo que no se toca. El bootloader de fábrica de ST, grabado en ROM, solo se documenta, porque es código de ST y no se puede reemplazar. La aplicación se graba a partir de la dirección 0x08006000, sin tocar el bootloader de la tarjeta SD ni la EEPROM donde está la calibración de cada aparato, y también se puede instalar copiándola a la tarjeta SD como una actualización normal.
  • Bluetooth. La parte del firmware que arma los paquetes de lecturas para el módulo Bluetooth y recibe sus comandos también se reconstruyó y es equivalente en emulación. El módulo es un chip aparte, con su propio firmware, que el proyecto no modifica.
  • Los tiempos. Según el historial del repositorio, el volcado se registró el 2 de noviembre a la 01:06 UTC, el bootloader en C una hora después, la aplicación completa a las 14:37 y la corrección tras la prueba en el aparato a las 21:42, unas 20 horas y media después de empezar. Los commits llevan a Claude Opus 5.5 como coautor.
  • Para revisar. El repositorio incluye el código, los scripts de Ghidra, el emulador, la documentación de la memoria y una lista de las diferencias con el original, todas en casos que el firmware no produce con datos válidos. El binario que genera GCC pesa 92,040 bytes, contra 144,616 del original.

Lo que cambia cuando desarmar un firmware cuesta un día

En el foro de EEVblog, un usuario objetó que decompilar es trabajo de Ghidra y compilar es trabajo de GCC. Jones respondió que el valor está en lo demás: Claude hizo fácil iterar las pruebas, construyó un emulador completo para comprobarlo todo, al final hizo pruebas en el hardware, encontró fallos y los corrigió sin que él interviniera, y generó toda la documentación. Agregó que usó el plan básico de Claude sin pagar uso extra. La parte más laboriosa de una ingeniería inversa no es obtener un C aproximado, sino demostrar que se comporta igual que el original, y eso es lo que hizo el arnés de pruebas.

No es un caso aislado. Un usuario del foro, zombu4, publicó en paralelo un firmware de reemplazo para el 121GW escrito en ensamblador Thumb-2, con su propio emulador y funciones nuevas, como más tipos de termopar y actualizaciones por Bluetooth. Según contó en el foro, lo escribió un modelo de IA que corre en sus propias computadoras, con Claude supervisando el proyecto, en unas 48 horas de trabajo de la IA y antes de que le llegara el multímetro. Jones probó esa versión en el mismo video. La misma facilidad tiene otra cara: en octubre, el sitio decomp.dev dejó de aceptar proyectos de decompilación de videojuegos porque la IA rompió la parte comunitaria, y unos juristas de Cornell advirtieron que las leyes de propiedad intelectual contaban con que la ingeniería inversa fuera lenta y cara. En este caso no hay conflicto, porque el dueño del producto es quien abre su propio firmware.

Para los dueños de un 121GW, el resultado es un firmware que se comporta como el oficial y que ahora cualquiera puede leer, compilar y modificar. Jones cerró el video con un capítulo titulado «Software Engineering is so OVER» («la ingeniería de software se acabó»), pero el repositorio cuenta algo más concreto: un agente de IA, con un decompilador, un compilador, un programador ST-LINK y un emulador que él mismo construyó, llevó un firmware cerrado de 2021 a código abierto que funciona en el aparato real en menos de un día.

Fuente: EEVblog 1784, «Claude Code Reverse Engineer 121GW Firmware SUCCESS!» (video); repositorio 121GW-Multimeter-Firmware-RE; 121GW-Open-Firmware de zombu4; foro de EEVblog. Imagen de portada: EEVblog.