
🕵️ أداة لهندسة عكسية لبروتوكول بافرز (Protocol Buffers) ذات تعريف غير معروف
برنامج بسيط يمكنه تحليل بيانات ثنائية مشفرة بـ Google Protobuf (الإصدار 2 أو 3) دون الحاجة إلى معرفة تعريفها المصاحب. سيطبع تمثيلًا جميلًا وملونًا لمحتوياتها. مثال:

كما ترى، من الواضح أن أسماء الحقول ضائعة، إلى جانب بعض التفاصيل عالية المستوى مثل:
لكن protobuf-inspector قادر على تخمين بنية الرسالة بشكل صحيح معظم الوقت. عندما يجد بيانات ثنائية مضمنة في حقل، سيحاول أولاً تحليلها كرسالة. إذا فشل ذلك، سيعرض البيانات كنص أو hexdump. قد يرتكب أخطاء، خاصة مع القطع الصغيرة.
يعرض الحقول بالترتيب الذي تم ترميزها به في السلك، لذلك يمكن أن يكون مفيدًا لمن يرغب في التعرف على wire format أو مطوري المحللات، بالإضافة إلى الهندسة العكسية.
يمكنك التثبيت باستخدام pip:
pip install protobuf-inspector
يؤدي هذا إلى تثبيت الأمر protobuf_inspector. قم بتشغيله، مع إدخال blob protobuf على stdin:
protobuf_inspector < my-protobuf-blob
بعد قراءة التحليل الأول (الأعمى) للـ blob، عادةً ما تبدأ في تعريف بعض الحقول حتى يتمكن protobuf-inspector من تحليل blobs الخاصة بك بشكل أفضل، حتى تصل إلى نقطة حيث لديك تعريف protobuf كامل ولم يعد على المحلل تخمين أي شيء.
إذا تم العثور على خطأ في التحليل، سيتوقف التحليل داخل ذلك الحقل، لكنه سيستمر دون تأثر خارج التسلسل الهرمي. سيتم طباعة تتبع المكدس حيث تذهب محتويات الحقل، إلى جانب hexdump يوضح أين توقف التحليل في تلك القطعة، إن أمكن.
إذا قمت بتحديد uint32 وتم العثور على varint أكبر، ستحصل على شيء مثل:

إذا قمت بتحديد أن بعض الحقول تحتوي على رسالة مضمنة، ولكن تم العثور على بيانات غير صالحة هناك، ستحصل على:

يرجى ملاحظة أن main.py سيخرج بحالة غير صفرية إذا حدث خطأ تحليل واحد أو أكثر.
هناك بعض الحيل التي يمكنك استخدامها لتوفير الوقت عند التعامل مع blob:
إذا كنت متأكدًا أن varint ليس يستخدم تشفير zig-zag، لكنك لا تزال غير متأكد من الإشارة، اتركه كـ varint. إذا كان يستخدم تشفير zig-zag، استخدم sint64 إلا إذا كنت متأكدًا أنه 32-bit وليس 64-bit.
إذا تم التعرف على قطعة بشكل خاطئ كـ packed chunk أو رسالة مضمنة، أو رأيت شيئًا غريبًا مع الرسالة المحللة وتريد رؤية البايتات الخام، حدد نوعًا من bytes. بالمقابل، إذا لم يتم اكتشافها كرسالة مضمنة لسبب ما وكان ينبغي ذلك، فرضها على message لرؤية السبب.
إذا كنت تريد استخراج بيانات قطعة خام إلى ملف لتحليلها بشكل أفضل، حدد نوعًا من dump وسيقوم protobuf-inspector بإنشاء dump.0 و dump.1 وما إلى ذلك في كل مرة يجد فيها blob متطابق.
يقوم protobuf-inspector بتحليل الـ blob كرسالة من نوع root، لكن هذا مجرد افتراضي. إذا كان لديك العديد من أنواع الرسائل المعرفة، يمكنك تمرير اسم نوع كوسيطة اختيارية، وسيستخدم protobuf-inspector ذلك بدلاً من root:
protobuf_inspector request < my-protobuf-blob
مثال بسيط:
from protobuf_inspector.types import StandardParser
parser = StandardParser()
with open('my-blob', 'rb') as fh:
output = parser.parse_message(fh, "message")
print(output)
لم يتم تصميم هذا المشروع في البداية لاستخدامه كمكتبة، ومع ذلك، قد تتغير واجهة برمجته. للحصول على مثال أكثر تعقيدًا، راجع protobuf_inspector/__main__.py.