Representasi menengah Grammatech untuk binari (GTIRB) adalah analisis kode mesin dan menulis ulang struktur data. Ini dimaksudkan untuk memfasilitasi komunikasi IR biner antara program yang melakukan pembongkaran biner, analisis, transformasi, dan pencetakan yang cantik. GTIRB dimodelkan pada LLVM-IR, dan berupaya melayani fungsionalitas yang sama dalam mendorong komunikasi dan interoperabilitas antar alat.
Sisa dari file ini menjelaskan berbagai aspek GTIRB:
GTIRB memiliki struktur berikut. Garis solid menunjukkan warisan. Garis putus -putus menunjukkan referensi oleh UUID.
Sebuah contoh GTIRB dapat mencakup beberapa modul ( Module ) yang mewakili objek yang dapat dimuat seperti executable atau pustaka, grafik aliran kontrol antar-prosedural ( IPCFG ), dan tabel data tambahan ( AuxData ) yang dapat menahan hasil analisis sewenang-wenang dalam format yang ditentukan pengguna yang dapat dengan mudah merujuk elemen-elemen lain dari IR. Setiap modul menyimpan informasi seperti simbol ( Symbol ) dan bagian yang memiliki byte aktual dan blok data dan kode modul. CFG terdiri dari blok dasar ( Block ) dan tepi aliran kontrol antara blok -blok ini. Setiap data atau blok kode merujuk berbagai byte dalam interval byte ( ByteInterval ). Suatu bagian dapat memegang satu interval byte besar yang memegang semua blok --- jika posisi relatif blok di bagian itu didefinisikan --- atau dapat memegang satu interval byte per blok --- jika posisi relatif blok tidak ditentukan, misalnya untuk blok kode di bagian .text Teks selama penulisan ulang program. Setiap simbol memegang pointer ke blok atau datum yang dirujuk.
GTIRB secara eksplisit tidak mewakili instruksi atau semantik instruksi tetapi memberikan informasi operan simbolik dan akses ke byte. Ada banyak bahasa menengah (IL) untuk representasi semantik instruksi (misalnya, BAP's BIL, ANGR's VEX, atau kode P Ghidra). GTIRB bekerja dengan ini atau IL lainnya dengan menyimpan instruksi secara umum dan efisien sebagai byte kode mesin mentah dan secara terpisah menyimpan informasi aliran simbolik dan kontrol. Decoder/Encoder Capstone/Keystone populer memberikan opsi yang sangat baik untuk membaca dan menulis instruksi dari/ke representasi byte kode mesin GTIRB tanpa berkomitmen pada IL semantik tertentu. Dengan mendukung beberapa IL dan penyimpanan yang terpisah dari hasil analisis dalam tabel data tambahan GTIRB memungkinkan kolaborasi antara analisis biner independen dan tim penulisan ulang dan alat.
GTIRB menyediakan untuk berbagi informasi tambahan, misalnya hasil analisis, dalam bentuk objek AuxData . Ini dapat menyimpan peta dan vektor tipe GTIRB dasar dengan cara portabel. Manual GTIRB menjelaskan struktur untuk jenis -jenis umum data tambahan seperti informasi batas fungsi, jenis informasi, atau hasil analisis umum dalam skema auxdata standar.
Setiap elemen GTIRB --- misalnya, modul ( Module ), simbol ( Symbol ), dan blok ( Block ) --- memiliki pengidentifikasi unik yang unik (UUID). UUID memungkinkan komponen IR kelas satu dan tabel auxdata ke elemen referensi IR.
Instruksi dan operan simbolik dapat diatasi oleh Offset kelas yang merangkum UUID (yang mengacu pada blok instruksi) dan offset.
Paket saat ini ada untuk dengan mudah menginstal GTIRB (dan alat petugas termasuk Ddisasm Disassembler dan GTIRB-PPRINTER Printer Printer) di Windows, dan Ubuntu 20. Lihat di bawah untuk instruksi. Selain itu, gambar Docker publik ada di Grammatech/Ddisasm dengan semua alat ini diinstal. GTIRB di versi dengan Major.Minor.Patch Versioning di mana peningkatan versi utama akan memerlukan perubahan sumber yang signifikan tetapi harus sangat jarang, peningkatan versi minor mungkin memerlukan perubahan sumber kecil, dan peningkatan versi patch tidak boleh merusak build hilir. Kami belum memberikan kompatibilitas ABI di seluruh perubahan versi.
API Python GTIRB stabil terbaru dapat dipasang dari PYPI menggunakan PIP:
pip install gtirbVersi API Python terbaru yang tidak stabil dapat dipasang dari roda prebuilt:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl Sangat penting bahwa pilihan paket stable atau unstable cocok dengan paket DDISASM dan GTIRB-PPRINTER yang terpasang.
Rilis Windows dikemas sebagai file .zip dan tersedia di https://download.grammatech.com/gtirb/files/windows-release/.
Paket untuk Ubuntu 20 tersedia di GTIRB APT Repository dan dapat diinstal per instruksi berikut.
Pertama, tambahkan kunci APT Grammatech.
wget -O - https://download.grammatech.com/gtirb/files/apt-repo/conf/apt.gpg.key | apt-key add -Selanjutnya perbarui file Sumber Anda.
echo " deb [arch=amd64] https://download.grammatech.com/gtirb/files/apt-repo [distribution] [component] " | sudo tee -a /etc/apt/sources.listDi mana:
[distribution] adalah focal (saat ini, hanya paket Ubuntu 20 yang tersedia)[component] baik stable , yang memegang rilis versi terakhir, atau unstable , yang menahan kepala repositori.Akhirnya perbarui database paket Anda dan instal alat inti GTIRB:
sudo apt-get update
sudo apt-get install gtirb-pprinter ddisasm PERINGATAN : Versi stabil GTIRB-2.0.0, GTIRB-PPRINTER-2.1.0, DDISASM-1.8.0 dan lebih tua mengandalkan Metapackage yang menyebabkan konflik jika Anda mencoba apt-get upgrade (lihat #63). Dalam hal ini, uninstall dan instal ulang paket yang Anda dapatkan dari repositori GTIRB. Anda mungkin perlu menggunakan dpkg --remove untuk menghapus Metapackages (misalnya ddisasm ) sebelum menghapus paket versi beton (misalnya ddisasm-1.5.1 ). Versi stabil yang lebih baru tidak lagi bergantung pada metapackage dan dapat ditingkatkan tanpa masalah.
API C ++ GTIRB harus berhasil dibangun dalam 64-bit dengan kompiler GCC, Clang, dan Visual Studio yang mendukung setidaknya C ++ 17. GTIRB menggunakan cmake yang harus diinstal dengan setidaknya versi 3.10.
Proses pembuatan umum terlihat seperti ini:
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.
ctestUntuk menyesuaikan GTIRB Build, Anda bisa mendapatkan daftar opsi kustomisasi dengan menavigasi ke direktori build Anda dan menjalankan:
cmake -LHUntuk membangun dan menginstal GTIRB, persyaratan berikut harus diinstal:
cmake .libprotobuf-dev dan protobuf-compiler .GTIRB dirancang untuk diserialisasi menggunakan buffer protokol Google (yaitu, protobuf), memungkinkan penggunaan yang mudah dan efisien dari bahasa pemrograman apa pun.
GTIRB juga dapat digunakan melalui API khusus yang diimplementasikan dalam berbagai bahasa. API menyediakan struktur data yang efisien yang cocok untuk digunakan oleh analisis biner dan aplikasi penulisan ulang; Lihat di bawah untuk detailnya.
GTIRB menggunakan format serial yang terdiri dari tanda tangan 8-byte diikuti oleh data protobuf serial. Data protobuf memungkinkan untuk eksplorasi dan manipulasi dalam bahasa pilihan Anda. Beranda Protokol Google mencantumkan bahasa -bahasa di mana buffer protokol dapat digunakan secara langsung; Pengguna bahasa lain dapat mengonversi data yang diformat protobuf ke format JSON dan kemudian menggunakan data JSON dalam aplikasi mereka.
Direktori proto dalam repositori ini berisi definisi jenis pesan buffer protokol untuk GTIRB. Anda dapat memeriksa file .proto ini untuk menentukan struktur berbagai jenis pesan GTIRB. Jenis pesan tingkat atas adalah IR .
Untuk detail lebih lanjut, lihat menggunakan data GTIRB serial.
API GTIRB saat ini tersedia dalam C ++, Python, dan Common Lisp. Ada Java API parsial yang belum siap untuk digunakan eksternal. Untuk informasi API independen bahasa, lihat komponen GTIRB. Untuk informasi tentang berbagai implementasi API, lihat: