La représentation intermédiaire Grammatech pour les binaires (GTIRB) est une analyse de code machine et réécrire la structure des données. Il est destiné à faciliter la communication de l'IR binaire entre les programmes effectuant un démontage binaire, une analyse, une transformation et une jolie impression. GTIRB est modélisé sur LLVM-IR et cherche à servir une fonctionnalité similaire d'encourager la communication et l'interopérabilité entre les outils.
Le reste de ce fichier décrit divers aspects de GTIRB:
GTIRB a la structure suivante. Les lignes pleines indiquent l'héritage. Les lignes pointillées indiquent la référence par UUID.
Une instance de GTIRB peut inclure plusieurs modules ( Module ) qui représentent des objets chargés tels que des exécutables ou des bibliothèques, un graphique de flux de contrôle interprocédural ( IPCFG ) et des tableaux de données auxiliaires ( AuxData ) qui peuvent maintenir l'analyse arbitraire des formats dans des formats définis par l'utilisateur qui peuvent facilement référencer d'autres éléments de l'IR. Chaque module contient des informations telles que les symboles ( Symbol ) et les sections qui contiennent elles-mêmes les octets réels et les données et les blocs de code du module. Le CFG se compose de blocs de base ( Block ) et de bords d'écoulement de contrôle entre ces blocs. Chaque bloc ou bloc de code fait référence à une plage d'octets dans un intervalle d'octets ( ByteInterval ). Une section peut contenir un intervalle de gros octet tenant tous les blocs --- Si les positions relatives des blocs dans cette section sont définies --- ou peuvent contenir un intervalle d'octets par bloc --- Si les positions relatives des blocs ne sont pas définies, par exemple pour les blocs de code dans la section .text lors de la réécriture du programme. Chaque symbole contient un pointeur vers le bloc ou la référence qu'il fait référence.
GTIRB ne représente explicitement pas les instructions ou la sémantique d'instructions mais fournit des informations d'opérande symbolique et l'accès aux octets. Il existe de nombreuses langues intermédiaires (IL) pour la représentation de la sémantique d'instruction (par exemple, BAP's BIL, ANGR'S VEX ou GHIDRA'S P-CODE). GTIRB travaille avec ceux-ci ou tout autre IL en stockant les instructions généralement et efficacement en tant qu'octets de code de machine bruts et en stockant séparément les informations de flux symbolique et de contrôle. Le décodeur / encodeur Capstone / Keystone populaire offre une excellente option pour lire et écrire des instructions de / vers la représentation des octets de code machine de GTIRB sans s'engager dans un IL sémantique particulier. En prenant en charge plusieurs IL et un stockage séparé des résultats de l'analyse dans les tables de données auxiliaires GTIRB permet une collaboration entre des équipes et des outils de réécriture binaires indépendants.
GTIRB prévoit le partage d'informations supplémentaires, par exemple les résultats de l'analyse, sous la forme d'objets AuxData . Ceux-ci peuvent stocker des cartes et des vecteurs de types de GTIRB de base de manière portable. Le manuel GTIRB décrit la structure des types communs de données auxiliaires telles que les informations de limite de fonction, les informations de type ou les résultats des analyses courantes dans les schémas Auxdata standard.
Chaque élément de GTIRB --- par exemple, modules ( Module ), symboles ( Symbol ) et blocs ( Block ) --- a un identifiant universellement unique (UUID). Les UUID permettent à la fois les composants IR de première classe et les tables Auxdata aux éléments de référence de l'IR.
Les instructions et les opérandes symboliques peuvent être traités par le Offset de la classe qui résume un UUID (qui fait référence au bloc de l'instruction) et à un décalage.
Des packages existent actuellement pour l'installation facilement de GTIRB (et d'outillage des préposés, y compris le DDisasm Disassebler et GTIRB-pprinter Pretty Imprimante) sur Windows, et Ubuntu 20. Voir ci-dessous pour les instructions. De plus, une image Docker public existe sur Grammatech / DDisasm avec tous ces outils installés. GTIRB est versé avec Major.Minor.Patch versioning où les augmentations de version majeure nécessiteront des modifications de source importantes, mais devraient être très rares, les incréments de version mineure peuvent nécessiter de petites modifications de source et les incréments de version du correctif ne devraient pas rompre les builds en aval. Nous ne fournissons pas encore la compatibilité ABI sur les changements de version.
La dernière API GTIRB Python stable peut être installée à partir de PYPI à l'aide de PIP:
pip install gtirbLa dernière version instable de l'API Python peut être installée à partir d'une roue prédéfinie:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl Il est essentiel que le choix d'un package stable ou unstable correspond aux packages DDISASM et GTIRB-PPRINTER installés.
Les versions Windows sont emballées sous forme de fichiers .zip et sont disponibles sur https://download.grammatech.com/gtirb/files/windows-release/.
Des packages pour Ubuntu 20 sont disponibles dans le référentiel GTIRB APT et peuvent être installés selon les instructions suivantes.
Tout d'abord, ajoutez la clé APT de Grammatech.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Mettez ensuite à jour votre fichier sources.list.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listOù:
[distribution] est focal (actuellement, seuls les packages Ubuntu 20 sont disponibles)[component] est soit stable , qui contient la dernière version versionnée, soit unstable , qui contient la tête du référentiel.Enfin mettez à jour votre base de données de packages et installez les outils Core GTIRB:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm AVERTISSEMENT : Versions stables GTIRB-2.0.0, GTIRB-PPRINTER-2.1.0, DDISASM-1.8.0 et plus anciennes reposent sur des métapackages qui provoquent des conflits si vous essayez apt-get upgrade (voir # 63). Dans ce cas, désinstaller et réinstaller les packages que vous avez obtenus du référentiel GTIRB. Vous devrez peut-être utiliser dpkg --remove pour supprimer les métapackages (par exemple ddisasm ) avant de supprimer les packages versionnés en béton (par exemple ddisasm-1.5.1 ). Les versions stables plus récentes ne reposent plus sur les métapackages et peuvent être améliorées sans problèmes.
L'API C ++ de GTIRB devrait construire avec succès en 64 bits avec les compilateurs GCC, Clang et Visual Studio prenant en charge au moins C ++ 17. GTIRB utilise CMake qui doit être installé avec au moins la version 3.10.
Le processus de construction commun ressemble à ceci:
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.
ctestPour personnaliser la version GTIRB, vous pouvez obtenir une liste d'options de personnalisation en accédant à votre répertoire de construction et en cours d'exécution:
cmake -LHPour construire et installer GTIRB, les exigences suivantes doivent être installées:
cmake .libprotobuf-dev et protobuf-compiler .GTIRB est conçu pour être sérialisé à l'aide de tampons de protocole Google (c.-à-d. Protobuf), permettant une utilisation facile et efficace à partir de tout langage de programmation.
GTIRB peut également être utilisé via une API dédiée implémentée dans plusieurs langues. Les API fournissent des structures de données efficaces adaptées à une utilisation par analyse binaire et réécriture des applications; Voir ci-dessous pour plus de détails.
GTIRB utilise un format sérialisé qui se compose d'une signature de 8 octets suivie de données protobuf sérialisées. Les données Protobuf permettent l'exploration et la manipulation dans la langue de votre choix. Le protocole Google tamponne la page d'accueil répertorie les langues dans lesquelles les tampons de protocole peuvent être utilisés directement; Les utilisateurs d'autres langues peuvent convertir les données format par protobuf au format JSON, puis utiliser les données JSON dans leurs applications.
Le répertoire proto dans ce référentiel contient les définitions de type de message de tampon de protocole pour GTIRB. Vous pouvez inspecter ces fichiers .proto pour déterminer la structure des différents types de messages GTIRB. Le type de message de niveau supérieur est IR .
Pour plus de détails, voir en utilisant les données GTIRB sérialisées.
L'API GTIRB est actuellement disponible en C ++, Python et Lisp commun. Il existe une API Java partielle qui n'est pas prête pour une utilisation externe. Pour les informations API indépendantes du langage, voir les composants GTIRB. Pour plus d'informations sur les différentes implémentations d'API, voir: