Un descompilador que recupera el algoritmo, no solo el código
A menudo las organizaciones necesitan entender software del que no tienen el código fuente: un sistema antiguo, un componente comprado, algo que ha llegado y tiene mala pinta. Ya existen herramientas que convierten el código máquina de vuelta en pasos legibles. RetDec Imortek intenta ir un paso más allá y poner nombre a esos pasos — esta parte es el Estándar de Cifrado Avanzado (AES), esta parte es una ordenación, esta parte es cómo se empaquetan los datos para enviarlos.
El RetDec v5.0 upstream lleva inactivo desde 2022. Sigue siendo uno de los pocos descompiladores abiertos con un front end de verdad amplio — y esa amplitud merece la pena mantenerla viva.
Qué es esto, en un minuto
El software se entrega como algo que lee una máquina y una persona no. Cuando no hay código fuente — el proveedor ya no está, el contrato nunca lo incluyó, el archivo llegó de un sitio del que no te fías — nadie puede decir qué hace realmente el programa. Comprobarlo a mano significa leer instrucciones máquina de una en una.
Desmonta el archivo compilado y reconstruye C a partir de él: los 216 binarios del corpus de prueba vuelven como C compilable. Después va a por el significado — qué criptografía, qué ordenación, qué hilos, qué formato de archivo — e informa de con qué frecuencia eso funciona, incluido el caso en que apenas lo hace.
Equipos de seguridad que desmontan malware y necesitan la respuesta antes que el código. Empresas que ejecutan software del que nadie tiene el fuente y necesitan una descripción antes de poder rehacer o sustituir nada con seguridad. Cualquiera atrapado con un formato de archivo que nunca se documentó — registros antiguos, una máquina que solo habla con su propio software.
El decodificador real, compilado a WebAssembly
Todo lo que hay por encima de esto es un recorrido guionizado por la escalera de abstracción. Este es el primer peldaño funcionando de verdad: Capstone — el mismo desensamblador que enlaza la compilación nativa de RetDec — decodificando los bytes que pegues.
capstone — WebAssembly
791 kilobytes (KB) porque un decodificador x86 de verdad lleva todo el juego de instrucciones — cada codificación, prefijo y extensión. Ese es el tamaño honesto de la cosa.
deps/capstone.
Formatos nativos, de bytecode y emergentes
La salida depende del formato, porque fingir que todo se descompila a C no ayuda a nadie. El front end acepta binarios nativos en Formato Ejecutable y Enlazable (ELF), Ejecutable Portable (PE) y Mach-O; bytecode, incluidos los archivos class de la Máquina Virtual de Java (JVM), Ejecutable de Dalvik (DEX) y Lenguaje Intermedio Común (CIL); y objetivos más nuevos como la Ejecución Paralela de Hilos (PTX) de CUDA.
ELF · PE · Mach-O
Produce pseudocódigo C, más la capa semántica que es el motivo del fork.
Python · Lua · JVM · DEX · CIL
El bytecode de Python y Lua vuelve a sus propios lenguajes; las rutas de código gestionado emiten salida de la familia Java o de la familia C#.
WebAssembly · CUDA PTX
WebAssembly se convierte al formato de texto de WebAssembly (WAT). PTX se trata como una entrada de primera clase y no como un añadido.
Mira cómo una función sube la escalera de abstracción
Elige una función binaria y hazla avanzar por la cadena: bytes en crudo, desensamblado, IR elevado, pseudocódigo C y, al final, el veredicto semántico — el algoritmo con nombre, con las pruebas que lo identificaron.
retdec — extracción de especificaciones
Veredicto semántico
Pruebas
Con los símbolos eliminados, la recuperación tiene que salir solo de la estructura — constantes, número de rondas, forma del flujo de control. Ese es el caso difícil, y al que se refiere el F1 medido de 0,056.
Seis familias de estructura
Contenedores de la Biblioteca Estándar de Plantillas (STL) y estructuras del runtime de C++ — la forma de un std::vector reapareciendo a partir del patrón de asignación.
AES, la familia de algoritmos de hash seguro (SHA), ChaCha20, Rivest–Shamir–Adleman (RSA) y primitivas de curva elíptica, identificadas por constantes y estructura de rondas.
Introsort, merge sort, búsqueda binaria — incluido el cambio por límite de profundidad que delata a introsort.
Algoritmos de grafos, más patrones de recorrido de búsqueda en anchura (BFS) y en profundidad (DFS).
std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) y atómicos en crudo.
Protobuf, FlatBuffers, MessagePack, Notación de Objetos de JavaScript (JSON) y encuadre de Lenguaje de Marcado Extensible (XML).
216 binarios, y el número que duele
Los 216 binarios ELF del corpus de pruebas producen C compilable con
--buildable, que está activado por defecto. La recuperación de algoritmos es otra historia, y la forma honesta de contarla es poner los dos números uno al lado del otro.
| Métrica | Resultado | Condición |
|---|---|---|
| Salida en C compilable | 216 / 216 | --buildable, activado por defecto |
| F1 de recuperación de algoritmos | 0.056 | Sin nombres, intervalo de confianza del 95% 0,034–0,083 |
| F1 de recuperación de algoritmos | 1.000 | Con ayuda de nombres, binarios con símbolos |
El .c por defecto recompila | No | Ni este fork ni el RetDec original |
Opcional, sin conexión y con controles
El refinamiento pasa por llama.cpp con modelos GGUF, del todo sin conexión, solo cuando
RETDEC_NEURAL_REFINE=1 y se indica una ruta a un modelo. Está desactivado por defecto y nunca sustituye a la línea base.
- Control de compilación. La salida refinada tiene que pasar
gcc -fsyntax-onlyantes de que se acepte. - Validación estructural. El refinamiento tiene que seguir correspondiéndose con la estructura elevada.
- Se conserva la línea base determinista. La salida sin refinar del descompilador sigue siendo el artefacto auditable. Si tienes que defender un hallazgo, defiendes esa.
- Sin red. Inferencia GGUF local. Nada de tu binario sale de la máquina.
$ export RETDEC_NEURAL_REFINE=1 $ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf $ retdec-decompiler --buildable ./target.elf
Averigua lo que hace un programa cuando ya no está el código fuente
El software se distribuye como algo que una máquina puede leer y una persona no. Esto lo vuelve a desmontar y te dice, en términos llanos, qué está haciendo el programa en realidad.
Equipos de seguridad que desmontan malware
En lugar de páginas de código ilegible, obtienes la respuesta: esta parte revuelve datos, esta parte es cómo llama a casa, esta parte es cómo se esconde. Eso es lo que un analista necesita primero.
Empresas con software viejo y sin código fuente
El sistema sigue llevando el negocio, y quien lo escribió se fue hace años. Esto recupera una descripción de lo que hace, que es lo que hace falta antes de que nadie pueda reconstruirlo o sustituirlo con seguridad.
Cualquiera atascado con un formato de archivo que nadie documentó
Registros antiguos, una máquina que solo habla con su propio software, el archivo de exportación de un competidor. Esto averigua la estructura para que tu propio software pueda leerlo.
Interfaz gráfica de usuario (GUI) en Qt 6, o ninguna
Vistas de código sincronizadas entre C, ensamblador, IR y grafos de flujo de control, con navegación de funciones, inspección de cadenas, un explorador de binarios y un panel asistente. El modo sin interfaz elimina toda dependencia de GUI, así que la misma compilación funciona en integración continua (CI).
La Licencia Pública General Affero de GNU (AGPL-3.0+) para uso de código abierto, o una licencia comercial para despliegue propietario. Copyright Odin Loch, que opera como Imortek, 2025–2026.
Distribuible en v2.0.21. Los controles de CI reflejan estándares de madurez de desarrollo, no de producción — lo dice el proyecto, no es una inferencia.