Grammatech中間表現のバイナリ(GTIRB)は、マシンコード分析とデータ構造の書き換えです。これは、バイナリ分解、分析、変換、およびきれいな印刷を実行するプログラム間のバイナリIRの通信を促進することを目的としています。 GTIRBはLLVM-IRをモデル化しており、ツール間のコミュニケーションと相互運用性を促進する同様の機能を提供しようとしています。
このファイルの残りの部分は、GTIRBのさまざまな側面について説明しています。
GTIRBには次の構造があります。実線は継承を示します。点線は、UUIDによる参照を示します。
GTIRBのインスタンスには、実行可能ファイルやライブラリなどの読み込み可能なオブジェクト、操作間制御フローグラフ( IPCFG )、および補助データテーブル( AuxData )を表す複数のモジュール( Module )が含まれる場合があります。各モジュールには、モジュールの実際のバイトとデータとコードブロックを保持するシンボル( Symbol )やセクションなどの情報が保持されます。 CFGは、これらのブロック間の基本ブロック( Block )と制御フローエッジで構成されています。各データまたはコードブロックは、バイト間隔( ByteInterval )のバイトの範囲を参照しています。セクションは、すべてのブロックを保持する1つの大きなバイト間隔を保持する場合があります - そのセクションのブロックの相対位置が定義されている場合 - またはブロックごとに1つのバイト間隔を保持する場合があります---プログラムの書き換え中の.textセクションのコードブロックの場合、ブロックの相対位置が定義されていない場合。各シンボルは、参照するブロックまたはデータムへのポインターを保持します。
GTIRBは明示的に指示や命令セマンティクスを表しませんが、象徴的なオペランド情報とバイトへのアクセスを提供します。命令セマンティクスの表現のための多くの中間言語(IL)があります(例えば、Bap's Bil、Angr's Vex、またはGhidraのPコード)。 GTIRBは、一般的かつ効率的に生のマシンコードバイトとして命令を保存し、シンボリックおよび制御フロー情報を個別に保存することにより、これらまたは他のILと連携します。人気のあるCapstone/Keystone Decoder/Encoderは、特定のセマンティックILにコミットすることなく、GTIRBのマシンコードバイト表現からの指示を読み書きするための優れたオプションを提供します。複数のILSをサポートし、分析の個別のストレージにより、補助データテーブルの結果が得られます。GTIRBにより、独立したバイナリ分析とチームとツールの書き換えのコラボレーションが可能になります。
GTIRBは、 AuxDataオブジェクトの形での追加情報(分析結果などの共有を提供します。これらは、基本的なGTIRBタイプのマップとベクトルをポータブルな方法で保存できます。 GTIRBマニュアルでは、関数境界情報、タイプ情報、または標準のauxDataスキーマの一般的な分析の結果など、一般的なタイプの補助データの構造について説明します。
GTIRBのすべての要素---例えば、モジュール( Module )、シンボル( Symbol )、およびブロック( Block )---普遍的に一意の識別子(UUID)があります。 UUIDでは、IRの要素を参照するために、ファーストクラスのIRコンポーネントとauxDataテーブルの両方を可能にします。
命令とシンボリックオペランドは、UUID(命令のブロックを指す)とオフセットをカプセル化するクラスOffsetによって対処できます。
Windowsおよびubuntu 20にwindowsに簡単にインストールするためのパッケージ(およびGTIRB(およびDDISASM ResassemblerとGTIRB-PPRINTER PRETIAL PRETIAL PREATY PRINTERを含むアテンダントツーリング)を簡単にインストールするためのパッケージが存在します。説明については以下を参照してください。さらに、これらすべてのツールがインストールされているため、Grammatech/DDISASMには公開Docker画像が存在します。 GTIRBはMajor.minor.patchバージョンでバージョンされています。ここでは、メジャーバージョンの増分には大幅なソースの変更が必要ですが、非常にまれである必要があります。マイナーバージョンの増分には小さなソースの変更が必要になる場合があり、パッチバージョンの増分はダウンストリームビルドを破ることはできません。バージョンの変更にわたってABI互換性をまだ提供していません。
最新の安定したGTIRB Python APIは、PIPを使用してPYPIからインストールできます。
pip install gtirbPython APIの最新の不安定なバージョンは、事前に構築されたホイールからインストールできます。
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl stableパッケージまたはunstableパッケージの選択が、インストールされているDDISASMとGTIRB-PPRINTERパッケージと一致することが重要です。
Windowsリリースは.zipファイルとしてパッケージ化されており、https://download.grammatech.com/gtirb/files/windows-release/で入手できます。
Ubuntu 20のパッケージは、GTIRB APTリポジトリで利用でき、以下の指示に従ってインストールできます。
まず、GrammatechのAPTキーを追加します。
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -次に、sources.listファイルを更新します。
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listどこ:
[distribution] focalです(現在、Ubuntu 20パッケージのみが利用可能です)[component]はstableおり、最後のバージョンリリースを保持するか、リポジトリのヘッドを保持するunstable 。最後に、パッケージデータベースを更新し、コアGTIRBツールをインストールします。
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm警告:安定したバージョンGTIRB-2.0.0、GTIRB-PPRINTER-2.1.0、DDISASM-1.8.0以降は、 apt-get upgradeを試みた場合に競合を引き起こすメタパッケージに依存しています(#63を参照)。この場合、GTIRBリポジトリから入手したパッケージをアンインストールして再インストールします。コンクリートバージョンのパッケージ( ddisasm-1.5.1など)を削除する前に、 dpkg --removeを使用してメタパッケージ( ddisasmなど)を削除する必要がある場合があります。新しい安定したバージョンは、メタパッケージに依存せず、問題なくアップグレードできます。
GTIRBのC ++ APIは、少なくともC ++ 17をサポートするGCC、Clang、およびVisual Studioコンパイラを使用して、64ビットで正常に構築する必要があります。 GTIRBは、少なくともバージョン3.10でインストールする必要があるCmakeを使用します。
一般的なビルドプロセスは次のようになります:
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.
ctestGTIRBビルドをカスタマイズするには、ビルドディレクトリにナビゲートして実行することにより、カスタマイズオプションのリストを取得できます。
cmake -LHGTIRBを構築およびインストールするには、次の要件をインストールする必要があります。
cmakeを介してこのバージョンを提供します。libprotobuf-devとprotobuf-compilerを介してこのバージョンを提供します。GTIRBは、Googleプロトコルバッファー(IE、ProtoBUF)を使用してシリアル化されるように設計されており、プログラミング言語から簡単で効率的な使用を可能にします。
GTIRBは、複数の言語で実装された専用のAPIを介して使用することもできます。 APIは、バイナリ分析とアプリケーションの書き換えに適した効率的なデータ構造を提供します。詳細については、以下をご覧ください。
GTIRBは、8バイトの署名に続いてシリアル化されたプロトブフデータで構成されるシリアル化形式を使用します。 Protobufデータは、選択した言語での探索と操作を可能にします。 Google Protocol Buffersホームページには、プロトコルバッファを直接使用できる言語がリストされています。他の言語のユーザーは、ProtoBuf形式のデータをJSON形式に変換し、アプリケーションでJSONデータを使用できます。
このリポジトリのproto Directoryには、GTIRBのプロトコルバッファーメッセージタイプ定義が含まれています。これらの.protoファイルを検査して、さまざまなGTIRBメッセージタイプの構造を決定できます。トップレベルのメッセージタイプはIRです。
詳細については、シリアル化されたGTIRBデータの使用を参照してください。
GTIRB APIは現在、C ++、Python、およびCommon Lispで利用可能です。外部使用の準備ができていない部分的なJava APIがあります。言語に依存しないAPI情報については、GTIRBコンポーネントを参照してください。さまざまなAPI実装の詳細については、以下を参照してください。