
Human-friendly Thrift encoder/decoder
Readable Thrift बाइनरी Thrift प्रोटोकॉल संदेशों के साथ काम करना आसान बनाता है, उन्हें मानव-अनुकूल प्रारूप में और वहाँ से परिवर्तित करके। यह बाइनरी प्रारूप Thrift संदेशों का मैन्युअल विश्लेषण और छेड़छाड़ को HTTP जैसे प्लेनटेक्स्ट प्रोटोकॉल के साथ काम करने जितना आसान बनाता है।
लाइब्रेरी Java में लागू की गई है, जो JVM पर चलने वाले लोकप्रिय वेब एप्लिकेशन परीक्षण उपकरणों, जैसे Burp और ZAP, के एक्सटेंशन के साथ एकीकरण को सक्षम बनाती है। किसी विश्लेषण या छेड़छाड़ उपकरण को चालू करने के लिए केवल उपयुक्त बाइट्स को पार्स करना और उन्हें कोडेक को देना होता है।
readablethrift लाइब्रेरी एक Gradle-आधारित Maven पैकेज है जिसे अन्य परियोजनाओं में निर्भरता के रूप में शामिल करके स्थापित किया जा सकता है। यह एन्कोडिंग और डिकोडिंग के लिए चार सरल विधियाँ प्रदान करता है, कच्चे बाइनरी या Base64-एन्कोडेड रूप में।
नोट: वर्तमान में केवल मानक बाइनरी प्रारूप प्रोटोकॉल समर्थित है। कॉम्पैक्ट बाइनरी और JSON (कोडेक द्वारा उत्पादित पठनीय JSON से अलग) अभी तक समर्थित नहीं हैं।
ThriftCodec::decode विधि एक वर्णनात्मक org.json.JSONObject इंस्टेंस सीधे कच्चे बाइट बफर से बनाती है जिसमें एक बाइनरी Thrift संदेश होता है।ThriftCodec::decodeB64String स्थैतिक विधि एक Base64 स्ट्रिंग को डिकोड करेगी और फिर उस पर decode को कॉल करेगी।ThriftCodec::encode विधि एक वर्णनात्मक org.json.JSONObject इंस्टेंस को कच्चे बाइट बफर में परिवर्तित करती है जिसमें समकक्ष Thrift बाइनरी संदेश होता है।ThriftCodec::b64encodeJson स्थैतिक विधि एक JSON ऑब्जेक्ट को Thrift बाइनरी प्रारूप में परिवर्तित करेगी और परिणाम को Base64 एन्कोड करेगी।ThriftCodec क्लास को विस्तारशील बनाने के लिए डिज़ाइन किया गया है ताकि यह Thrift बाइनरी प्रोटोकॉल प्रारूप में संशोधन या एक्सटेंशन को संभाल सके, जैसे अतिरिक्त बाइनरी प्रारूप हेडर या एनकैप्सुलेशन।
लाइब्रेरी में शामिल इंटरैक्टिव कमांड लाइन इंटरफ़ेस का उपयोग करने के लिए, JAR बनाने के लिए डिफ़ॉल्ट Gradle कार्य का उपयोग करें और फिर इसे java -jar के साथ चलाएँ:
$ ./gradlew
BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
$ java -jar build/libs/readablethrift-1.0.0-all.jar
Enter Base64 encoded message or JSON object (or q to quit):
यह दिखाने के लिए कि मानव-पठनीय JSON कैसा दिखेगा, आइए कुछ एप्लिकेशन ट्रैफ़िक से निकाला गया एक उदाहरण Base64-एन्कोडेड बाइनरी ब्लॉब लें:
$ base64 -D | hexdump
gAEAAQAAAAVsb2dpbgAAAAAMAAALAAAAAAAIY29vbHVzZXILAAEAAAALcGFzc3dvcmQxMjMAAA==
00000000: 8001 0001 0000 0005 6c6f 6769 6e00 0000 ........login...
00000010: 000c 0000 0b00 0000 0000 0863 6f6f 6c75 ...........coolu
00000020: 7365 720b 0001 0000 000b 7061 7373 776f ser.......passwo
00000030: 7264 3132 3300 00 rd123..
"login", उपयोगकर्ता नाम और पासवर्ड स्ट्रिंग्स संकेत देती हैं कि यह एक प्रमाणीकरण अनुरोध है। यदि कोई इस संदेश के साथ तुरंत छेड़छाड़ करना चाहता है, तो उन्हें Thrift प्रोटोकॉल बाइनरी प्रारूप पार्सर के आंतरिक विवरणों को देखना होगा, हेक्स संपादक के साथ संदेश की संरचना का पता लगाना होगा, और फिर प्रत्येक फ़ील्ड को मैन्युअल रूप से अपडेट करना होगा। उपयोगकर्ता नाम और पासवर्ड स्ट्रिंग्स के मामले में, स्ट्रिंग्स के अलावा उपसर्ग लंबाई मानों को भी अपडेट करना आवश्यक होगा। यह एक थकाऊ, त्रुटि-प्रवण और समय लेने वाली प्रक्रिया होगी। Readable Thrift इस प्रक्रिया को सरल बनाता है; यहाँ वही संदेश है जब इसे इसमें पास किया जाता है:
Enter Base64 encoded message or JSON object (or q to quit): gAEAAQAAAAVsb2dpbgAAAAAMAAALAAAAAAAIY29vbHVzZXILAAEAAAALcGFzc3dvcmQxMjMAAA==
{"message": {
"name": "login",
"type": "call",
"fields": [{
"id": 0,
"type": "struct",
"value": [
{
"id": 0,
"type": "string",
"value": "cooluser"
},
{
"id": 1,
"type": "string",
"value": "password123"
}
]
}],
"seqid": 0
}}
अब हम आसानी से सत्यापित कर सकते हैं कि संदेश "login" विधि के लिए एक कॉल का वर्णन करता है, जिसमें तर्क के रूप में दो स्ट्रिंग मानों वाला एक struct है। स्ट्रिंग मानों को अपडेट करना value JSON फ़ील्ड्स को संपादित करने और नए JSON टेक्स्ट को कोडेक में वापस पास करने जितना सरल है। सभी लंबाई उपसर्ग और बाइनरी प्रारूप के अन्य विवरण स्वचालित रूप से संभाले जाएँगे।
संभावित वैकल्पिक मापदंडों का परीक्षण करने के लिए नए फ़ील्ड जोड़ना भी संभव है। शायद कोई व्यवस्थापक या डीबग बूलियन फ़्लैग है? या अनुमति आईडी की सूची? id, type और value के साथ एक नया फ़ील्ड वर्णित करें, और फिर इसे fields सरणी में जोड़ें:
Enter Base64 encoded message or JSON object (or q to quit): {"message": {
"name": "login",
"type": "call",
"fields": [{
"id": 0,
"type": "struct",
"value": [
{
"id": 0,
"type": "string",
"value": "differentuser"
},
{
"id": 1,
"type": "string",
"value": "differentpassword!"
}
]
},
{"id": 1, "type": "bool", "value": true},
{"id": 2, "type": "list", "value":
{
"elemType": "i32",
"list": [1, 2, 3]
}
},
{"id": 3, "type": "map", "value":
{
"keyType": "string",
"valueType": "string",
"map": {
"dog": "bark",
"cat": "meow"
}
}
}],
"seqid": 0
}}
gAEAAQAAAAVsb2dpbgAAAAAMAAALAAAAAAANZGlmZmVyZW50dXNlcgsAAQAAABJkaWZmZXJlbnRwYXNzd29yZCEAAgABAQ8AAggAAAADAAAAAQAAAAIAAAADDQADCwsAAAACAAAAA2NhdAAAAARtZW93AAAAA2RvZwAAAARiYXJrAA==
नीचे अद्यतन संदेश है जिसे वापस Thrift बाइनरी प्रोटोकॉल में परिवर्तित किया गया है:
$ base64 -D | hexdump
gAEAAQAAAAVsb2dpbgAAAAAMAAALAAAAAAANZGlmZmVyZW50dXNlcgsAAQAAABJkaWZmZXJlbnRwYXNzd29yZCEAAgABAQ8AAggAAAADAAAAAQAAAAIAAAADDQADCwsAAAACAAAAA2NhdAAAAARtZW93AAAAA2RvZwAAAARiYXJrAA==
00000000: 8001 0001 0000 0005 6c6f 6769 6e00 0000 ........login...
00000010: 000c 0000 0b00 0000 0000 0d64 6966 6665 ...........diffe
00000020: 7265 6e74 7573 6572 0b00 0100 0000 1264 rentuser.......d
00000030: 6966 6665 7265 6e74 7061 7373 776f 7264 ifferentpassword
00000040: 2100 0200 0101 0f00 0208 0000 0003 0000 !...............
00000050: 0001 0000 0002 0000 0003 0d00 030b 0b00 ................
00000060: 0000 0200 0000 0363 6174 0000 0004 6d65 .......cat....me
00000070: 6f77 0000 0003 646f 6700 0000 0462 6172 ow....dog....bar
00000080: 6b00