
نصوص برمجية لـ Ghidra لاستعادة تعريفات السلاسل النصية في ملفات Go الثنائية
نصوص برمجية لاستعادة تعريفات السلاسل في ثنائيات Go باستخدام تحليل P-Code. تم اختبارها مع x86 وx86-64 وARM وARM64.
يمكن العثور عليها في فئة Golang في Script Manager.
GoDynamicStrings.java
GoFuncCallStrings.java
GoStaticStrings.java
GoKnownStrings.java
data/known_strings.json.GoStringFiller.java
go.string.* بعد التحليل الأولي، بناءً على الترتيب التصاعدي لطول بيانات السلاسل.هناك أيضًا نسختان خاصتان من نص تحليل السلاسل الديناميكية:
GoDynamicStringsSingle.java
GoDynamicStrings.java، لكنه يستخدم عملية مفكك واحدة. استخدم هذا إذا كان تحليل ثنائي يؤدي إلى استنفاد عمليات المفكك المتوازية لذاكرة النظام.GoDynamicStringsHigh.java
يمكن العثور عليه في فئة PCode في Script Manager.
PrintHighPCode.java
إليك التدفق العام لاستخدام هذه النصوص لاستعادة تعريفات السلاسل في ثنائي Go:
.rodata أو .rdata أو __rodata. ثم انقر بزر الماوس الأيمن في قائمة الشيفرة واختر "Clear Code Bytes".GoKnownStrings.java لاكتشاف بعض السلاسل القياسية.GoStaticStrings.java.GoFuncCallStrings.java (إذا كان إصدار ثنائي Golang مدعومًا بميزات Golang المدمجة في Ghidra).GoDynamicStrings.java.GoStringFiller.java.
go.string.* عند أول سلسلة ذات بايت واحد.go.string.*، وعرّف أي سلاسل ذات نقاط بداية ونهاية واضحة.
في Ghidra:
لـ Eclipse مع إضافة GhidraDev:
البناء باستخدام Eclipse:
البناء مباشرة باستخدام Gradle:
$ cd Ghostrings
$ gradle -PGHIDRA_INSTALL_DIR=<ghidra_install_dir>
من المشكلات المعروفة في الهندسة العكسية لبرامج Go أن غياب مُنهيات null في سلاسل Go يجعل استعادة تعريفات السلاسل من الثنائيات المترجمة أمرًا صعبًا. يتم تخزين العديد من قيم السلاسل الثابتة لبرنامج Go معًا في كتلة ضخمة واحدة في البناء المترجم، دون أي أحرف إنهاء مدمجة في بيانات السلاسل لتحديد مكان انتهاء سلسلة وبدء أخرى. حتى البرنامج البسيط الذي يطبع "Hello world!" فقط يحتوي على أكثر من 1,500 سلسلة مرتبطة بنظام وقت تشغيل Go والمكتبات القياسية الأخرى. يمكن أن يتسبب هذا في قيام تطبيقات اكتشاف سلاسل ASCII النموذجية، مثل تلك التي يوفرها Ghidra، بإنشاء تعريفات سلاسل موجبة كاذبة يبلغ طولها عشرات الآلاف من الأحرف.
بدلاً من السلاسل المنتهية بـ null، يستخدم Go بنية سلسلة تتكون من مؤشر وقيمة طول. يتم إنشاء العديد من بنى السلاسل هذه على مكدس البرنامج في وقت التشغيل، لذا فإن استعادة مواقع بدء السلاسل الفردية وقيم أطوالها تتطلب تحليل الشيفرة الآلية المترجمة. توجد بعض النصوص البرمجية الحالية التي تؤدي هذا التحليل من خلال فحص أنماط معينة من تعليمات x86-64، لكنها تفوت البنى التي تم إنشاؤها باختلافات غير معالجة من التعليمات التي لها في النهاية التأثير نفسه على المكدس، كما أنها مقيدة ببنية تعليمات محددة (ISA).
تتجنب Ghostrings هاتين المشكلتين من خلال العمل مع عمليات P-Code المبسطة والمستقلة عن البنية التي ينتجها تحليل مفكك Ghidra.
حقوق النشر 2022 NCC Group. صدرت بموجب ترخيص GPLv3 (انظر LICENSE).
المؤلف الرئيسي للمشروع: James Chambers [email protected]
GoStringFiller.java، حدد الأماكن التي تتغير فيها أطوال السلاسل في بيانات السلاسل غير المعرفة وعرّف السلاسل الأقرب إلى تلك الحدود. ثم أعد تشغيل GoStringFiller.java لملء المواضع تلقائيًا حيث يمكنه تحديد طول السلاسل المتبقية غير المعرفة بشكل صحيح.