การเป็นตัวแทนของ Grammatech Intermediate สำหรับไบนารี (GTIRB) คือการวิเคราะห์รหัสเครื่องและโครงสร้างข้อมูลใหม่ มันมีวัตถุประสงค์เพื่ออำนวยความสะดวกในการสื่อสารของไบนารี IR ระหว่างโปรแกรมที่ดำเนินการถอดชิ้นส่วนไบนารีการวิเคราะห์การเปลี่ยนแปลงและการพิมพ์สวย GTIRB เป็นแบบจำลองบน LLVM-IR และพยายามที่จะให้บริการฟังก์ชั่นที่คล้ายกันของการกระตุ้นการสื่อสารและการทำงานร่วมกันระหว่างเครื่องมือ
ส่วนที่เหลือของไฟล์นี้อธิบายแง่มุมต่าง ๆ ของ GTIRB:
GTIRB มีโครงสร้างดังต่อไปนี้ เส้นทึบแสดงถึงการสืบทอด เส้นประแสดงการอ้างอิงโดย UUID
อินสแตนซ์ของ GTIRB อาจรวมถึงโมดูลหลายโมดูล ( Module ) ซึ่งเป็นตัวแทนของวัตถุที่โหลดได้เช่น executables หรือ Libraries กราฟการควบคุมระหว่างกระบวนการ ( IPCFG ) และตารางข้อมูลเสริม ( AuxData ) ซึ่งสามารถเก็บผลการวิเคราะห์โดยพลการในรูปแบบที่กำหนดโดยผู้ใช้ แต่ละโมดูลเก็บข้อมูลเช่นสัญลักษณ์ ( Symbol ) และส่วนที่ถือไบต์จริงและข้อมูลและบล็อกรหัสของโมดูล CFG ประกอบด้วยบล็อกพื้นฐาน ( Block ) และขอบการควบคุมระหว่างบล็อกเหล่านี้ แต่ละข้อมูลหรือบล็อกรหัสอ้างอิงช่วงของไบต์ในช่วงเวลาไบต์ ( ByteInterval ) ส่วนอาจมีช่วงเวลาไบต์ขนาดใหญ่หนึ่งช่วงที่ถือบล็อกทั้งหมด --- หากตำแหน่งสัมพัทธ์ของบล็อกในส่วนนั้นถูกกำหนด --- หรืออาจถือช่วงเวลาหนึ่งไบต์ต่อบล็อก --- หากตำแหน่งสัมพัทธ์ของบล็อกไม่ได้กำหนดเช่นสำหรับบล็อกรหัสในส่วน .text ระหว่างการเขียนโปรแกรมใหม่ แต่ละสัญลักษณ์ถือตัวชี้ไปยังบล็อกหรือข้อมูลอ้างอิง
GTIRB อย่างชัดเจนไม่ได้แสดงถึงคำแนะนำหรือความหมายของคำสั่ง แต่ให้ข้อมูลที่เป็นสัญลักษณ์และการเข้าถึงไบต์ มี ภาษากลาง หลายภาษา (IL) สำหรับการเป็นตัวแทนของความหมายการเรียนการสอน (เช่น BAP's BIL, VEX ของ Angr หรือ P-Code ของ Ghidra) GTIRB ทำงานร่วมกับ IL เหล่านี้หรืออื่น ๆ โดยการจัดเก็บคำแนะนำโดยทั่วไปและมีประสิทธิภาพเป็น ไบต์รหัสเครื่องดิบ และจัดเก็บข้อมูลสัญลักษณ์และการควบคุมการไหลแยกต่างหาก ตัวถอดรหัส/Keystone Decoder/encoder ยอดนิยมเป็นตัวเลือกที่ยอดเยี่ยมในการอ่านและเขียนคำแนะนำจาก/ถึงการแสดงรหัสไบต์เครื่องจักรของ GTIRB โดยไม่ต้องใช้ความหมายใด ๆ ด้วยการสนับสนุน IL หลายตัวและการจัดเก็บข้อมูลการวิเคราะห์แยกต่างหากในตารางข้อมูลเสริม GTIRB ช่วยให้การทำงานร่วมกันระหว่างการวิเคราะห์ไบนารีอิสระและทีมและเครื่องมือใหม่
GTIRB จัดเตรียมการแบ่งปันข้อมูลเพิ่มเติมเช่นผลการวิเคราะห์ในรูปแบบของวัตถุ AuxData สิ่งเหล่านี้สามารถจัดเก็บแผนที่และเวกเตอร์ของประเภท GTIRB พื้นฐานในแบบพกพา คู่มือ GTIRB อธิบายโครงสร้างสำหรับประเภททั่วไปของข้อมูลเสริมเช่นข้อมูลขอบเขตฟังก์ชันข้อมูลประเภทหรือผลลัพธ์ของการวิเคราะห์ทั่วไปในมาตรฐาน Auxdata schemata
ทุกองค์ประกอบของ GTIRB --- เช่นโมดูล ( Module ) สัญลักษณ์ ( Symbol ) และบล็อก ( Block ) --- มีตัวระบุที่ไม่ซ้ำกันในระดับสากล (UUID) UUIDs อนุญาตทั้งส่วนประกอบ IR ชั้นหนึ่งและตาราง auxdata ไปยังองค์ประกอบอ้างอิงของ IR
คำแนะนำและตัวถูกดำเนินการเชิงสัญลักษณ์สามารถแก้ไขได้โดย Offset คลาสซึ่งห่อหุ้ม UUID (หมายถึงบล็อกของคำสั่ง) และออฟเซ็ต
ปัจจุบันแพ็คเกจมีอยู่สำหรับการติดตั้ง GTIRB (และเครื่องมือผู้ดูแลรวมถึงเครื่องพิมพ์ DDISASM Disassembler และ GTIRB-Sprinter Printer สวย) บน Windows และ Ubuntu 20 ดูคำแนะนำด้านล่าง นอกจากนี้ยังมีภาพนักเทียบท่าสาธารณะที่ Grammatech/Ddisasm พร้อมเครื่องมือทั้งหมดที่ติดตั้ง GTIRB มีเวอร์ชันด้วย major.minor.patch เวอร์ชันที่เพิ่มขึ้นรุ่นสำคัญจะต้องมีการเปลี่ยนแปลงแหล่งที่สำคัญ แต่ควรหายากมากการเพิ่มขึ้นของรุ่นรองอาจต้องมีการเปลี่ยนแปลงแหล่งเล็ก ๆ และการเพิ่มขึ้นของเวอร์ชันแพตช์ไม่ควรทำลายการสร้างปลายน้ำ เรายังไม่ได้ให้ความเข้ากันได้ของ ABI ในการเปลี่ยนแปลงเวอร์ชันใด ๆ
GTIRB Python API ที่เสถียรล่าสุดอาจติดตั้งจาก PYPI โดยใช้ PIP:
pip install gtirbรุ่น Python API ที่ไม่เสถียรล่าสุดสามารถติดตั้งได้จากล้อ prebuilt:
pip install https://download.grammatech.com/gtirb/files/python/gtirb-0.dev-py3-none-any.whl เป็นสิ่งสำคัญที่ตัวเลือกของแพ็คเกจ stable หรือ unstable ตรงกับแพ็คเกจ DDISASM และ GTIRB-Sprinter ที่ติดตั้ง
การเผยแพร่ Windows ได้รับการบรรจุเป็นไฟล์. ZIP และมีอยู่ที่ https://download.grammatech.com/gtirb/files/windows-release/
แพ็คเกจสำหรับ Ubuntu 20 มีอยู่ในที่เก็บ GTIRB APT และอาจติดตั้งตามคำแนะนำต่อไปนี้
ก่อนอื่นเพิ่มคีย์ APT ของ Grammatech
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 ซึ่งถือหัวของที่เก็บในที่สุดอัปเดตฐานข้อมูลแพ็คเกจของคุณและติดตั้งเครื่องมือ Core 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 และผู้สูงอายุพึ่งพา metapackages ซึ่งทำให้เกิดความขัดแย้งหากคุณลอง apt-get upgrade (ดู #63) ในกรณีนี้ถอนการติดตั้งและติดตั้งแพ็คเกจที่คุณได้รับจากที่เก็บ GTIRB ใหม่ คุณอาจต้องใช้ dpkg --remove เพื่อลบ metapackages (เช่น ddisasm ) ก่อนที่จะลบแพ็คเกจคอนกรีตเวอร์ชัน (เช่น ddisasm-1.5.1 ) รุ่นที่มีเสถียรภาพใหม่ไม่พึ่งพา metapackages อีกต่อไปและสามารถอัพเกรดได้โดยไม่มีปัญหา
C ++ API ของ GTIRB ควรสร้างใน 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 build คุณสามารถรับรายการตัวเลือกการปรับแต่งได้โดยการนำทางไปยังไดเรกทอรีบิลด์และการทำงานของคุณ:
cmake -LHในการสร้างและติดตั้ง GTIRB ควรติดตั้งข้อกำหนดต่อไปนี้:
cmake แพ็คเกจ APTlibprotobuf-dev และ protobuf-compilerGTIRB ได้รับการออกแบบให้เป็นอนุกรมโดยใช้บัฟเฟอร์โปรโตคอล Google (เช่น, protobuf) ทำให้การใช้งานง่ายและมีประสิทธิภาพจากภาษาการเขียนโปรแกรมใด ๆ
GTIRB อาจใช้ผ่าน API เฉพาะที่ใช้ในหลายภาษา API ให้โครงสร้างข้อมูลที่มีประสิทธิภาพเหมาะสำหรับการใช้งานโดยการวิเคราะห์แบบไบนารีและแอปพลิเคชันใหม่ ดูรายละเอียดด้านล่าง
GTIRB ใช้รูปแบบอนุกรมที่ประกอบด้วยลายเซ็น 8 ไบต์ตามด้วยข้อมูล protobuf แบบอนุกรม ข้อมูล protobuf ช่วยให้สามารถสำรวจและจัดการในภาษาที่คุณเลือก หน้าแรกของ Google Protocol Buffers แสดงรายการภาษาที่สามารถใช้บัฟเฟอร์โปรโตคอลได้โดยตรง ผู้ใช้ภาษาอื่น ๆ สามารถแปลงข้อมูลที่จัดรูปแบบ protobuf เป็นรูปแบบ JSON จากนั้นใช้ข้อมูล JSON ในแอปพลิเคชันของพวกเขา
ไดเรกทอรี proto ในที่เก็บนี้มีคำจำกัดความประเภทข้อความบัฟเฟอร์โปรโตคอลสำหรับ GTIRB คุณสามารถตรวจสอบไฟล์ .proto เหล่านี้เพื่อกำหนดโครงสร้างของประเภทข้อความ GTIRB ต่างๆ ประเภทข้อความระดับบนสุดคือ IR
สำหรับรายละเอียดเพิ่มเติมโปรดดูการใช้ข้อมูล GTIRB แบบอนุกรม
ปัจจุบัน GTIRB API มีให้บริการใน C ++, Python และ LISP ทั่วไป มี Java API บางส่วน ซึ่งยังไม่พร้อมสำหรับการใช้งานภายนอก สำหรับข้อมูล API ที่ไม่ขึ้นกับภาษาโปรดดูส่วนประกอบ GTIRB สำหรับข้อมูลเกี่ยวกับการใช้งาน API ที่แตกต่างกันโปรดดู: