برنامج بسيط يمكنه تحليل النقط المشفرة Google Protobuf (الإصدار 2 أو 3) دون معرفة التعريف المصاحب لها. سيتم طباعة تمثيل ملون لطيف لمحتوياتها. مثال:
كما ترون، من الواضح أن أسماء الحقول مفقودة، بالإضافة إلى بعض التفاصيل عالية المستوى مثل:
لكن protobuf-inspector قادر على تخمين بنية الرسالة بشكل صحيح في معظم الأوقات. عندما يعثر على بيانات ثنائية مضمنة في أحد الحقول، سيحاول أولاً تحليلها كرسالة. إذا فشل ذلك، فسيتم عرض البيانات كسلسلة أو تفريغ سداسي. يمكن أن ترتكب أخطاء، خاصة مع القطع الصغيرة.
فهو يُظهر الحقول بالترتيب الذي تم ترميزها به في السلك، لذلك يمكن أن يكون مفيدًا لأولئك الذين يريدون التعرف على تنسيق السلك أو مطوري المحلل اللغوي، بالإضافة إلى الهندسة العكسية.
يمكنك التثبيت بالنقطة:
pip install protobuf-inspector
يؤدي هذا إلى تثبيت الأمر protobuf_inspector
. قم بتشغيله، وقم بتغذية نقطة protobuf على stdin:
protobuf_inspector < my-protobuf-blob
بعد قراءة التحليل الأول (الأعمى) للنقطة، تبدأ عادةً في تحديد بعض الحقول حتى يتمكن protobuf-inspector من تحليل النقط بشكل أفضل، حتى تصل إلى نقطة حيث يكون لديك تعريف protobuf كامل ولم يعد المحلل بحاجة إلى ذلك تخمين أي شيء.
اقرأ عن تعريف الحقول هنا.
إذا تم العثور على خطأ في التحليل، فسيتوقف التحليل داخل هذا الحقل ، لكنه سيستمر دون أن يتأثر خارج التسلسل الهرمي. ستتم طباعة تتبع المكدس حيث ستنتقل محتويات الحقل، بالإضافة إلى تفريغ سداسي للإشارة إلى المكان الذي توقف فيه التحليل في تلك القطعة، إذا كان ذلك ممكنًا.
لذلك، إذا حددت uint32
وتم العثور على متغير أكبر، فستحصل على شيء مثل:
إذا حددت أن بعض الحقول تحتوي على رسالة مضمنة، ولكن تم العثور على بيانات غير صالحة هناك، فستحصل على:
يرجى ملاحظة أن main.py
سيخرج بحالة غير صفرية في حالة حدوث خطأ تحليلي واحد أو أكثر.
هناك بعض الحيل التي يمكنك استخدامها لتوفير الوقت عند الاقتراب من النقطة:
إذا كنت متأكدًا من أن المتغير لا يستخدم التشفير المتعرج، ولكنك لا تزال غير متأكد من التوقيع، فاتركه كـ varint
. إذا كان يستخدم التشفير المتعرج، فاستخدم sint64
إلا إذا كنت متأكدًا من أنه 32 بت وليس 64 بت.
إذا تم التعرف على قطعة بشكل خاطئ على أنها packed chunk
أو رسالة مضمنة، أو إذا رأيت شيئًا غريبًا في الرسالة التي تم تحليلها وتريد رؤية البايتات الأولية، فحدد نوع bytes
. على العكس من ذلك، إذا لم يتم اكتشافها كرسالة مضمنة لسبب ما، ويجب أن يتم ذلك، فاجبرها على message
لمعرفة السبب.
إذا كنت تريد استخراج البيانات الأولية لقطعة ما إلى ملف لتحليلها بشكل أفضل، فحدد نوع dump
وسيقوم protobuf-inspector بإنشاء dump.0
و dump.1
وما إلى ذلك في كل مرة يعثر فيها على كائن ثنائي كبير الحجم مطابق.
يقوم protobuf-inspector بتوزيع النقطة كرسالة من النوع 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 )
لم يتم تصميم هذا المشروع في البداية للاستخدام كمكتبة، وقد تتغير واجهة برمجة التطبيقات (API) الخاصة به. للحصول على مثال أكثر تعقيدًا، راجع protobuf_inspector/__main__.py
.