التمثيل الوسيط Grammatech للثنائيات (GTIRB) هو تحليل رمز الجهاز وإعادة كتابة بنية البيانات. يهدف إلى تسهيل التواصل مع الأشعة تحت الحمراء بين البرامج التي تؤدي تفكيك الثنائي والتحليل والتحول والطباعة الجميلة. تم تصميم GTIRB على LLVM-IR ، ويسعى إلى تقديم وظيفة مماثلة لتشجيع التواصل والتشغيل البيني بين الأدوات.
يصف الجزء المتبقي من هذا الملف جوانب مختلفة من GTIRB:
GTIRB لديه الهيكل التالي. الخطوط الصلبة تشير إلى الميراث. الخطوط المنقطة تشير إلى إشارة من قبل UUID.
قد يتضمن مثيل GTIRB وحدات متعددة ( Module ) التي تمثل كائنات قابلة للتحميل مثل المواد التنفيذية أو المكتبات ، ورسومات تدفق التحكم بين الإجراءات ( IPCFG ) ، وجداول البيانات الإضافية ( AuxData ) والتي يمكن أن تحتفظ بالتحليل التعسفي في تنسيقات محددة من قبل المستخدم والتي يمكنها بسهولة الإشارة إلى العناصر الأخرى من الأشعة تحت الحمراء. تحتوي كل وحدة على معلومات مثل الرموز ( Symbol ) والأقسام التي تحمل نفسها بايت وبيانات وكتل الكود في الوحدة النمطية. يتكون CFG من الكتل الأساسية ( Block ) والتحكم في حواف التدفق بين هذه الكتل. تشير كل بيانات أو كود كتلة إلى مجموعة من البايتات في فاصل البايت ( ByteInterval ). قد يحمل القسم فاصلًا كبيرًا واحدًا بايت يحتفظ بجميع الكتل --- إذا تم تعريف المواضع النسبية للكتل في هذا القسم --- أو قد تحمل فاصل بايت واحد لكل كتلة --- إذا لم يتم تعريف المواضع النسبية للكتل ، على سبيل المثال ، بالنسبة للكتل الكود في قسم .text أثناء إعادة كتابة البرنامج. يحمل كل رمز مؤشرًا على الكتلة أو المسند الذي يشير إليه.
لا يمثل GTIRB صراحة التعليمات أو دلالات التعليمات ولكنه يوفر معلومات رمزية معامل والوصول إلى البايتات. هناك العديد من اللغات الوسيطة (IL) لتمثيل دلالات التعليمات (على سبيل المثال ، BAP's BIL أو ANGR'S VEX أو Ghidra's P-Code). يعمل GTIRB مع هذه أو أي IL آخر عن طريق تخزين التعليمات بشكل عام وكفاءة كبايتات رمز الآلة الخام وتخزين معلومات التدفق الرمزية والتحكم بشكل منفصل. يوفر وحدة فك ترميز/تشفير Capstone/Keystone الشهيرة خيارًا ممتازًا لقراءة وكتابة التعليمات من/إلى تمثيل بايت آلي GTIRB دون الالتزام بأي IL الدلالي. من خلال دعم العديد من ILS وتخزينها المنفصل ، ينتج عن جداول البيانات الإضافية GTIRB تمكين التعاون بين التحليل الثنائي المستقل وإعادة كتابة فرق وأدوات.
يوفر GTIRB مشاركة معلومات إضافية ، على سبيل المثال نتائج التحليل ، في شكل كائنات AuxData . يمكن أن تخزن هذه الخرائط والمتجهات لأنواع GTIRB الأساسية بطريقة محمولة. يصف دليل GTIRB بنية الأنواع الشائعة للبيانات الإضافية مثل معلومات حدود الوظيفة أو معلومات النوع أو نتائج التحليلات الشائعة في مخطط Auxdata القياسي.
كل عنصر من عناصر GTIRB --- على سبيل المثال ، وحدات ( Module ) ، والرموز ( Symbol ) ، والكتل ( Block ) --- لها معرف فريد عالمي (UUID). يسمح UUIDs على كل من مكونات الأشعة تحت الحمراء من الدرجة الأولى وجداول Auxdata للإشارة إلى عناصر IR.
يمكن معالجة التعليمات والمعاملات الرمزية بواسطة Offset الفئة التي تغلف UUID (التي تشير إلى كتلة التعليمات) وإزاحة.
توجد حزم حاليًا لتثبيت GTIRB بسهولة (والأدوات المصاحبة بما في ذلك DDISASM Disassembler وطابعة GTIRB-PPRINTER PRITTER) على Windows ، و Ubuntu 20. انظر أدناه للحصول على التعليمات. بالإضافة إلى ذلك ، توجد صورة Docker العامة في Grammatech/ddisasm مع كل هذه الأدوات المثبتة. يتم إصدار GTIRB باستخدام الإصدار الرئيسي. نحن لا نقدم بعد توافق ABI عبر أي تغييرات في الإصدار.
يمكن تثبيت أحدث واجهة برمجة تطبيقات GTIRB Python المستقرة من PYPI باستخدام PIP:
pip install gtirbيمكن تثبيت أحدث إصدار غير مستقر من Python 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.
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 أو الأقدم تعتمد على metapackages التي تسبب تعارضات إذا حاولت apt-get upgrade (انظر #63). في هذه الحالة ، قم بإلغاء تثبيت وإعادة تثبيت الحزم التي حصلت عليها من مستودع GTIRB. قد تحتاج إلى استخدام dpkg --remove لإزالة Metapackages (مثل ddisasm ) قبل إزالة الحزم المصنوعة من الإصدار الخرساني (مثل ddisasm-1.5.1 ). لم تعد الإصدارات المستقرة الأحدث تعتمد على metapackages ويمكن ترقيتها دون مشاكل.
يجب أن تبني API من GTIRB's C ++ بنجاح في 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 من خلال واجهة برمجة تطبيقات مخصصة يتم تنفيذها بلغات متعددة. توفر واجهات برمجة التطبيقات هياكل بيانات فعالة مناسبة للاستخدام من خلال التحليل الثنائي وإعادة كتابة تطبيقات ؛ انظر أدناه للحصول على التفاصيل.
يستخدم GTIRB تنسيقًا متسلسلًا يتكون من توقيع 8 بايت يليه بيانات protobuf المسلسل. تتيح بيانات Protobuf الاستكشاف والتلاعب باللغة التي تختارها. تسرد الصفحة الرئيسية لبروتوكول Google اللغات التي يمكن فيها استخدام المخازن المؤقتة للبروتوكول مباشرة ؛ يمكن لمستخدمي اللغات الأخرى تحويل البيانات التي تنظمها Protobuf إلى تنسيق JSON ثم استخدام بيانات JSON في تطبيقاتها.
يحتوي دليل proto في هذا المستودع على تعريفات نوع رسالة المخزن المؤقت للبروتوكول لـ GTIRB. يمكنك فحص ملفات .proto لتحديد بنية أنواع رسائل GTIRB المختلفة. نوع الرسالة العليا هو IR .
لمزيد من التفاصيل ، راجع استخدام بيانات GTIRB المسلسل.
يتوفر GTIRB API حاليًا في C ++ و Python و Common Lisp. هناك واجهة برمجة تطبيقات Java جزئية ليست جاهزة للاستخدام الخارجي. للحصول على معلومات API المستقلة عن اللغة ، راجع مكونات GTIRB. للحصول على معلومات حول تطبيقات API المختلفة ، انظر: