Protobuf هو تنسيق تسلسل تم تطويره بواسطة Google ويستخدم في عدد متزايد من Android و Web و Desktop والمزيد من التطبيقات. وهو يتألف من لغة لإعلان هياكل البيانات ، والتي يتم تجميعها بعد ذلك إلى رمز أو نوع آخر من الهيكل اعتمادًا على التنفيذ المستهدف.
PBTK ( Protobuf Toolkit ) هي مجموعة كاملة من البرامج النصية ، يمكن الوصول إليها من خلال واجهة المستخدم الرسومية الموحدة ، والتي توفر ميزتين رئيسيتين:
استخراج هياكل protobuf من البرامج ، وتحويلها إلى قابلة للقراءة .proto s ، ودعم مختلف التطبيقات:
تحرير البيانات وإعادة تشغيلها ودعمها المرسلة إلى نقاط نهاية شبكة Protobuf ، من خلال واجهة رسومية مفيدة تتيح لك تحرير الحقول لرسالة protobuf وعرض النتيجة.
يتطلب PBTK Python ≥ 3.5 ، Pyqt 5 ، Python-Protobuf 3 ، وحفنة من البرامج القابلة للتنفيذ (Chromium ، Jad ، Dex2Jar ...) لتشغيل نصوص المستخرج.
يمكن لمستخدمي Archlinux التثبيت مباشرة من خلال الحزمة:
$ yay -S pbtk-git
$ pbtk
في معظم التوزيعات الأخرى ، سترغب في تشغيله مباشرة:
# For Ubuntu/Debian testing derivates:
$ sudo apt install python3-pip git openjdk-9-jre libqt5x11extras5 python3-pyqt5.qtwebengine python3-pyqt5
$ sudo pip3 install protobuf pyqt5 pyqtwebengine requests websocket-client
$ git clone https://github.com/marin-m/pbtk
$ cd pbtk
$ ./gui.pyيتم دعم Windows أيضًا (مع نفس الوحدات المطلوبة). بمجرد تشغيل واجهة المستخدم الرسومية ، يجب أن يحذرك من ما تفتقده اعتمادًا على ما تحاول القيام به.
يمكن أن يتم وضع واجهة المستخدم الرسومية من خلال النص الرئيسي:
./gui.py
يمكن أيضًا استخدام البرامج النصية التالية مستقلة ، بدون واجهة المستخدم الرسومية:
./extractors/jar_extract.py [-h] input_file [output_dir]
./extractors/from_binary.py [-h] input_file [output_dir]
./extractors/web_extract.py [-h] input_url [output_dir]
لنفترض أنك عكسي هندسة تطبيق Android. لقد قمت باستكشاف التطبيق قليلاً باستخدام Decompiler المفضل لديك ، وحددت أنه ينقل Protobuf كبيانات نشر عبر HTTPs بطريقة نموذجية.
تفتح PBTK وتستقبل بطريقة هادفة:
الخطوة الأولى هي الحصول على .protos في تنسيق نص. إذا كنت تستهدف تطبيق Android ، فيجب أن يؤدي الانخفاض في APK والانتظار إلى العمل السحري! (ما لم يكن تطبيقًا غريبًا حقًا)
يتم ذلك ، يمكنك القفز إلى ~/.pbtk/protos/<your APK name> (إما من خلال سطر الأوامر ، أو الزر الموجود في الجزء السفلي من شاشة الترحيب لفتح متصفح الملفات ، بالطريقة التي تفضلها). جميع التطبيقات. بروتوس هنا بالفعل.
مرة أخرى في decompiler الخاص بك ، تعثرت على الفصل الذي يبني البيانات المرسلة إلى نقطة نهاية HTTPS التي تهمك. يقوم بتسلسل رسالة Protobuf عن طريق استدعاء فئة مصنوعة من رمز تم إنشاؤه.
يجب أن يكون لهذا الفصل الأخير تطابق مثالي داخل دليل .protos الخاص بك (أي com.foo.bar.ab سوف يتطابق مع com/foo/bar/a/b.proto ). في كلتا الحالتين ، يجب أن يمكّنك اسمه من الإشارة إليه.
هذا رائع: الشيء التالي هو الخطوة 2 ، واختيار الإدخال المطلوب .proto ، وملء بعض المعلومات حول نقطة النهاية الخاصة بك.
يمكنك أيضًا إعطاء بعض بيانات Protobuf RAW ، التي تم إرسالها إلى نقطة النهاية هذه ، التي تم التقاطها من خلال MITMPROXY أو WIRESHARK ، وأنها سوف تلصق في شكل مشفر سداسي.
الخطوة 3 تدور حول الجزء الممتع من النقر فوق الأزرار ورؤية ما يحدث! لديك عرض شجرة تمثل كل حقل في بنية protobuf (يتم اللاحقة الحقول المتكررة بواسطة "+" ، لا تحتوي الحقول المطلوبة على مربعات الاختيار).
فقط تحوم حقل للتركيز. إذا كان الحقل نوعًا صحيحًا ، فاستخدم عجلة الماوس لزيادة/تقليله. تظهر معلومات التعداد عند التحويم أيضًا.
ها هو! يمكنك تحديد معنى كل حقل مع ذلك. إذا قمت باستخراج .protos من الكود المصغر ، يمكنك إعادة تسمية الحقول وفقًا لما تلاحظ أنها تعني ، من خلال النقر على أسمائهم.
عكس سعيد! ؟ ؟
%APPDATA%pbtkprotos PBTK ~/.pbtk/protos/ .
يمكنك الانتقال أو الخروج أو إعادة تسمية أو تحرير أو محو البيانات من هذا الدليل مباشرة من خلال متصفح الملفات المعتاد ومحرر النصوص ، إنها الطريقة المتوقعة للقيام بذلك ولن تتداخل مع PBTK.
يتم تخزين نقاط النهاية المستندة إلى HTTP في ~/.pbtk/endpoints/ ككائنات JSON. هذه الكائنات عبارة عن صفائف من أزواج من معلومات الطلب/الاستجابة ، والتي تبدو هكذا:
[ {
"request" : {
"transport" : "pburl" ,
"proto" : "www.google.com/VectorTown.proto" ,
"url" : "https://www.google.com/VectorTown" ,
"pb_param" : "pb" ,
"samples" : [ {
"pb" : "!...." ,
"hl" : "fr"
} ]
} ,
"response" : {
"format" : "other"
}
} ] يستخدم PBTK نوعين من الوحدات النمطية القابلة للتجميع داخليًا: المستخلصات ، ونقل.
يتم تعريف المستخلصات في extractors/*.py يتم تعريفها على أنها طريقة يسبقها ديكور ، مثل هذا:
@ register_extractor ( name = 'my_extractor' ,
desc = 'Extract Protobuf structures from Foobar code (*.foo, *.bar)' ,
depends = { 'binaries' : [ 'foobar-decompiler' ]})
def my_extractor ( path ):
# Load contents of the `path` input file and do your stuff...
# Then, yield extracted .protos using a generator:
for i in do_your_extraction_work ():
yield proto_name + '.proto' , proto_contents
# Other kinds of information can be yield, such as endpoint information or progress to display. يتم تعريف النقل في utils/transports.py . يتم تعريفها على أنها فصل يسبقه ديكور ، مثل هذا:
@ register_transport (
name = 'my_transport' ,
desc = 'Protobuf as raw POST data' ,
ui_data_form = 'hex strings'
)
class MyTransport ():
def __init__ ( self , pb_param , url ):
self . url = url
def serialize_sample ( self , sample ):
# We got a sample of input data from the user.
# Verify that it is valid in the form described through "ui_data_form" parameter, fail with an exception or return False otherwise.
# Optionally modify this data prior to returning it.
bytes . fromhex ( sample )
return sample
def load_sample ( self , sample , pb_msg ):
# Parse input data into the provided Protobuf object.
pb_msg . ParseFromString ( bytes . fromhex ( sample ))
def perform_request ( self , pb_data , tab_data ):
# Perform a request using the provided URL and Protobuf object, and optionally other transport-specific side data.
return post ( url , pb_data . SerializeToString (), headers = USER_AGENT )يمكن أن يأتي التالي لمزيد من الإصدارات:
لقد حاولت بذل قصارى جهدي لإنتاج الكود القابل للقراءة والتعليق تمامًا (باستثناء الأجزاء التي يتم وصفها في الغالب ، مثل توصيل إشارات واجهة المستخدم الرسومية) لمعظم الوحدات ، بحيث يمكنك المساهمة.
مع استخدام PBTK PYQT ، يتم إصداره بموجب ترخيص GNU GPL (I ، بموجب هذا ، وما إلى ذلك) من المحتمل أن أختار شيئًا يشبه المجال العام على خلاف ذلك.
لا توجد قاعدة رسمية لحالة رسالة اسم المشروع ، القاعدة هي فقط تتبع قلبك ❤