Extensión del exportador de archivos de objetos para Ghidra
Esta extensión de Ghidra permite exportar partes de un programa como archivos objeto. Estos archivos de objetos tienen metadatos válidos (símbolos, tablas de reubicación...) y, como tales, pueden ser reutilizados directamente por una cadena de herramientas para su posterior procesamiento.
Los casos de uso incluyen:
- Parcheo binario avanzado, aprovechando el enlazador para reparar las partes originales y modificadas juntas en lugar de hacer este trabajo a mano;
- Puertos de software, aislando el código independiente del sistema de un programa y reemplazando el resto;
- Convertir programas o archivos objeto de un formato de archivo a otro;
- Crear bibliotecas, extrayendo partes de un programa y reutilizándolas en otro contexto;
- Proyectos de descompilación, dividiendo un programa en múltiples archivos objeto y reimplementando estos al estilo Ship of Theseus ;
- …
Matriz de arquitecturas de conjuntos de instrucciones y archivos de objetos compatibles:
| x86 | MIPS |
---|
CAFÉ | ✅ | |
DUENDE | ✅ | ✅ |
Edificio (CLI)
- Clona este repositorio;
- Defina la variable de entorno
GHIDRA_INSTALL_DIR
para que apunte a su directorio de instalación de Ghidra; - Ejecute
gradle buildExtension
.
El archivo de extensión Ghidra se creará dentro del directorio dist/
.
Instalación
- Descargue la extensión desde la página de lanzamientos o compílela localmente;
- Instale la extensión en su instancia de Ghidra con
File > Install Extensions…
; - Habilite el complemento
RelocationTableSynthesizedPlugin
con File > Configure
dentro de una ventana de CodeBrowser.
Uso
- Seleccione un conjunto de direcciones en la vista de listado;
- Ejecute el analizador
Relocation table synthesizer
(disponible en modo de una sola vez); - Invoque un exportador de archivos de objetos reubicables con
File > Export Program…
Las reubicaciones reconstruidas se pueden ver con Window > Relocation table (synthesized)
.
- ️ El analizador del sintetizador de tablas de reubicación se basa en una base de datos Ghidra completamente poblada (con símbolos, tipos de datos y referencias declarados correctamente) para funcionar. La información incorrecta o faltante puede provocar reubicaciones rotas o no descubiertas durante el análisis.
- ️ Los exportadores de archivos de objetos dependen de los resultados del analizador del sintetizador de la tabla de reubicación para poder funcionar. En caso de duda, ejecute este analizador justo antes de exportar un archivo objeto para asegurarse de que el contenido de la tabla de reubicación esté actualizado con el estado actual del programa.
¿Cómo funciona?
Los archivos objeto se componen de tres partes:
- Bytes de sección reubicables;
- Una tabla de símbolos;
- Una mesa de reubicación.
Cuando se invoca un vinculador para generar un ejecutable a partir de un conjunto de archivos objeto:
- Diseñe sus secciones en la memoria;
- Calcule las direcciones de los símbolos en el espacio de direcciones virtuales;
- Aplique las reubicaciones basadas en las direcciones finales de los símbolos en los bytes de la sección.
Normalmente, la tabla de reubicación se descarta después de este proceso, así como la tabla de símbolos si no se mantienen los símbolos de depuración, dejando solo los bytes de la sección no reubicables. Sin embargo, mediante un análisis cuidadoso, estos datos se pueden recrear, lo que nos permite luego desvincular efectivamente el programa nuevamente en archivos objeto.