Die Grammatech -Zwischendarstellung für Binärdateien (GTIRB) ist eine Maschinencode -Analyse und Umschreibung der Datenstruktur. Es ist beabsichtigt, die Kommunikation von Binär -IR zwischen Programmen zu erleichtern, die eine binäre Demontage, Analyse, Transformation und hübsches Druck durchführen. GTIRB ist LLVM-IR modelliert und versucht, eine ähnliche Funktionalität der Förderung der Kommunikation und Interoperabilität zwischen den Tools zu erfüllen.
Der Rest dieser Datei beschreibt verschiedene Aspekte von GTIRB:
GTIRB hat die folgende Struktur. Durchgezogene Linien bezeichnen die Vererbung. Gepunktete Linien bezeichnen die Referenz durch UUID.
Eine Instanz von GTIRB kann mehrere Module ( Module ) umfassen, die ladbare Objekte wie ausführbare oder Bibliotheken darstellen, ein Inter-proceduraler Steuerungsdurchflussgraphen ( IPCFG ) und Hilfsdatentabellen ( AuxData ), die beliebige Analyseergebnisse in benutzerdefinierten Formaten auf anderen Elementen des IR-Elements verweisen können. Jedes Modul enthält Informationen wie Symbole ( Symbol ) und Abschnitte, die selbst die tatsächlichen Bytes, Daten und Codeblöcke des Moduls enthalten. Die CFG besteht aus Basisblöcken ( Block ) und Kontrollflusskanten zwischen diesen Blöcken. Jede Daten oder Code blockieren auf einen Bereich von Bytes in einem Byte -Intervall ( ByteInterval ). Ein Abschnitt kann ein großes Byte-Intervall enthalten, das alle Blöcke hält-wenn die relativen Positionen von Blöcken in diesem Abschnitt definiert sind-oder können ein Byte-Intervall pro Block enthalten-, wenn die relativen Positionen von Blöcken nicht definiert sind, z. B. für die Codeblöcke im Abschnitt .text -Abschnitt während des Programms. Jedes Symbol hält einen Zeiger auf den Block oder das Datenverweis.
GTIRB stellt explizit keine Anweisungen oder Anweisungssemantik dar, liefert jedoch symbolische Informationen und Zugriff auf die Bytes. Es gibt viele Zwischensprachen (IL) für die Darstellung der Unterrichtssemantik (z. B. BIPs BIL, ANGRs Vex oder Ghidras P-Code). GTIRB arbeitet mit diesen oder einem anderen IL zusammen, indem sie Anweisungen im Allgemeinen und effizient als RAW-Maschinencode-Bytes speichern und die symbolischen und Steuerflussinformationen separat gespeichert haben. Der beliebte Capstone/Keystone Decoder/Encoder bietet eine hervorragende Option zum Lesen und Schreiben von Anweisungen von/zu GTIRBs Maschinencode-Byte-Darstellung, ohne sich auf ein bestimmtes semantisches IL zu verpflichten. Durch die Unterstützung mehrerer ILs und die separate Speicherung der Analyse in Hilfsdatentabellen ermöglicht GTIRB die Zusammenarbeit zwischen unabhängigen Binäranalysen und Umschreiben von Teams und Tools.
GTIRB sieht den Austausch zusätzlicher Informationen, z. B. Analyseergebnisse, in Form von AuxData -Objekten vor. Diese können Karten und Vektoren grundlegender GTIRB -Typen auf tragbare Weise speichern. Das GTIRB -Handbuch beschreibt die Struktur für gemeinsame Arten von Hilfsdaten wie Funktionen für Funktionen, Typinformationen oder Ergebnisse gemeinsamer Analysen in Standard -AuxData -Schemata.
Jedes Element von GTIRB --- z. B., Modulen ( Module ), Symbolen ( Symbol ) und Blöcken ( Block )-hat eine universell eindeutige Kennung (UUID). UUIDs ermöglichen sowohl erstklassige IR-Komponenten als auch AuxData-Tabellen, um Elemente des IR zu referenzieren.
Anweisungen und symbolische Operanden können durch den Offset angegangen werden, der eine UUID (die sich auf den Block der Anweisung bezieht) und einen Offset zusammenfasst.
Derzeit bestehen Pakete, um GTIRB (und die mit dem Begleitungstatentimen enthaltenen Tools, einschließlich des DDISASM-Disassemblers und des GTIRB-PPRINTER-Pretters) unter Windows, und Ubuntu 20 zu installieren. Weitere Informationen finden Sie im Folgenden. Darüber hinaus gibt es ein öffentliches Docker -Bild bei Grammatech/ddisasm, wobei all diese Tools installiert sind. GTIRB ist mit Major.minor.Patch -Versioning versioniert, bei dem Hauptversionswachsen erhebliche Quellenänderungen erfordern, aber sehr selten sein sollten, Minor -Versions -Inkremente sind möglicherweise kleine Quelländerungen, und Patch -Versions -Inkremente sollten keine nachgelagerten Builds brechen. Wir bieten noch keine ABI -Kompatibilität für Änderungen der Versionsänderungen.
Die neueste stabile GTIRB -Python -API kann von PYPI unter Verwendung von PIP installiert werden:
pip install gtirbDie neueste instabile Version der Python -API kann aus einem vorgebauten Rad installiert werden:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl Es ist wichtig, dass die Auswahl eines stable oder unstable Pakets mit den installierten DDISASM- und GTIRB-PPRINTER-Paketen übereinstimmt.
Windows Releases sind als .zip-Dateien verpackt und sind unter https://download.grammatech.com/gtirb/files/windows-release/ verfügbar.
Pakete für Ubuntu 20 sind im GTIRB -APT -Repository erhältlich und können gemäß den folgenden Anweisungen installiert werden.
Fügen Sie zuerst Grammatechs passende Schlüssel hinzu.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Aktualisieren Sie als nächstes Ihre Datei mit Quellen.List.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listWo:
[distribution] ist focal (derzeit sind nur Ubuntu 20 Pakete verfügbar)[component] ist entweder stable , das die zuletzt versionierte Version oder unstable ist, die den Kopf des Repositorys hält.Aktualisieren Sie schließlich Ihre Paketdatenbank und installieren Sie die Core GTIRB -Tools:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm WARNUNG : Stabile Versionen GTIRB-2.0.0, GTIRB-PPRINTER-2.1.0, DDISASM-1.8.0 und älter verlassen sich auf Metapackages, die Konflikte verursachen, wenn Sie apt-get upgrade versuchen (siehe #63). In diesem Fall deinstallieren und installieren Sie die Pakete, die Sie vom GTIRB -Repository erhalten haben. Möglicherweise müssen Sie dpkg --remove verwenden, um die Metapackages (z. B. ddisasm ) zu entfernen, bevor Sie die versionierten Betonpakete (z. B. ddisasm-1.5.1 ) entfernen. Neuere stabile Versionen verlassen sich nicht mehr auf Metapackages und können ohne Probleme aufgerüstet werden.
Die C ++-API von GTIRB sollte erfolgreich in 64 Bit mit GCC-, Clang- und Visual Studio-Compilern aufbauen, die mindestens C ++ 17 unterstützen. GTIRB verwendet CMake, das mit mindestens Version 3.10 installiert werden muss.
Der gemeinsame Build -Prozess sieht folgendermaßen aus:
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.
ctestFür das Anpassen des GTIRB -Builds erhalten Sie eine Liste der Anpassungsoptionen, indem Sie zu Ihrem Build -Verzeichnis und ausgeführt werden:
cmake -LHUm GTIRB zu erstellen und zu installieren, sollten die folgenden Anforderungen installiert werden:
cmake .libprotobuf-dev und protobuf-compiler .GTIRB wurde so konzipiert, dass sie mit Google Protocol -Puffern (dh Protobuf) serialisiert werden, um eine einfache und effiziente Verwendung in jeder Programmiersprache zu ermöglichen.
GTIRB kann auch über eine dedizierte API verwendet werden, die in mehreren Sprachen implementiert ist. Die APIs liefern effiziente Datenstrukturen, die für die Verwendung von Binäranalysen und Umschreiben von Anwendungen geeignet sind. Weitere Informationen finden Sie unten.
GTIRB verwendet ein serialisiertes Format, das aus einer 8-Byte-Signatur besteht, gefolgt von serialisierten Protobufdaten. Die Protobuf -Daten ermöglichen Erforschung und Manipulation in der Sprache Ihrer Wahl. In der Homepage der Google Protocol Puffer listet die Sprachen auf, in denen Protokollpuffer direkt verwendet werden können. Benutzer anderer Sprachen können die protobufformatierten Daten in JSON-Format konvertieren und dann die JSON-Daten in ihren Anwendungen verwenden.
Das proto in diesem Repository enthält die Definitionen des Protokollpuffernachrichten -Typs für GTIRB. Sie können diese .proto -Dateien inspizieren, um die Struktur der verschiedenen GTIRB -Nachrichtentypen zu bestimmen. Der Nachrichtentyp der obersten Ebene ist IR .
Weitere Informationen finden Sie unter Verwendung serialisierter GTIRB -Daten.
Die GTIRB -API ist derzeit in C ++, Python und Common Lisp erhältlich. Es gibt eine teilweise Java -API, die nicht für den externen Gebrauch bereit ist. Für sprachunabhängige API-Informationen siehe GTIRB-Komponenten. Informationen zu den verschiedenen API -Implementierungen finden Sie unter: