Qué hace el descompilador de Ghidra y qué no puede recuperar
Ghidra analiza instrucciones, flujo de control, convenciones de llamada, símbolos y tipos de datos para representar una función como pseudocódigo legible. El descompilador ayuda a localizar decisiones, bucles, argumentos, valores de retorno y relaciones entre funciones que llaman y funciones llamadas.
El resultado no es el C o C++ original. La compilación elimina nombres y tipos, combina expresiones, reorganiza operaciones e inserta funciones. Por eso cada nombre, tipo o expresión debe tratarse como una hipótesis. Una conclusión sólida también debe encajar con las instrucciones de Listing y con las referencias cercanas.
Esta página se concentra en Decompiler. Para crear un proyecto, importar un archivo, ejecutar Auto Analysis y aprender CodeBrowser, empieza por el tutorial de Ghidra para principiantes.
Usa el pseudocódigo como un mapa legible del comportamiento del código máquina, no como prueba del fuente original.
Abrir Decompiler y sincronizarlo con Listing
Abre el programa en CodeBrowser cuando Auto Analysis haya terminado. Si no ves el panel, selecciona Window > Decompiler. Al elegir una función definida en Listing o Symbol Tree, el pseudocódigo debe cambiar a esa función y resaltar la sentencia relacionada con la instrucción seleccionada.
Empieza desde una referencia fiable: una cadena única, una llamada importada, un símbolo exportado, un mensaje de error o un punto de entrada conocido. Sigue las referencias hasta la función llamadora y espera a que finalice la descompilación antes de valorar el resultado.
Si aparece que no existe una función, define sus límites solo cuando el desensamblado y las referencias lo respalden. Si el lenguaje del procesador o la base de imagen son incorrectos, corrige primero la importación.
- 1
Elegir un ancla
Busca una cadena, símbolo, importación o dirección relacionada con el comportamiento que quieres explicar.
- 2
Seguir la referencia
Abre la función que usa el ancla y confirma que Listing, Symbol Tree y Decompiler apuntan al mismo lugar.
- 3
Esperar al análisis
Deja terminar las tareas en segundo plano y después lee la función desde sus entradas hasta el retorno.

Cómo leer el pseudocódigo de Ghidra sin confiar ciegamente
Lee primero la firma: tipo de retorno, parámetros y convención de llamada condicionan toda la función. Nombres como param_1, local_18, FUN_00401230 o undefined8 indican que faltan pruebas, no que el programa original utilizara esos identificadores. Sigue el origen, los cambios y el destino de cada valor.
Después identifica condiciones, bucles, llamadas, accesos a memoria y rutas de retorno. Abre una función llamada con doble clic, vuelve con el historial de navegación y revisa las referencias antes de decidir para qué sirve una llamada.
La optimización puede volver complicada una expresión sencilla o hacer que varias operaciones parezcan demasiado limpias. Comprueba en Listing la dirección de los saltos, constantes, signo de los valores, aritmética de punteros y efectos secundarios.
| Pista | Significado probable | Qué comprobar |
|---|---|---|
| param_1 / local_10 | Parámetro o local desconocido | Usos, pila y llamadores |
| FUN_... | Función sin nombre | Llamadores, cadenas e importaciones |
| undefined4 / undefined8 | Tamaño conocido, tipo incierto | Registros, conversiones y memoria |
| goto o bucle extraño | Flujo recuperado | Saltos y Function Graph |
| muchas conversiones | Tipos o firma incorrectos | Signo, punteros y prototipo |
Mejorar el resultado con nombres, firmas y tipos de datos
La calidad aumenta cuando el proyecto contiene datos más precisos. Cambia el nombre de una función solo si llamadas, cadenas, importaciones o flujo de datos respaldan su función. Nombra variables por su responsabilidad y utiliza comentarios para registrar pruebas o dudas, no para repetir el pseudocódigo.
Una firma incorrecta propaga conversiones y aritmética de punteros engañosas a todos los llamadores. Corrige el retorno, los parámetros y la convención de llamada. Aplica estructuras, enumeraciones, matrices y punteros cuando los mismos desplazamientos o constantes se repitan con coherencia.
Haz un cambio respaldado por pruebas cada vez y revisa las funciones llamadoras. Así puedes detectar pronto una suposición atractiva pero incorrecta.
- 1
Renombrar símbolos estables
Utiliza nombres parciales y descriptivos solo cuando la evidencia visible respalde ese papel.
- 2
Corregir el prototipo
Ajusta retorno, parámetros, convención de llamada y profundidad de puntero antes de pulir variables locales.
- 3
Aplicar tipos reutilizables
Crea estructuras y enumeraciones cuando los mismos desplazamientos o valores aparezcan en varias funciones.
- 4
Revisar llamadores
Comprueba que la nueva firma aclara funciones cercanas sin crear contradicciones.
Comprobar las conclusiones en Listing y Function Graph
Listing conserva las instrucciones y datos por dirección. Úsalo para confirmar qué comparación controla un salto, si un valor tiene signo, dónde vuelve una llamada y si una escritura ocurre antes o después de una comprobación. El resaltado cruzado facilita relacionar pseudocódigo e instrucciones.
Function Graph resulta útil con condiciones anidadas, retornos tempranos y bucles. Sigue las aristas verdaderas y falsas, identifica bloques compartidos y vuelve al descompilador para resumir cada ruta en lenguaje claro.
En hallazgos importantes, anota la dirección de la función, la instrucción o bloque decisivo, las referencias relevantes y tu nivel de confianza. Esa evidencia seguirá siendo útil aunque cambien los tipos y la presentación.

Por qué la descompilación se ve incorrecta o incompleta
Un mal resultado suele indicar que faltan datos de análisis. Revisa lenguaje del procesador, especificación del compilador, mapa de memoria, base de imagen, límites de función, firma y resultados de los analizadores antes de culpar al descompilador.
La ofuscación, código empaquetado, ensamblador manual, llamadas indirectas, excepciones, optimización agresiva y funciones automodificables limitan la recuperación. Reduce la pregunta a un salto, una estructura o un llamador en lugar de esperar código limpio para todo el programa.
| Síntoma | Causa probable | Siguiente revisión |
|---|---|---|
| No hay función | Límites sin definir | Referencias y desensamblado |
| Instrucciones absurdas | Lenguaje o base incorrectos | Importación y mapa de memoria |
| Demasiadas conversiones | Firma o tipos erróneos | Prototipo, signo y punteros |
| Faltan llamadas | Flujo indirecto o análisis incompleto | XRefs y sitios de llamada |
| Pseudocódigo muy complejo | Optimización u ofuscación | Fragmentos menores y Function Graph |
Flujo repetible de práctica en 20 minutos
Usa un programa propio, un binario de código abierto, un reto educativo o un archivo que tengas permiso para analizar. Impórtalo en un laboratorio aislado, ejecuta Auto Analysis, localiza una cadena de éxito o error, sigue su referencia y explica la función decisiva con palabras sencillas.
Renombra solo símbolos justificables, corrige una firma o un tipo, compara la condición principal en Listing y usa Function Graph si el flujo no está claro. Termina con una conclusión y las direcciones que la respaldan. Repite el proceso antes de automatizar con PyGhidra.
Consulta la ayuda oficial de Decompiler. Instala la versión verificada con la guía de instalación de Ghidra y guarda copias de los proyectos antes de actualizarlos.
- 0-5 minutos: localizar una cadena, importación, símbolo o dirección fiable.
- 5-10 minutos: leer entradas, llamadas, condiciones, escrituras y retorno.
- 10-15 minutos: mejorar un nombre, firma o tipo con evidencia.
- 15-20 minutos: verificar la ruta decisiva y registrar la conclusión.
Preguntas sobre el descompilador de Ghidra
¿Ghidra recupera el código fuente original?
No. Genera pseudocódigo parecido a C a partir del código máquina y de los datos del análisis. Los nombres, comentarios, tipos y estructura originales suelen haberse perdido.
¿Cómo se abre la ventana Decompiler?
Abre un programa en CodeBrowser, elige Window > Decompiler si el panel está oculto y selecciona una función definida en Listing o Symbol Tree.
¿Por qué aparecen undefined8 y muchas conversiones?
Ghidra conoce el tamaño pero no tiene un tipo fiable, o la firma es incorrecta. Revisa llamadores, registros, signo, profundidad de puntero y desplazamientos repetidos.
¿Ghidra puede descompilar C++?
Puede analizar código nativo generado desde C++, pero plantillas, clases, excepciones, inlining, optimización y símbolos eliminados reducen la similitud con el fuente.
¿Debo confiar en Decompiler o en Listing?
En ambos. Decompiler acelera la comprensión; Listing aporta la evidencia por dirección para confirmar saltos, llamadas, constantes, memoria y efectos secundarios.