La representación intermedia Grammatech para binarios (GTIRB) es un análisis de código de máquina y una estructura de datos de reescritura. Está destinado a facilitar la comunicación de IR binaria entre programas que realizan desmontaje binario, análisis, transformación e impresión bonita. GTIRB se modela en LLVM-IR, y busca servir una funcionalidad similar de la comunicación e interoperabilidad alentadora entre las herramientas.
El resto de este archivo describe varios aspectos de GTIRB:
GTIRB tiene la siguiente estructura. Las líneas continuas denotan la herencia. Las líneas punteadas denotan referencia por UUID.
Una instancia de GTIRB puede incluir múltiples módulos ( Module ) que representan objetos cargables como ejecutables o bibliotecas, un gráfico de flujo de control interprocedural ( IPCFG ) y tablas de datos auxiliares ( AuxData ) que pueden contener resultados de análisis arbitrarios en formatos definidos por el usuario que pueden hacer referencia fácilmente a otros elementos del IR. Cada módulo contiene información como símbolos ( Symbol ) y secciones que poseen los bytes reales y los datos y los bloques de código del módulo. El CFG consiste en bloques básicos ( Block ) y bordes de flujo de control entre estos bloques. Cada datos o bloque de código hace referencia a un rango de bytes en un intervalo de byte ( ByteInterval ). Una sección puede contener un intervalo de bytes grande que contiene todos los bloques, si se definen las posiciones relativas de los bloques en esa sección, o puede contener un intervalo de byte por bloque, si no se definen las posiciones relativas de los bloques, por ejemplo, para los bloques de código en la sección .text durante la reescritura del programa. Cada símbolo contiene un puntero al bloque o el dato que hace referencia.
GTIRB explícitamente no representa la semántica de instrucciones o instrucciones, pero proporciona información simbólica de operando y acceso a los bytes. Hay muchos idiomas intermedios (IL) para la representación de la semántica de instrucciones (por ejemplo, BAP's BIL, Angr's Vex o el código P de Ghidra). GTIRB funciona con estas o cualquier otra IL almacenando instrucciones de manera general y eficiente como bytes de código de máquina sin procesar y almacenando por separado la información de flujo simbólico y de control. El popular decodificador/codificador Capstone/Keystone proporciona una excelente opción para leer y escribir instrucciones de/a la representación de bytes de código de máquina de GTIRB sin comprometerse con ninguna IL semántica particular. Al admitir múltiples IL y el almacenamiento separado de los resultados de análisis en las tablas de datos auxiliares, GTIRB permite la colaboración entre análisis binario independiente y reescritura de equipos y herramientas.
GTIRB proporciona el intercambio de información adicional, por ejemplo, resultados de análisis, en forma de objetos AuxData . Estos pueden almacenar mapas y vectores de tipos básicos de GTIRB de manera portátil. El manual de GTIRB describe la estructura de los tipos comunes de datos auxiliares, como la información de límite de funciones, la información de tipo o los resultados de los análisis comunes en esquemas estándar de AuxData.
Cada elemento de GTIRB --- EG, módulos ( Module ), símbolos ( Symbol ) y bloques ( Block ) --- tiene un identificador universalmente único (UUID). Los UUID permiten que tanto los componentes IR de primera clase como las tablas AuxData sean elementos de referencia del IR.
Las instrucciones y los operandos simbólicos pueden abordarse mediante el Offset de clase que encapsula un UUID (que se refiere al bloque de la instrucción) y un desplazamiento.
Actualmente existen paquetes para instalar fácilmente GTIRB (y herramientas de asistencia, incluidos DDISASM DISSEMBLER y GTIRB-PPRINTER Pretty Printer) en Windows y Ubuntu 20. Consulte a continuación las instrucciones. Además, existe una imagen pública de Docker en Grammatech/Ddisasm con todas estas herramientas instaladas. GTIRB está versión con Major.Minor.Patch Versión donde los incrementos de la versión principales requerirán cambios de origen significativos, pero deberían ser muy raros, los incrementos de versión menor pueden requerir pequeños cambios de fuente, y los incrementos de la versión de parche no deberían romper ninguna construcción aguas abajo. Todavía no proporcionamos compatibilidad de ABI en ningún cambio de versión.
La última API estable GTIRB Python se puede instalar desde PYPI usando PIP:
pip install gtirbLa última versión inestable de la API de Python se puede instalar desde una rueda preconstruida:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl Es fundamental que la elección de un paquete stable o unstable coincida con los paquetes de DDISASM y GTIRB-respirador instalados.
Las versiones de Windows están empaquetadas como archivos .zip y están disponibles en https://download.grammatech.com/gtirb/files/windows-release/.
Los paquetes para Ubuntu 20 están disponibles en el repositorio GTIRB Apt y pueden instalarse según las siguientes instrucciones.
Primero, agregue la tecla APT de Grammatech.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Luego actualice su archivo Sources.List.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listDónde:
[distribution] es focal (actualmente, solo hay 20 paquetes disponibles)[component] es stable , que contiene la última versión versionada, o unstable , que contiene la cabeza del repositorio.Finalmente, actualice la base de datos de su paquete e instale las herramientas Core GTIRB:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm Advertencia : versiones estables GTIRB-2.0.0, GTIRB-SPRINTER-2.1.0, DDISASM-1.8.0 y más confía en metapackages que causan conflictos si intenta apt-get upgrade (ver #63). En este caso, desinstale y reinstale los paquetes que obtuvo del repositorio de GTIRB. Es posible que deba usar dpkg --remove para eliminar los metapackages (por ejemplo, ddisasm ) antes de eliminar los paquetes de versiones de concreto (por ejemplo, ddisasm-1.5.1 ). Las versiones estables más nuevas ya no dependen de metapackages y se pueden actualizar sin problemas.
La API C ++ de GTIRB debería construir con éxito 64 bits con compiladores de GCC, Clang y Visual Studio que admiten al menos C ++ 17. GTIRB utiliza CMake que debe instalarse con al menos la versión 3.10.
El proceso de construcción común se ve así:
mkdir build
cd build
# Note: You may wish to add some -D arguments to the next command. See below.
cmake < path/to/gtirb >
cmake --build .
# Run the test suite.
ctestPara personalizar la compilación GTIRB, puede obtener una lista de opciones de personalización navegando a su directorio de compilación y ejecutando:
cmake -LHPara construir e instalar GTIRB, se deben instalar los siguientes requisitos:
cmake .libprotobuf-dev y protobuf-compiler .GTIRB está diseñado para ser serializado utilizando Google Protocol Buffers (es decir, ProtoBuf), lo que permite un uso fácil y eficiente de cualquier lenguaje de programación.
GTIRB también se puede usar a través de una API dedicada implementada en varios idiomas. Las API proporcionan estructuras de datos eficientes adecuadas para su uso mediante análisis binario y aplicaciones de reescritura; Vea a continuación para más detalles.
GTIRB utiliza un formato serializado que consiste en una firma de 8 bytes seguida de datos de protoBUF serializados. Los datos de ProtoBuf permiten la exploración y la manipulación en el lenguaje de su elección. La página de inicio de Google Protocol Buffers enumera los idiomas en los que se pueden usar buffers de protocolo directamente; Los usuarios de otros idiomas pueden convertir los datos formatados en formato de ProtoBuf a formato JSON y luego usar los datos JSON en sus aplicaciones.
El directorio proto en este repositorio contiene las definiciones de tipo de mensaje del búfer de protocolo para GTIRB. Puede inspeccionar estos archivos .proto para determinar la estructura de los diversos tipos de mensajes GTIRB. El tipo de mensaje de nivel superior es IR .
Para obtener más detalles, consulte el uso de datos serializados de GTIRB.
La API GTIRB está actualmente disponible en C ++, Python y Common Lisp. Hay una API Java parcial que no está lista para uso externo. Para la información de API independiente del lenguaje, consulte los componentes GTIRB. Para obtener información sobre las diferentes implementaciones de API, consulte: