
Compilación CMake de la biblioteca de especificaciones del procesador SLEIGH de Ghidra, que proporciona motores independientes de desensamblado y elevación de p-code para herramientas de ingeniería inversa.
Sleigh es un lenguaje utilizado para describir la semántica de los conjuntos de instrucciones de microprocesadores de propósito general, con suficiente detalle para facilitar la ingeniería inversa de software compilado para estas arquitecturas. Forma parte de la plataforma de ingeniería inversa Ghidra y sustenta dos de sus componentes principales: sus motores de desensamblado y descompilación.
Este repositorio proporciona un proyecto de compilación basado en CMake para Sleigh, de modo que pueda compilarse y empaquetarse como una biblioteca independiente y reutilizarse en proyectos distintos de Ghidra.
| Nombre | Soporte |
|---|---|
| Linux | Sí |
| macOS | Sí |
| Windows | Sí |
| Nombre | Versión | Paquete de Linux a instalar | Paquete de Homebrew de macOS a instalar |
|---|---|---|---|
| (compilaciones HEAD) zlib | Reciente | zlib1g-dev | zlib |
| Git | Última | git | N/A |
| CMake | 3.18+ | cmake | cmake |
NOTA: Este proyecto de CMake descarga el código fuente de Ghidra desde internet durante la configuración. Consulte la nota sobre la sección del código fuente de Ghidra para obtener más detalles.
Para compilar la documentación:
| Nombre | Versión | Paquete de Linux a instalar | Paquete de Homebrew de macOS a instalar |
|---|---|---|---|
| Doxygen | Última | doxygen | doxygen |
| GraphViz | Última | graphviz | graphviz |
# Clone this repository (CMake project for sleigh)
git clone https://github.com/lifting-bits/sleigh.git
cd sleigh
# Configure CMake
cmake -B build -S .
# Build Sleigh
cmake --build build --parallel 8
# Install Sleigh
cmake --install build --prefix ./install
El código fuente de Ghidra no está realmente incluido en este repositorio git y, de forma predeterminada, CMake descargará automáticamente una versión estable desde internet por usted.
Consulte src/README.md para obtener más información sobre cómo personalizar qué commit del código fuente de Ghidra se utilizará/compilará, incluida la posibilidad de especificar su propia copia local del código fuente de Ghidra.
La configuración de CMake también admite la compilación de paquetes para Sleigh.
Por ejemplo:
# Package Sleigh
cmake --build build --target package
Se ha incluido un programa de ejemplo llamado sleigh-lift para demostrar cómo usar la API de Sleigh. Toma una cadena hexadecimal de bytes y puede desensamblarla o elevarla a p-code. El programa se puede invocar de la siguiente manera, donde el argumento action debe ser disassemble o pcode:
sleigh-lift [action] [sla_file] [bytes] [-a address] [-p root_sla_dir] [-s pspec_file]
Por ejemplo, para desensamblar la siguiente cadena de bytes:
$ sleigh-lift disassemble x86-64.sla 4881ecc00f0000
0x00000000: SUB RSP,0xfc0
Y para elevarla a p-code:
$ sleigh-lift pcode x86-64.sla 4881ecc00f0000
(register,0x200,1) = INT_LESS (register,0x20,8) (const,0xfc0,8)
(register,0x20b,1) = INT_SBORROW (register,0x20,8) (const,0xfc0,8)
(register,0x20,8) = INT_SUB (register,0x20,8) (const,0xfc0,8)
(register,0x207,1) = INT_SLESS (register,0x20,8) (const,0x0,8)
(register,0x206,1) = INT_EQUAL (register,0x20,8) (const,0x0,8)
(unique,0x12c00,8) = INT_AND (register,0x20,8) (const,0xff,8)
(unique,0x12c80,1) = POPCOUNT (unique,0x12c00,8)
(unique,0x12d00,1) = INT_AND (unique,0x12c80,1) (const,0x1,1)
(register,0x202,1) = INT_EQUAL (unique,0x12d00,1) (const,0x0,1)
Si no desea compilar sleigh-lift, debe establecer la opción de variable de CMake sleigh_BUILD_EXTRATOOLS en OFF durante la configuración de CMake.
Este repositorio contiene un helper que no forma parte de Sleigh/Ghidra, el cual puede encontrar en el directorio support. Tiene la siguiente firma y puede ayudar al usuario a encontrar la ubicación de un archivo de especificación dado en el sistema:
std::optional<std::filesystem::path>
FindSpecFile(std::string_view file_name,
const std::vector<std::filesystem::path> &search_paths =
gDefaultSearchPaths);
La función sleigh::FindSpecFile buscará en las rutas proporcionadas por el usuario a través del argumento search_paths un archivo de especificación con el nombre file_name. El argumento predeterminado para search_paths es sleigh::gDefaultSearchPaths, que contiene los directorios de instalación/compilación generados durante la configuración de CMake y un conjunto de ubicaciones de instalación comunes.
Si no desea compilar los helpers, debe establecer la opción de variable de CMake sleigh_BUILD_SUPPORT en OFF durante la configuración de CMake.
Una instalación de Sleigh proporciona una interfaz de CMake que puede usar al compilar su proyecto.
Puede encontrar un ejemplo de cómo usar el archivo de configuración del paquete de CMake en el ejemplo de find_package.
También proporcionamos una función auxiliar de CMake sleigh_compile para compilar sus archivos .slaspec usando un compilador de sleigh.
Puede encontrar un ejemplo de CMake más complejo con la compilación de especificaciones de Sleigh en el directorio example, que utiliza el código fuente de ejemplo de sleigh proporcionado por el upstream.
Por último, puede localizar los archivos sleigh compilados instalados a través de la variable de CMake sleigh_INSTALL_SPECDIR, que es una ruta absoluta al directorio raíz de los archivos sleigh compilados---debería inspeccionarla manualmente para saber qué esperar.
También se sugiere consultar el archivo de configuración de CMake y el archivo de CMake specfiles para obtener más información sobre las variables y módulos de CMake expuestos.
Consulte el archivo LICENSE.