RetDec - Descompilador de código máquina retargetable
RetDec (Retargetable Decompiler, por Avast) es un descompilador de código máquina de código abierto que convierte binarios compilados nuevamente en código legible de alto nivel. “Retargetable” es la propiedad clave: en lugar de ser construido para una arquitectura, levanta muchos conjuntos de instrucciones — x86, ARM, MIPS, PIC32, PowerPC — a LLVM IR, luego descompila esa representación común a C o pseudocódigo tipo Python. Se ejecuta de forma independiente e integra con IDA, Ghidra y radare2.
Instalación
| Método | Cómo |
|---|
| Build de release | Descargar el paquete precompilado desde GitHub Releases |
| Desde source | Build de CMake (ver docs de build del repo) |
| Docker | docker run -v "$PWD:/dst" retdec/retdec |
| Verificar | retdec-decompiler --version |
Descompilación básica
| Comando | Descripción |
|---|
retdec-decompiler binary.exe | Descompilar a binary.exe.c |
retdec-decompiler -o out.c binary | Elegir la ruta de salida |
retdec-decompiler --backend-no-debug binary | Salida más limpia |
retdec-decompiler --cleanup binary | Eliminar archivos intermedios |
retdec-decompiler --help | Lista completa de opciones |
# Descompilar y leer el resultado
retdec-decompiler suspicious.exe
less suspicious.exe.c
| Flag | Produce |
|---|
| (por defecto) | Código fuente C |
-f py | Pseudocódigo tipo Python |
--backend-emit-cfg | Grafos de flujo de control |
--backend-emit-cg | Grafo de llamadas |
--config out.json | Configuración/resultados de análisis estructurados |
| LLVM IR | Salida .ll intermedia durante la descompilación |
Arquitecturas soportadas
| Arquitectura | Formatos |
|---|
| x86 / x86-64 | PE, ELF, Mach-O |
| ARM / Thumb | ELF, PE, raw |
| MIPS | ELF, raw |
| PIC32 | ELF, Intel HEX |
| PowerPC | ELF |
La cobertura amplia de arquitectura hace que RetDec sea particularmente útil para trabajo embebido y firmware, donde binarios MIPS y PIC32 son comunes y los descompiladores mainstream ofrecen menos.
Opciones útiles
| Opción | Efecto |
|---|
-a arch | Forzar una arquitectura |
-e endian | Establecer endianness (little/big) |
-m mode | Modo: bin, raw, ll |
--raw-entry-point ADDR | Punto de entrada para binarios raw |
--raw-section-vma ADDR | Dirección de carga para código raw |
--select-ranges A-B | Descompilar solo un rango de direcciones |
--select-functions f1,f2 | Descompilar funciones específicas |
# Blob de firmware raw: decirle a RetDec cómo cargarlo
retdec-decompiler -m raw -a mips -e big \
--raw-entry-point 0x80000000 --raw-section-vma 0x80000000 firmware.bin
Características de análisis
| Característica | Proporciona |
|---|
| Detección de formato de archivo | Parsing de PE/ELF/Mach-O |
| Detección de compilador/packer | Huella digital de la cadena de herramientas |
| ID de función basada en firma | Reconocer código de librería cargado estáticamente |
| Reconstrucción de tipos | Recuperar estructuras y tipos |
| Uso de info de debug | DWARF/PDB cuando disponible |
La identificación de función de librería importa mucho en la práctica: te permite saltar los miles de líneas de libc cargado estáticamente y enfocarte en la lógica propia de la aplicación.
Integraciones
| Herramienta | Plugin |
|---|
| IDA Pro | Plugin RetDec para IDA |
| Ghidra | Plugin RetDec para Ghidra |
| radare2 | r2retdec |
| API | Descompilar programáticamente vía CLI/config |
RetDec vs otros descompiladores
| Aspecto | RetDec | Ghidra | Hex-Rays (IDA) | Binary Ninja |
|---|
| Costo | Libre/código abierto | Libre/código abierto | Comercial | Comercial |
| Arquitecturas | Muchas (incl. PIC32) | Muchas | Muchas (por licencia descompilador) | Muchas |
| Interactivo | No (batch) | Sí (GUI) | Sí | Sí |
| Mejor para | Descompilación batch/scripted, embebido | RE interactivo | Salida de máxima calidad | API/UX modernos |
Complementa Ghidra para trabajo interactivo — RetDec destaca para pipelines automatizados y arquitecturas inusuales.
Recursos