二進製文件(GTIRB)的Grammatech中間表示是機器代碼分析和重寫數據結構。它旨在促進執行二進制拆卸,分析,轉換和漂亮印刷的程序之間二進制IR的通信。 GTIRB是在LLVM-IR上建模的,並試圖發揮類似的功能,以鼓勵工具之間的溝通和互操作性。
該文件的其餘部分描述了GTIRB的各個方面:
GTIRB具有以下結構。實線表示繼承。虛線用uuid表示參考。
GTIRB的實例可能包括多個模塊( Module ),這些模塊(模塊)表示可加載的對象,例如可執行文件或庫,術間控制流程圖( IPCFG )和輔助數據表(AUXDATA),這些數據表( AuxData )可以保存任意分析,這些分析可容納用戶定義的格式,這些格式可以輕鬆參考IR的其他元素。每個模塊都包含信息,例如符號( Symbol )和部分,這些信息本身保存了模塊的實際字節,數據和代碼塊。 CFG由這些塊之間的基本塊( Block )和控制流動邊緣組成。每個數據或代碼塊引用一個字節間隔中的一系列字節範圍( ByteInterval )。一個部分可以容納一個大字節間隔,如果定義了該部分中的塊的相對位置 - 或可以在程序重寫期間的.text部分中的代碼塊中的塊相對位置,則可以在每個塊中保持一個字節間隔。每個符號都有指向其引用的塊或基準的指針。
GTIRB明確表示指令或指令語義,但確實提供了符號操作數信息和對字節的訪問。有許多用於代表語義的中間語言(IL)S(例如Bap's Bil,Angr's Vex或Ghidra的P-Code)。 GTIRB通過將指令通常作為原始機器代碼字節存儲並分別存儲符號和控制流信息,與這些IL一起使用。流行的Capstone/Keystone解碼器/編碼器提供了一個絕佳的選擇,可以在不承諾任何特定的語義IL的情況下讀取和編寫GTIRB的機器代碼字節表示。通過支持多個IL和單獨的分析存儲會導致輔助數據表GTIRB可實現獨立的二進制分析與重寫團隊和工具之間的協作。
GTIRB以AuxData對象的形式提供了其他信息,例如分析結果。這些可以以便攜式方式存儲基本GTIRB類型的地圖和向量。 GTIRB手冊描述了常見類型的輔助數據的結構,例如功能邊界信息,類型信息或標準Auxdata schemata中常見分析的結果。
gtirb的每個元素---例如,模塊( Module ),符號( Symbol )和塊( Block )---具有普遍唯一的標識符(UUID)。 UUID允許一流的IR組件和AUXDATA表參考IR的元素。
指令和符號操作數可以通過封裝UUID(指指令塊)和偏移量的類Offset來解決。
當前存在的軟件包可輕鬆在Windows上輕鬆安裝GTIRB(包括Ddisasm拆卸器和GTIRB-PPRINTER PROTICTER)和UBUNTU 20。有關說明,請參見下文。此外,在Grammatech/ddisasm上存在一個公共碼頭圖像,並安裝了所有這些工具。 GTIRB版本由Major.Minor.Patch版本使用,其中主要版本增量需要重大的源更改,但應該非常罕見,次要版本增量可能需要較小的源更改,並且補丁版本增量不應破壞任何下游構建。我們尚未在任何版本更改中提供ABI兼容性。
最新穩定的GTIRB Python API可以使用PIP從PIPPA安裝:
pip install gtirb最新的不穩定版本的Python API可以從預製的車輪中安裝:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl至關重要的是, stable或unstable軟件包的選擇與已安裝的DISASM和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 -下一個更新您的源文件。
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.list在哪裡:
[distribution]是focal (目前,只有20個包裹可用)[component]是stable ,它具有最後版本的版本或unstable ,該版本保存著存儲庫的頭部。最後更新您的軟件包數據庫並安裝Core GTIRB工具:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm警告:穩定版本GTIRB-2.0.0,GTIRB-PPRINTER-2.1.0,DISASM-1.8.0及以上及以上的依賴Metapackages,如果您嘗試嘗試apt-get upgrade ,則會引起衝突(請參閱#63)。在這種情況下,卸載並重新安裝了您從GTIRB存儲庫中獲得的軟件包。您可能需要使用dpkg --remove來刪除Metapackages(例如ddisasm ),然後再刪除混凝土版本的軟件包(例如ddisasm-1.5.1 )。較新的穩定版本不再依賴Metapackages,並且可以在沒有問題的情況下升級。
GTIRB的C ++ API應該在64位中成功構建,GCC,Clang和Visual Studio編譯器至少支持C ++ 17。 GTIRB使用CMAKE,必須至少使用3.10版安裝。
共同的構建過程看起來像這樣:
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.
ctest對於自定義GTIRB構建,您可以通過導航到構建目錄和運行來獲取自定義選項的列表:
cmake -LH要構建和安裝GTIRB,應安裝以下要求:
cmake提供此版本。libprotobuf-dev和protobuf-compiler提供了此版本。GTIRB旨在使用Google協議緩衝區(IE,ProtoBuf)序列化,從而可以輕鬆有效地使用任何編程語言。
GTIRB也可以通過多種語言實現的專用API使用。 API提供有效的數據結構,適合通過二進制分析和重寫應用程序使用;有關詳細信息,請參見下文。
GTIRB使用串行格式,該格式由8字節簽名組成,然後是序列化Protobuf數據。 Protobuf數據允許使用您選擇的語言進行探索和操縱。 Google協議緩衝器主頁列出了可以直接使用協議緩衝區的語言;其他語言的用戶可以將Protobuf-Formatted數據轉換為JSON格式,然後在其應用程序中使用JSON數據。
此存儲庫中的proto目錄包含GTIRB的協議緩衝消息類型定義。您可以檢查這些.proto文件以確定各種GTIRB消息類型的結構。頂級消息類型是IR 。
有關更多詳細信息,請參閱使用序列化GTIRB數據。
GTIRB API目前可在C ++,Python和Common LISP中使用。有一個部分Java API,該API尚未準備好外部使用。有關與語言無關的API信息,請參見GTIRB組件。有關不同API實現的信息,請參見: