
प्रोटोबफ-आधारित ऐप्स के रिवर्स इंजीनियरिंग और फज़िंग के लिए एक टूलसेट
प्रोटोबफ (Protobuf) एक सीरियलाइज़ेशन फ़ॉर्मेट है जिसे गूगल ने विकसित किया है और इसका उपयोग एंड्रॉइड, वेब, डेस्कटॉप और अधिक एप्लिकेशनों में बढ़ती संख्या में किया जा रहा है। इसमें डेटा संरचनाओं की घोषणा के लिए एक भाषा शामिल है, जिसे बाद में लक्ष्य कार्यान्वयन के आधार पर कोड या किसी अन्य प्रकार की संरचना में संकलित किया जाता है।
pbtk (प्रोटोबफ टूलकिट) स्क्रिप्ट्स का एक पूर्ण सेट है, जो एक एकीकृत GUI के माध्यम से सुलभ है, और दो मुख्य सुविधाएँ प्रदान करता है:
प्रोग्रामों से प्रोटोबफ संरचनाएँ निकालना, उन्हें वापस पढ़ने योग्य .proto में परिवर्तित करना, विभिन्न कार्यान्वयनों का समर्थन करता है:
प्रोटोबफ नेटवर्क एंडपॉइंट पर भेजे गए डेटा को संपादित करना, पुनः चलाना और फ़ज़ करना, एक सुविधाजनक ग्राफिकल इंटरफ़ेस के माध्यम से जो आपको प्रोटोबफ संदेश के फ़ील्ड को लाइव संपादित करने और परिणाम देखने की अनुमति देता है।
PBTK के लिए Python ≥ 3.5, PySide 6, Python-Protobuf 3, और एक्सट्रैक्टर स्क्रिप्ट चलाने के लिए कुछ निष्पादन योग्य प्रोग्राम (क्रोमियम, jad, dex2jar...) की आवश्यकता होती है।
Ubuntu उपयोगकर्ता इसे snap का उपयोग करके स्थापित कर सकते हैं:
$ sudo snap install pbtk
$ pbtk
Archlinux उपयोगकर्ता सीधे पैकेज के माध्यम से स्थापित कर सकते हैं:
$ yay -S pbtk-git
$ pbtk
अधिकांश अन्य वितरणों पर, आप इसे सीधे चलाना चाहेंगे:
# Ubuntu/Debian परीक्षण डेरिवेटिव के लिए:
$ sudo apt install python3-pip git openjdk-8-jre python3-qtpy-pyside6
# फिर, UV का उपयोग करके:
$ sudo snap install --classic astral-uv
$ uv tool install pbtk
$ pbtk
# या pipx का उपयोग करके:
$ sudo apt install pipx
$ pipx install pbtk
$ pbtk
Windows भी समर्थित है (समान मॉड्यूल की आवश्यकता है)। एक बार जब आप GUI चलाते हैं, तो यह आपको चेतावनी देगा कि आप क्या खो रहे हैं, यह इस पर निर्भर करता है कि आप क्या करने का प्रयास करते हैं।
GUI को मुख्य स्क्रिप्ट के माध्यम से लॉन्च किया जा सकता है:
pbtk
निम्नलिखित स्क्रिप्ट का उपयोग GUI के बिना, स्वतंत्र रूप से भी किया जा सकता है:
pbtk-jar-extract [-h] input_file [output_dir]
pbtk-from-binary [-h] input_file [output_dir]
pbtk-web-extract [-h] input_url [output_dir] # 2026 तक काम करने के लिए अपडेट की आवश्यकता है
जब snap से स्थापित करते हैं, तो सटीक कमांड अलग होते हैं:
pbtk.jar-extract [-h] input_file [output_dir]
pbtk.from-binary [-h] input_file [output_dir]
pbtk.web-extract [-h] input_url [output_dir]
GUI को मुख्य स्क्रिप्ट के माध्यम से लॉन्च किया जा सकता है:
uv sync # .venv फ़ोल्डर में निर्भरताएँ डाउनलोड करें
source .venv/bin/activate # वर्तमान शेल सत्र के लिए $PATH में स्थानीय स्क्रिप्ट डालें
uv tool install -e . # $PATH में स्थानीय स्क्रिप्ट को हमेशा के लिए डालें
pbtk
निम्नलिखित स्क्रिप्ट का उपयोग GUI के बिना, स्वतंत्र रूप से भी किया जा सकता है:
pbtk-jar-extract [-h] input_file [output_dir]
pbtk-from-binary [-h] input_file [output_dir]
pbtk-web-extract [-h] input_url [output_dir] # 2026 तक काम करने के लिए अपडेट की आवश्यकता है
मान लीजिए आप एक एंड्रॉइड एप्लिकेशन का रिवर्स इंजीनियरिंग कर रहे हैं। आपने अपने पसंदीदा डीकंपाइलर के साथ एप्लिकेशन का थोड़ा अन्वेषण किया और पाया कि यह HTTPS पर POST डेटा के रूप में प्रोटोबफ को विशिष्ट तरीके से परिवहन करता है।
आप PBTK खोलते हैं और एक सार्थक तरीके से स्वागत किया जाता है:

पहला कदम आपके .protos को टेक्स्ट फ़ॉर्मेट में प्राप्त करना है। यदि आप एक एंड्रॉइड ऐप को लक्षित कर रहे हैं, तो एक APK ड्रॉप करना और प्रतीक्षा करना जादू का काम करना चाहिए! (जब तक कि यह वास्तव में विदेशी कार्यान्वयन न हो)

यह हो जाने के बाद, आप ~/.pbtk/protos/<आपका APK नाम> पर जाते हैं (या तो कमांड लाइन के माध्यम से, या स्वागत स्क्रीन के नीचे बटन के माध्यम से अपनी फ़ाइल ब्राउज़र खोलने के लिए, जैसा आप पसंद करते हैं)। ऐप के सभी .protos वास्तव में यहाँ हैं।
अपने डीकंपाइलर में वापस, आप उस वर्ग पर ठोकर खाते हैं जो आपके रुचि के HTTPS एंडपॉइंट पर भेजे गए डेटा का निर्माण करता है। यह जेनरेट किए गए कोड से बने एक वर्ग को कॉल करके प्रोटोबफ संदेश को सीरियलाइज़ करता है।

बाद वाले वर्ग का आपके .protos निर्देशिका के अंदर एक सटीक मिलान होना चाहिए (अर्थात com.foo.bar.a.b com/foo/bar/a/b.proto से मेल खाएगा)। किसी भी तरह, इसके नाम को grep करने से आप इसे संदर्भित करने में सक्षम होंगे।
यह बहुत अच्छा है: अगली बात चरण 2 पर जाना है, अपनी वांछित इनपुट .proto का चयन करना, और अपने एंडपॉइंट के बारे में कुछ जानकारी भरना है।

आप कुछ नमूना कच्चा प्रोटोबफ डेटा भी दे सकते हैं, जो इस एंडपॉइंट पर भेजा गया था, जिसे mitmproxy या Wireshark के माध्यम से कैप्चर किया गया है, और जिसे आप हेक्स-एन्कोडेड रूप में पेस्ट करेंगे।
चरण 3 बटन क्लिक करने और देखने के मज़ेदार हिस्से के बारे में है कि क्या होता है! आपके पास एक ट्री व्यू है जो प्रोटोबफ संरचना में प्रत्येक फ़ील्ड का प्रतिनिधित्व करता है (दोहराए गए फ़ील्ड "+" से प्रत्ययित होते हैं, आवश्यक फ़ील्ड में चेकबॉक्स नहीं होते हैं)।

बस फ़ोकस पाने के लिए किसी फ़ील्ड पर होवर करें। यदि फ़ील्ड एक पूर्णांक प्रकार है, तो इसे बढ़ाने/घटाने के लिए माउस व्हील का उपयोग करें। होवर करने पर एनम जानकारी भी दिखाई देती है।
यहाँ यह है! आप इसके साथ प्रत्येक फ़ील्ड का अर्थ निर्धारित कर सकते हैं। यदि आपने मिनिफाइड कोड से .protos निकाले हैं, तो आप उनके नाम क्लिक करके फ़ील्ड का नाम बदल सकते हैं, जैसा कि आप देखते हैं कि उनका क्या अर्थ है।
हैप्पी रिवर्सिंग! 👌 🎉
PBTK निकाले गए .proto जानकारी को ~/.pbtk/protos/ (या Windows पर %APPDATA%\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 आंतरिक रूप से दो प्रकार के प्लग करने योग्य मॉड्यूल का उपयोग करता है: एक्सट्रैक्टर और ट्रांसपोर्ट।
एक्सट्रैक्टर src/pbtk/extractors/*.py में परिभाषित किए गए हैं। वे एक डेकोरेटर से पहले एक विधि के रूप में परिभाषित किए गए हैं, इस प्रकार:
@register_extractor(name = 'my_extractor',
desc = 'Foobar कोड (*.foo, *.bar) से प्रोटोबफ संरचनाएँ निकालें',
depends={'binaries': ['foobar-decompiler']})
def my_extractor(path):
# `path` इनपुट फ़ाइल की सामग्री लोड करें और अपना काम करें...
# फिर, जनरेटर का उपयोग करके निकाले गए .protos को yield करें:
for i in do_your_extraction_work():
yield proto_name + '.proto', proto_contents
# अन्य प्रकार की जानकारी भी yield की जा सकती है, जैसे एंडपॉइंट जानकारी या प्रदर्शित करने के लिए प्रगति।
ट्रांसपोर्ट src/pbtk/utils/transports.py में परिभाषित किए गए हैं। वे एक डेकोरेटर से पहले एक वर्ग के रूप में परिभाषित किए गए हैं, इस प्रकार:
@register_transport(
name = 'my_transport',
desc = 'कच्चे POST डेटा के रूप में प्रोटोबफ',
ui_data_form = 'hex strings'
)
class MyTransport():
def __init__(self, pb_param, url):
self.url = url
def serialize_sample(self, sample):
# हमें उपयोगकर्ता से इनपुट डेटा का एक नमूना मिला।
# सत्यापित करें कि यह "ui_data_form" पैरामीटर के माध्यम से वर्णित रूप में मान्य है, अन्यथा अपवाद के साथ विफल करें या False लौटाएँ।
# वैकल्पिक रूप से इसे लौटाने से पहले इस डेटा को संशोधित करें।
bytes.fromhex(sample)
return sample
def load_sample(self, sample, pb_msg):
# इनपुट डेटा को प्रदान किए गए प्रोटोबफ ऑब्जेक्ट में पार्स करें।
pb_msg.ParseFromString(bytes.fromhex(sample))
def perform_request(self, pb_data, tab_data):
# प्रदान किए गए URL और प्रोटोबफ ऑब्जेक्ट का उपयोग करके एक अनुरोध करें, और वैकल्पिक रूप से अन्य ट्रांसपोर्ट-विशिष्ट साइड डेटा।
return post(url, pb_data.SerializeToString(), headers=USER_AGENT)
निम्नलिखित आगामी रिलीज़ के लिए आ सकते हैं:
मैंने अधिकांश मॉड्यूल के लिए पूरी तरह से पढ़ने योग्य और टिप्पणी किया हुआ कोड (GUI सिग्नल कनेक्ट करने जैसे अधिकांश स्व-वर्णनात्मक भागों को छोड़कर) बनाने की पूरी कोशिश की है, ताकि आप योगदान कर सकें।
pbtk को GNU GPL लाइसेंस के तहत जारी किया गया है (मैं, इसके द्वारा, आदि)।
प्रोजेक्ट नाम के अक्षर मामले के लिए कोई औपचारिक नियम नहीं है, नियम बस अपने दिल का पालन करना है ❤