Adding Compilation Metadata To Binaries To Make Disassembly Decidable
यह शोध पत्र एक ऐसे बाइनरी फॉर्मेट का प्रस्ताव करता है जिसे कॉम्पैक्ट, कंपाइलर-जनरेटेड मेटाडेटा के साथ संवर्धित किया गया है जो स्ट्रिप्ड बाइनरी और ओपन सोर्स के बीच के अंतर को पाटता है, जिससे रनटाइम पर प्रदर्शन को प्रभावित किए बिना विश्वसनीय डिसअसेंबली, इंस्ट्रुमेंटेशन और रीकंपाइलेशन सक्षम होता है।
मूल पेपर CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) के तहत लाइसेंस किया गया है। नीचे दिए गए पेपर की यह व्याख्या AI से तैयार की गई है। इसे लेखकों ने न तो लिखा है, न इसका समर्थन किया है। तकनीकी सटीकता के लिए मूल पेपर देखें। पूरा डिस्क्लेमर पढ़ें
कल्पना कीजिए कि आप लेगो (LEGO) निर्देशों का एक उच्च-स्तरीय, सीलबंद बॉक्स खरीदते हैं। लेकिन एक स्पष्ट पुस्तिका के बजाय जिसमें चित्र हों, आपको ढीले ईंटों (bricks) का एक बैग और एक संक्षिप्त नोट मिलता है जिसमें लिखा है, "कुछ बनाओ।"
यह तब होता है जब सॉफ्टवेयर कंपनियाँ बाइनरी एक्जीक्यूटेबल्स (वे .exe या .elf फाइलें जिन्हें आपका कंप्यूटर चलाता है) वितरित करती हैं। कंप्यूटर के लिए, यह निर्देशों का एक सटीक सेट है। लेकिन एक इंसान के लिए जो इसे समझने, ठीक करने या सुरक्षित करने की कोशिश कर रहा है, यह एक ब्लैक बॉक्स है। मूल सोर्स कोड (उस "ब्लूप्रिंट") के बिना, यह समझने की कोशिश करना कि सॉफ्टवेयर कैसे काम करता है, एक अकेले टुकड़े को चखकर केक के पीछे के इंजीनियरिंग (reverse-engineer) को समझने जैसा है। आप अनुमान लगा सकते हैं कि यह चॉकलेट है, लेकिन आप सुनिश्चित नहीं हो सकते कि इसमें नमक है या कोई विशिष्ट चरण छोड़ दिया गया है।
यह पेपर ELLF (एक्जीक्यूटेबल, लिंकेबल, और लिफ्टेबल फॉर्मेट) नामक एक समाधान प्रस्तावित करता है। इसे उस सीलबंद लेगो बॉक्स के अंदर एक डिजिटल "रेसिपी कार्ड" जोड़ने के रूप में सोचें।
समस्या: "ब्लैक बॉक्स" का दुःस्वप्न
वर्तमान में, जब सॉफ्टवेयर कंपाइल (मानव-पठनीय कोड से मशीन कोड में बदलना) होता है, तो कंपाइलर "नक्शा" फेंक देता है। वह जानता है कि प्रत्येक निर्देश कहाँ शुरू होता है, प्रत्येक वेरिएबल कहाँ रहता है, और लॉजिक कैसे प्रवाहित होता है। लेकिन एक बार जब फ़ाइल को "स्ट्रिप" (वितरण के लिए साफ किया गया) कर दिया जाता है, तो वह नक्शा गायब हो जाता है।
इन फाइलों का विश्लेषण करने की कोशिश कर रहे सुरक्षा शोधकर्ता और डेवलपर्स एक अनुमान लगाने वाला खेल खेलते हैं:
- "क्या यह नंबरों का समूह एक निर्देश है जो कंप्यूटर को जंप करने के लिए कहता है, या यह सिर्फ रैंडम डेटा है?"
- "यह फंक्शन कहाँ समाप्त होता है?"
- "यह मेमोरी ब्लॉक नामों की एक सूची है या संख्याओं का एक स्टैक?"
क्योंकि उन्हें अनुमान लगाना पड़ता है, इसलिए वे अक्सर गलतियाँ करते हैं। इससे सुरक्षा संबंधी खामियां छूट जाती हैं, या पैच गलत तरीके से लागू किए जाते हैं, जिससे सॉफ्टवेयर टूट जाता है।
समाधान: "रेसिपी कार्ड" (ELLF)
लेखक, डैनियल एंजल और उनकी टीम, एक बीच का रास्ता सुझाते हैं। वे मूल सोर्स कोड (मूल रेसिपी) को उजागर नहीं करना चाहते, लेकिन वे कंपाइलर के इरादे (रेसिपी कार्ड) को देना चाहते हैं।
उन्होंने एक ऐसा टूल बनाया है जो निर्माण प्रक्रिया के दौरान एक स्मार्ट लेखक (scribe) की तरह कार्य करता है। अंतिम बाइनरी को सील करने से पहले, यह लेखक "सत्य" की एक छोटी, कुशल सूची लिखता है और उसे फ़ाइल के अंदर रख देता है। इस सूची में शामिल हैं:
- निर्देश मानचित्र (Instruction Map): "यहाँ ठीक वही जगह है जहाँ प्रत्येक कमांड शुरू होता है।" (अब यह अनुमान लगाने की जरूरत नहीं कि कोई नंबर कोड है या डेटा)।
- पॉइंटर मानचित्र (Pointer Map): "यह नंबर एक फंक्शन की ओर इशारा करने वाला पॉइंटर है; वह नंबर बस एक कच्चा मान (raw value) है।"
- संरचना मानचित्र (Structure Map): "मेमोरी का यह ब्लॉक 'user_id' नामक एक वेरिएबल है; वह ब्लॉक 50 आइटमों का एक ऐरे (array) है।"
उपमा: "लिफ्टर" (The Lifter)
कल्पना कीजिए कि आपके पास एक जिग्सॉ पहेली (jigsaw puzzle) है जिसे चिपका दिया गया है और जिसके पीछे का चित्र खरोंच दिया गया है।
- पुराना तरीका: आप आकारों के आधार पर अनुमान लगाने की कोशिश करते हैं कि टुकड़े कहाँ फिट होते हैं। कभी-कभी आप सही होते हैं; अक्सर नहीं।
- नया तरीका (ELLF): जिस फैक्ट्री ने पहेली बनाई है, उसने हर टुकड़े के पीछे एक छोटा, अदृश्य QR कोड चिपका दिया है। जब आप इसे स्कैन करते हैं, तो एक कंप्यूटर आपको बताता है कि कौन सा टुकड़ा कहाँ जाता है, चित्र क्या है, और टुकड़े एक-दूसरे से कैसे जुड़ते हैं।
यह पेपर इस प्रक्रिया को "लिफ्टिंग" (Lifting) कहता है। यह कम-स्तरीय (low-level) मशीन कोड को एक साफ, समझने योग्य असेंबली भाषा में "लिफ्ट" करता है जो पुनः कंपाइल करने योग्य (recompilable) है। इसका मतलब है कि आप बाइनरी को ले सकते हैं, उसे वापस पठनीय कोड में बदल सकते हैं, एक बदलाव कर सकते हैं (जैसे बग को ठीक करना), और इसे वापस एक ऐसे बाइनरी में बदल सकते हैं जो ठीक मूल की तरह काम करता है, बस आपके सुधार के साथ।
यह एक बड़ी बात क्यों है?
- सुरक्षा: सुरक्षा उपकरण अब बाइनरी को देख सकते हैं और कह सकते हैं, "मैं निश्चित रूप से जानता हूँ कि यह मेमोरी ब्लॉक 10 आइटमों का एक स्टैक है," बजाय इसके कि वे अनुमान लगाएं। यह सुरक्षा खामियों को ढूंढना बहुत आसान बनाता है।
- विश्वास: लेखकों ने साबित किया कि यदि आप एक प्रोग्राम लेते हैं, उसे स्ट्रिप करते हैं, अपना "रेसिपी कार्ड" जोड़ते हैं, और फिर उसे पुनर्गठित करने की कोशिश करते हैं, तो परिणाम पूरी तरह से काम करता है। यह मूल की तरह ही व्यवहार करता है।
- दक्षता: उन्होंने आज उपयोग किए जाने वाले मानक डिबगिंग सूचना (DWARF) के साथ अपने "रेसिपी कार्ड" की तुलना की। उनका संस्करण 83% छोटा है। यह फ़ाइल पर एक छोटा टैग है, न कि एक बड़ा बोझ।
पकड़ (और वास्तविकता की जांच)
पेपर इस बारे में ईमानदार है कि यह क्या नहीं करता है।
- यह आपको मूल सोर्स कोड नहीं देता है। आप अभी भी उस सुंदर, अच्छी तरह से कमेंट किए गए C++ कोड को नहीं देखेंगे जिसे प्रोग्रामर ने लिखा था। आप मशीन कोड का एक बहुत ही साफ, संरचित संस्करण देखेंगे, लेकिन आपको अभी भी यह समझने के लिए कड़ी मेहनत करनी होगी कि कोड वास्तव में क्या कर रहा है (लॉजिक)।
- यह हस्तलिखित असेंबली (handwritten assembly) पर काम नहीं करता है। यदि किसी प्रोग्रामर ने बिना कंपाइलर के मैन्युअल रूप से मशीन कोड लिखा है, तो रेसिपी कार्ड लिखने के लिए कोई "लेखक" नहीं है। सिस्टम रेसिपी कार्ड लिखने के लिए कंपाइलर पर निर्भर करता है।
निष्कर्ष
यह पेपर सॉफ्टवेयर वितरण के लिए एक नया मानक प्रस्तावित करता है। एक "ब्लैक बॉक्स" भेजने के बजाय जिसे विश्लेषण करना असंभव है, या "सोर्स कोड" भेजने के बजाय जो व्यापारिक रहस्यों को प्रकट करता है, हम एक "पारदर्शी बॉक्स" भेज सकते हैं।
यह एक मैकेनिक को कार इंजन देने जैसा है जिसमें हर बोल्ट लेबल किया गया है और हर तार का रंग कोडेड है, बिना उन्हें यह बताए कि कार को कैसे डिजाइन किया गया था। वे इसे ठीक कर सकते हैं, अपग्रेड कर सकते हैं, और यह सुनिश्चित कर सकते हैं कि यह सुरक्षित है, और यह सब कुछ किए बिना कि निर्माता का गुप्त नुस्खा (secret sauce) क्या है। यह हमारे सॉफ्टवेयर को सुरक्षित, अधिक रखरखाव योग्य और छिपी हुई कमजोरियों से कम संवेदनशील बनाता है।
अपने क्षेत्र के पेपरों की भीड़ में उलझे हुए हैं?
आपके रिसर्च कीवर्ड से मेल खाने वाले सबसे नए और अलग सोच वाले पेपरों का रोज़ाना Digest पाएँ—तकनीकी सारांश के साथ, आपकी भाषा में।