
ऑब्जेक्ट फ़ाइल सीमाओं का पता लगाने के लिए एक Ghidra प्लगइन।
DeepCut / CodeCut GUI के लिए Ghidra प्लगिन
CodeCut उपयोगकर्ता को Ghidra में फ़ंक्शनों को ऑब्जेक्ट फ़ाइलों में निर्दिष्ट करने की अनुमति देता है, और फिर बाइनरी के साथ ऑब्जेक्ट फ़ाइल स्तर पर इंटरैक्ट करता है। फ़ंक्शनों को ऑब्जेक्ट फ़ाइलों में Ghidra डेटाबेस में Namespace फ़ील्ड सेट करके निर्दिष्ट किया जाता है। DeepCut प्रारंभिक ऑब्जेक्ट फ़ाइल सीमाएँ स्थापित करने का प्रयास करता है, जिसे उपयोगकर्ता फिर CodeCut Table विंडो का उपयोग करके समायोजित कर सकता है।
अधिकांश बाइनरी कई सोर्स कोड फ़ाइलों से उत्पन्न होती हैं। रिवर्सिंग करते समय, RE विश्लेषक अक्सर यह समझ विकसित करते हैं कि कौन से फ़ंक्शन संबंधित हैं, और इसलिए संभवतः एक ही सोर्स फ़ाइल के थे। CodeCut विश्लेषक को इस तरह की परिकल्पना विकसित करने की अनुमति देता है जैसे "मुझे लगता है कि यह फ़ंक्शनों का ब्लॉक OS फ़ंक्शन है।" अब यदि उस क्षेत्र में अन्वेषित न किए गए फ़ंक्शन हैं, तो वे डिसअसेंबली और डीकंपाइलेशन में केवल FUN_XXXXXXXX के बजाय OS::FUN_XXXXXXXX के रूप में दिखाई देंगे। इससे संदर्भ में देखे जाने पर फ़ंक्शन किस लिए हो सकते हैं, इसकी अधिक तेज़ी से समझ विकसित होती है।
सामान्य Ghidra एक्सटेंशन स्थापना प्रक्रियाओं का पालन करें। CodeCut और DeepCut एक्सटेंशन zip को $GHIDRA_INSTALL_DIR/Extensions में कॉपी करें, फिर मुख्य Ghidra विंडो में File -> Install Extensions चुनें और CodeCut और DeepCut बॉक्स चुनें। Ghidra आपको बताएगा कि उसे पुनः आरंभ करने की आवश्यकता है। अब जब Ghidra को केवल प्लगिन को आधार संस्करण के major/minor से मेल खाना आवश्यक है, न कि patch संस्करणों से, हम केवल सम major/minor संस्करण जारी करने की उम्मीद करते हैं।
ध्यान दें: पुनः आरंभ करने और CodeBrowser विंडो लोड करने के बाद, Ghidra आपको बताएगा कि उसे नए प्लगिन मिले हैं और पूछेगा कि क्या आप उन्हें कॉन्फ़िगर करना चाहते हैं। इस विंडो में केवल CodeCut दिखाई देता है। ऐसा इसलिए है क्योंकि DeepCut एक "one-shot" विश्लेषक है (यह अभी भी स्थापित है)।
CodeCut और DeepCut दोनों नेटिव PyGhidra एक्सटेंशन पर निर्भर करते हैं, और Jython के साथ संगत नहीं हैं। CodeCut मॉड्यूल नामों का अनुमान लगाने के लिए नेटिव Python का उपयोग करता है। DeepCut का मॉडल अनुमान (model inference) नेटिव Python में चलता है।
CodeCut:
DeepCut:
निर्भरताएँ स्थापित करने के लिए, चलाएँ:
pip install nltk
pip install torch torch-geometric networkx scipy
अपने PyGhidra से लिंक किए गए Python इंस्टॉलेशन का उपयोग करते हुए।
DeepCut को प्रारंभिक स्वचालित विश्लेषण के बाद एक one-shot विश्लेषक के रूप में चलाना सबसे अच्छा है। Analysis -> One Shot -> Deepcut चुनें। DeepCut चलने के बाद, आप Symbol Table दृश्य में Namespace फ़ील्ड को देखकर परिणाम देख सकते हैं।

DeepCut चलने के बाद, आप CodeCut Table दृश्य के साथ ऑब्जेक्ट फ़ाइल स्तर पर इंटरैक्ट कर सकते हैं। तालिका प्रदर्शित करने के लिए Window -> CodeCut Table चुनें। CodeCut तालिका अनिवार्य रूप से प्रतीक तालिकाओं (symbol tables) का एक संयुक्त समूह है, प्रत्येक मॉड्यूल के लिए एक।
आप CodeCut Table विंडो में Analysis -> Guess Module Names चुनकर मॉड्यूल नामों का अनुमान (स्ट्रिंग संदर्भों के आधार पर) लगा सकते हैं। यह सहायक है यदि आपका लक्षित निष्पादन योग्य (executable) बहुत सारे डिबग स्ट्रिंग्स रखता है। नाम अनुमान स्क्रिप्ट पहले सोर्स फ़ाइल नामों को खोजने का प्रयास करती है, फिर स्ट्रिंग्स (बिग्राम और ट्राइग्राम सहित) पर वापस जाती है जो कई बार दोहराई जाती हैं।
आप किसी ऑब्जेक्ट पर राइट क्लिक करके और Split Namespace Here / Combine Namespaces चुनकर ऑब्जेक्ट फ़ाइलों को विभाजित/संयोजित कर सकते हैं। आप उन्हें खींचकर और छोड़कर ऑब्जेक्ट फ़ाइलों के बीच फ़ंक्शनों को स्थानांतरित कर सकते हैं (ऑब्जेक्ट फ़ाइलों की सीमाओं को बदलते हुए)।
CodeCut में Export मेनू के अंतर्गत किसी पूरे मॉड्यूल या मॉड्यूल की उप-सीमा (subrange) को पुनः संकलन योग्य C के रूप में निर्यात करने के दो विकल्प हैं, जब आप CodeCut तालिका में किसी मॉड्यूल पर राइट क्लिक करते हैं। यह सुविधा EXPERIMENTAL के रूप में चिह्नित है और अच्छी तरह से परीक्षण नहीं की गई है।

CodeCut में अब बाइनरी के भीतर मॉड्यूल की अंतःक्रियाओं / पदानुक्रम (hierarchy) को देखने के लिए एक ग्राफ़ विकल्प है। CodeCut Table में किसी फ़ंक्शन पर राइट क्लिक करके और Add Namespace to Graph चुनकर ग्राफ़ दृश्य में नेमस्पेस जोड़ें। आप राइट क्लिक करके और Show Namespaces in Graph Filter चुनकर ग्राफ़ से मॉड्यूल हटा सकते हैं।
हालाँकि ऐसा लगता है कि आप दाईं ओर मॉड्यूल नामों पर राइट क्लिक कर सकते हैं, CodeCut वास्तव में ध्यान देता है कि तालिका में कौन सा फ़ंक्शन हाइलाइट किया गया है। इसलिए, उदाहरण के लिए, यदि आपके पास object3 में एक फ़ंक्शन हाइलाइट है और आप बाईं ओर ग्रे object2 बॉक्स पर राइट क्लिक करते हैं और Combine/Split या Rename Namespaces चुनते हैं, तो CodeCut ऑपरेशन को उस फ़ंक्शन से निष्पादित करेगा जो आपने object3 में हाइलाइट किया है।
CodeCut नेमस्पेस को उनके प्रारंभिक पते के अनुसार क्रमबद्ध करने का प्रयास करता है। CodeCut मॉड्यूल को क्रम से बाहर सूचीबद्ध करता हुआ दिखाई दे सकता है, हालाँकि यह आमतौर पर Ghidra से डिसअसेंबली अनियमितताओं के कारण होता है। उदाहरण के लिए, मान लें कि हमारे पास एक मेमोरी मैप है जो इस प्रकार दिखता है:
object2: 0x00010000 - 0x00018000
object3: 0x00018004 - 0x00020000
...
object50: 0x00480000 - 0x00480a00
मान लें कि 0x00480000 पर फ़ंक्शन एक शाखा या कूद (branch or jump) एक पते 0x00016008 पर बनाता है। यह एक नया फ़ंक्शन प्रवेश बिंदु होना चाहिए, लेकिन यदि केवल एक फ़ंक्शन इसका उपयोग करता है, तो Ghidra इसे फ़ंक्शन प्रवेश बिंदु के रूप में लेबल नहीं कर सकता है, और इसे केवल FUN_00480000 का हिस्सा मान सकता है। इसका मतलब है कि object50 की वास्तविक सीमा 0x00016008 - 0x00480a00 है। और इसलिए object50 तालिका में object2 और object3 के बीच दिखाई देगा। CodeCut मॉड्यूल रेंज को Ghidra के एप्लिकेशन लॉग में आउटपुट करता है ताकि इसे डीबग करने में मदद मिल सके। इस मामले में 0x00016008 को एक फ़ंक्शन के रूप में परिभाषित करने से object50 की सीमाएँ सही मान होंगी और object50 तालिका में सही जगह पर दिखाई देगा।
DeepCut विश्लेषण चलाने के बाद परिभाषित किए जाने वाले फ़ंक्शन डिफ़ॉल्ट रूप से Global नेमस्पेस में जोड़े जाते हैं। भविष्य में हम एक सुविधा जोड़ने की योजना बना रहे हैं जो उन्हें स्वचालित रूप से निकटतम नेमस्पेस में जोड़ देगी, या एकल फ़ंक्शनों को सीधे किसी विशिष्ट नेमस्पेस में अधिक आसानी से निर्दिष्ट करने के लिए एक तंत्र देगी।
विशिष्ट निर्माण निर्देश DeepCut और CodeCut उपफ़ोल्डरों में दिए गए हैं।