La ingeniería inversa de procesadores no documentados ha requerido tradicionalmente meses de trabajo manual. En este artículo, los investigadores de Faraday comparten cómo un pipeline híbrido asistido por IA recuperó una arquitectura de conjunto de instrucciones propietaria, generó una especificación funcional.
Por Gastón Aznarez y Dan Borgogno, Faraday Security. Un acompañamiento a nuestra charla en Ekoparty primera edición internacional (Miami, 2026).
Detrás de un número sorprendente de dispositivos cotidianos, desde automóviles hasta dispositivos médicos, cámaras de seguridad, enrutadores y juguetes conectados, hay un chip que ejecuta código que nadie fuera del fabricante puede leer. Cuando uno de esos dispositivos tiene un fallo, la única forma de encontrarlo antes de que lo haga un atacante es observar ese chip desde dentro.
El inconveniente es que muchos de estos chips funcionan con propietario conjuntos de instrucciones sin documentación pública. La industria llama a esto “seguridad por ocultación” y, en la práctica, no protege a nadie: los atacantes bien financiados la invierten de todos modos. Las únicas personas excluidas son los investigadores independientes que podrían haberle advertido primero. Hay demasiados chips y muy pocos investigadores.
Esta es la historia de una herramienta que construimos para cambiar esa proporción, y lo que nos enseñó sobre dónde la IA realmente ayuda en la ingeniería inversa de bajo nivel.
La pared

Empezó, como suelen empezar estas cosas, por curiosidad. Compramos un vaporizador conectado (un gadget barato de consumo con pantalla táctil, Bluetooth y una aplicación complementaria) y lo desmontamos para ver qué había dentro. La parte interesante era el chip principal, un SoC JieLi. Después de un desvío por el hardware (el firmware resultó vivir dentro del chip, no en la memoria flash externa, así que construimos un pequeño circuito para extraerlo), teníamos el firmware en mano.
Luego lo abrimos en Ghidra, la herramienta estándar de ingeniería inversa, y obtuvimos una pared de código hexadecimal en bruto. Sin instrucciones, sin funciones, nada que leer.
He aquí por qué. Un programa en disco son solo bits. Convertir esos bits en algo que un humano, o un descompilador, pueda leer requiere conocer las reglas del chip Arquitectura del Conjunto de Instrucciones (ISA): qué bits son la operación, cuáles son registros, cuáles son números. Para chips convencionales como x86, ARM y MIPS, esas reglas son públicas y vienen con Ghidra. Este chip ejecuta pi32v2, una arquitectura propietaria del proveedor. Sin especificaciones públicas, sin soporte Ghidra, sin herramientas reales. Teníamos el firmware. No podíamos leerlo.
Una piedra Rosetta en el desmontaje

Tuvimos un punto de apoyo. La propia cadena de herramientas del proveedor incluía un objdump, un desensamblador que imprime los bytes crudos de cada instrucción junto a una mnemotecnia legible por humanos como add r0, r1, r2. Esa es una piedra Rosetta: las mismas instrucciones escritas en dos escrituras a la vez, la desconocida (los bits) junto a una conocida (las mnemotécnicas). Simplemente no teníamos las reglas que mapean entre ellas.
Podríamos haber realizado ingeniería inversa de la cadena de herramientas del proveedor para extraer esas reglas directamente, pero ese es otro proyecto completo. En cambio, apostamos por el propio desensamblaje y por la IA para leerlo.
Los modelos de lenguaje modernos son buenos en dos cosas que solían requerir un experto humano: reconocer patrones en texto que parece un sinsentido y razonar sobre estructuras desconocidas para deducir su significado. Recuperar una ISA del desensamblaje es exactamente ese tipo de problema. La promesa era automatizar la mayor parte del trabajo que un especialista solía hacer a mano y generalizarlo a chips que ninguna herramienta había soportado antes. Lo que tomaba meses podría tomar días.
Esa fue la promesa. La realidad nos enseñó algo más específico.
La solución: una tubería híbrida
Construimos un pipeline que toma el desensamblado como entrada y produce una especificación de procesador Ghidra (un TRINEO archivo) . Está organizado como una secuencia fija de etapas, cada una con una tarea específica. Algunas etapas son código determinista simple; algunas son un modelo de lenguaje con un prompt para una tarea específica. De manera crucial, la orquestación es determinista: el código decide qué se ejecuta a continuación, no los modelos. Cada etapa a continuación enlaza con su descripción completa en el wiki del proyecto.
Seis etapas:
- Bootstrap agrupa las instrucciones que comparten una codificación y descarta duplicados, con coincidencia de patrones pura y sin IA. Apila un puñado de instrucciones del mismo tipo y compáralas columna por columna: los bits que nunca cambian son el código de operación, los bits que varían son los campos de operando. Por ejemplo, add x1, x2, x3 y add x5, x6, x7 comparten los mismos bits fijos de código de operación y difieren solo donde se encuentran los números de registro, por lo que caen en un grupo.
- Intérprete de texto (LLM) lee los mnemónicos y calcula el significado. Dada esa agrupación de anuncios, devuelve la forma `add {REG1}, {REG2}, {REG3}`.
- Intérprete de bits mapea cada operando a posiciones de bits específicas, y es la etapa más difícil. Toma las muestras donde el primer operando es x5, luego las que es x11, luego x19, y ve qué bits permanecen fijos dentro de cada grupo: las posiciones que se mantienen estables en todas ellas son donde vive ese campo de registro (un espacio de cinco bits, para 32 registros). Y cuando un grupo contiene secretamente dos codificaciones, las divide. Un lote de cargas que parecían uniformes se divide en un solo bit selector en una forma relativa al puntero de pila y una forma relativa al registro.
- Gerente de Conocimiento acumula todo en una descripción creciente y estructurada de la arquitectura. Registra la adición como una operación ALU sobre tres registros, agrega los registros recién vistos al archivo de registros, incrementa la cobertura y levanta una bandera si el opcode de un nuevo clúster colisiona con uno que ya ha aprendido.
- Supervisor decide qué sucede a continuación: aceptar el resultado, volver a ejecutar una etapa con retroalimentación, escalar a un humano o detenerse. En nuestra ejecución LEGv8, detectó una rama cuyo campo de desplazamiento coincidía casi con ninguna de las muestras y envió el clúster de vuelta para otra pasada en lugar de confirmar una codificación defectuosa.
- Generación de trineos convierte la descripción en una especificación de Ghidra, la compila, lee los errores del compilador, los corrige y repite hasta que sea correcta. Una carga de byte como `ldurb` necesitó cuatro rondas de compilación y corrección antes de que su semántica de extensión de cero se compilara correctamente; la mayoría de las instrucciones pasaron al primer intento.

He aquí la lección, y es lo más importante que encontramos. Nuestro primer instinto fue poner un LLM en cada etapa. Falló de una manera muy consistente: los modelos son excelentes en semántica (lo que significa una instrucción) y poco fiable en aritmética de bits (qué bits exactos, cuán anchos, en qué orden). Colocarían con confianza un campo en la posición equivocada incluso con la evidencia justo delante de ellos. Así que dondequiera que el trabajo era numérico, reemplazamos el modelo con código determinista. El Intérprete de Bits ahora encuentra los límites de los campos matemáticamente y solo llama al modelo cuando las matemáticas son genuinamente ambiguas, e incluso entonces, para un juicio, no un cálculo.
Nos propusimos construir un sistema de IA multiagente. Terminamos con un híbrido: IA para el razonamiento, código determinista para todo lo contable. El marco de “IA multiagente” fue el marketing; el híbrido es la ingeniería.
¿Funciona?

Para comprobar su corrección, lo ejecutamos en MIPS, una arquitectura bien documentada donde ya conocemos la respuesta correcta. El pipeline recuperó aproximadamente 98% de las instrucciones en nuestro binario de prueba, y, dado lo anterior, aproximadamente 91% de ese trabajo se hizo sin ninguna llamada de IA. El núcleo determinista se encarga de la carga; el modelo es el especialista que llamas para el resto difícil.
Entonces el objetivo real: pi32v2, el chip del vaporizador. En aproximadamente dos horas y media y alrededor de $25 de cómputo, la pipeline produjo un plugin de Ghidra que compila y carga. El firmware, que era una pared de hexagesimal, ahora es un programa navegable: funciones, flujo de control, pseudocódigo descompilado. La diferencia entre hexagesimal en bruto y un programa que puedes leer es la diferencia entre una puerta cerrada y una abierta, y la abrimos en un chip que no tenía ninguna herramienta.
No fuimos los únicos en esta arquitectura. Mientras construíamos el pipeline, Damien Cauquil en Quarkslab reconstruyeron de forma independiente la misma familia pi32v2 a mano, trabajando a partir de la salida objdump del proveedor tal como lo hicimos nosotros, y publicaron una especificación Ghidra SLEIGH mejorada. Su informe merece la pena leerlo: semanas dedicadas a examinar listados de desensamblaje para determinar cada instrucción y averiguar cómo se codificaban sus operandos. Ese minucioso proceso manual es exactamente lo que nuestro pipeline se propone automatizar. Dos esfuerzos independientes que llegan a la misma arquitectura al mismo tiempo, uno a mano y otro automatizado, es la mejor confirmación que podríamos pedir de que el problema y los resultados son reales.
Como cualquier técnica, tiene un sobre, y conocerlo es parte de usarlo bien. El pipeline se basa en el desmontaje propio del proveedor, por lo que cuanto más rico sea esa entrada, más rico será el resultado. Ya maneja chips con tamaños de instrucción mixtos, como demostró pi32v2; la frontera abierta son arquitecturas como x86, donde no se puede saber dónde termina una instrucción sin decodificarla primero. Ese es el próximo problema a resolver.

¿Qué significa esto realmente?
La opinión generalizada es que la IA ayuda en las tareas de ingeniería inversa de alto nivel, como nombrar funciones y resumir código, mientras que el trabajo de bajo nivel sigue recayendo en las personas. Lo que hemos descubierto es que la línea divisoria no está donde la gente cree. Una IA puede operar en el semántico capa de análisis binario en una arquitectura que nunca ha visto, siempre y cuando la numérico La capa se gestiona de forma determinista junto con ella. El límite se desplazó hacia abajo, en dirección a los bits. Pero no llegó hasta el final.
Esto va más allá de un solo chip. Lo que va a cambiar en 2026 no es que la IA encuentre errores mágicos, sino la economía del trabajo. Una tarea que antes mantenía ocupado a un investigador durante meses ahora puede automatizarse en gran medida, y un sistema coordinado puede abarcar mucho más terreno que una sola persona en el mismo tiempo. Con demasiados chips y muy pocos investigadores, la clave está en la cobertura.
Consíguelo, y ¿qué viene después?
La herramienta es de código abierto en github.com/infobyte/isa_recuperacion. Toma el código desensamblado de cualquier cadena de herramientas y genera una especificación Ghidra SLEIGH. Considéralo más bien una prueba de concepto para la investigación que un producto acabado: se trata de un proyecto en curso, y lo publicamos en esta fase temprana a propósito, ya que el objetivo es aportar este enfoque y queremos que otros puedan seguir desarrollándolo a partir de aquí.

El siguiente paso elimina incluso la necesidad de una cadena de herramientas. En lugar de desensamblar, se introduce en el proceso el código del procesador comportamiento observado: ejecuta instrucciones candidatas y observa qué cambios se producen en los registros y en la memoria. La semántica proviene directamente del silicio: la misma canalización, sin necesidad de herramientas de ningún proveedor.
Y hay un aspecto matemático que nos hemos dejado aquí: una única ecuación sencilla que explica la mayor parte de las codificaciones numéricas que hemos visto en chips muy diferentes. Eso merece una entrada propia, y la tendrá.
¿Te interesa saber cómo Faraday combina su experiencia en seguridad ofensiva con la investigación basada en la inteligencia artificial? Habla con nuestro equipo y descubre cómo ayudamos a las organizaciones a detectar los riesgos de seguridad antes de que lo hagan los atacantes.
Más información sobre lo que hacemos: