
अपने डीकंपाइलर से आपके डीबगर में इंटरैक्टिव सिंबल शामिल करने के लिए एक प्लगइन
रिवर्स इंजीनियरिंग में स्थैतिक (डीकंपाइलर) और गतिशील (डीबगर) दोनों विश्लेषण शामिल हैं, फिर भी हम अक्सर इन विश्लेषणों का उपयोग दोनों के बीच ज्ञान साझा किए बिना करते हैं। स्थैतिक बाइनरी को रिवर्स करने के मामले में, डीबगर असेंबली और डीकंपाइलेशन में आपके द्वारा रिवर्स किए गए प्रतीकों के बीच संदर्भ स्विच करना अक्षम हो सकता है।
decomp2dbg का उद्देश्य डीकंपाइलर और डीबगर के बीच संदर्भ स्विचिंग के अंतर को कम करना है, जो एक सामान्य API प्रस्तुत करता है डीकंपाइलर-से-डीबगर प्रतीक सिंकिंग के लिए। प्रभाव में, यह रिवर्सर को अपने डीबगर की शक्ति देता है जिसमें उनके डीकंपाइलर में पुनर्प्राप्त किए गए प्रतीक और डीकंपाइलेशन लाइनें होती हैं।

व्यवहार में decomp2dbg कैसा दिखता है, यह देखने में रुचि है? CactusCon 2023 में रिकॉर्ड किया गया टॉक देखें, जिसमें Ghidra प्रतीकों के साथ x64 मशीन से दूरस्थ arm32 बाइनरी को डीबग करना दिखाया गया है।
सक्रिय सहायता के लिए, नीचे BinSync Discord से जुड़ें, जहां हम decomp2dbg प्रश्नों का उत्तर देते हैं:
pip के माध्यम से स्थापित करें, फिर डीकंपाइलरों के लिए अंतर्निहित इंस्टॉलर का उपयोग करें:
pip3 install decomp2dbg && decomp2dbg --install
यह एक प्रॉम्प्ट खोलेगा जहां आपसे अपने पसंदीदा डीकंपाइलर और डीबगर का पथ दर्ज करने के लिए कहा जाएगा।
Ghidra के लिए, आपको PyGhidra मोड में लॉन्च करना होगा, और प्लगइन (d2d_client.py) को सक्षम करना होगा, जैसा कि यहाँ दिखाया गया है।
यदि आपने Binja Plugin Manager में डीकंपाइलर-साइड स्थापित किया है, तब भी आपको उपरोक्त के साथ डीबगर साइड स्थापित करना होगा।
नोट: आपको decomp2dbg को अपने डीकंपाइलर और डीबगर के समान Python वातावरण में स्थापित करना होगा।
नोट: decomp2dbg को डीकंपाइलर से कनेक्ट करने के लिए आपको पोर्ट 3662, या आपके द्वारा उपयोग किए जाने वाले पोर्ट पर इनबाउंड कनेक्शन की अनुमति देनी पड़ सकती है।
यदि आप GEF या pwndbg के साथ decomp2dbg स्थापित कर रहे हैं, तो यह महत्वपूर्ण है कि आपकी ~/.gdbinit में d2d.py फ़ाइल GEF या pwndbg के बाद स्रोत (sourced) हो।
यदि आप उपरोक्त स्थापना का उपयोग बिना किसी त्रुटि के करने में सक्षम थे, तो इसे छोड़ें। यदि आप उपरोक्त अंतर्निहित स्क्रिप्ट का उपयोग नहीं कर सकते हैं (डीकंपाइलर के लिए गैर-WSL Windows स्थापना), तो नीचे दिए गए चरणों का पालन करें:
यदि आपको केवल डीकंपाइलर पक्ष की आवश्यकता है, तो संबंधित डीकंपाइलर प्लगइन को डीकंपाइलर के प्लगइन फ़ोल्डर में कॉपी करें। IDA में इसे करने का तरीका यहां दिया गया है:
पहले, रेपो को क्लोन करें:
git clone https://github.com/mahaloz/decomp2dbg.git
स्थापित करें:
pip install .
सभी सर्वर फ़ाइल को कॉपी करें:
cp ./decomp2dbg/d2d_server.py /path/to/ida/plugins/
यदि आपको gdb पक्ष भी स्थापित करने की आवश्यकता है, तो नीचे दी गई लाइन का उपयोग करें:
cp ./decomp2dbg/d2d_client.py ~/.d2d.py && echo "source ~/.d2d.py" >> ~/.gdbinit
पहले, अपने डीकंपाइलर पर डीकंपाइलेशन सर्वर प्रारंभ करें। हो सकता है कि आप इसे प्रारंभ करने से पहले अपने डीकंपाइलर द्वारा अपने सामान्य विश्लेषण को पूरा करने तक प्रतीक्षा करना चाहें। सामान्य विश्लेषण के बाद, यह हॉटकी Ctrl-Shift-D का उपयोग करके,
या अपने संबंधित प्लगइन टैब में decomp2dbg: configure टैब का चयन करके किया जा सकता है। सर्वर प्रारंभ करने के बाद, आपको अपने डीकंपाइलर में एक संदेश दिखना चाहिए
[+] Starting XMLRPC server: localhost:3662
[+] Registered decompilation server!
इसके बाद, अपने डीबगर में, चलाएँ:
decompiler connect <decompiler_name>
यदि आप डीकंपाइलर को VM या अलग मशीन पर चला रहे हैं, तो आप वैकल्पिक रूप से होस्ट और पोर्ट प्रदान कर सकते हैं जिनसे कनेक्ट करना है। यहां एक उदाहरण है:
decompiler connect ida --host 10.211.55.2 --port 3662
आप सभी कमांड का उपयोग कैसे करें, इसका पता --help फ्लैग के साथ डीकंपाइलर कमांड चलाकर लगा सकते हैं।
पहला कनेक्शन बाइनरी में ग्लोबल्स की मात्रा के आधार पर पंजीकृत होने में 30 सेकंड तक लग सकता है। यदि सब कुछ ठीक रहा, तो आपको दिखना चाहिए:
[+] Connected to decompiler!
यदि आप किसी लाइब्रेरी के लिए decomp2dbg का उपयोग कर रहे हैं, अर्थात जिस मुख्य बाइनरी से आपका डीबगर जुड़ा है, वह वह बाइनरी नहीं है जिसके लिए आप स्रोत चाहते हैं, तो आपको रीडमी के Advanced Usage - Shared Libs अनुभाग को देखना चाहिए।
प्रत्येक ब्रेकपॉइंट इवेंट पर, अब आपको डीकंपाइलेशन मुद्रित दिखाई देगा, और आप जिस लाइन पर हैं वह ब्रेक पते से संबद्ध है।
आपके डीकंपाइलेशन से फंक्शन और ग्लोबल वेरिएबल अब सामान्य स्रोत-स्तर प्रतीकों की तरह आपके GDB में मैप हो गए हैं। इसका मतलब है कि प्रिंट और परीक्षण जैसे सामान्य GDB कमांड मूल रूप से काम करते हैं:
b sub_46340
x/10i sub_46340
p dword_267A2C
x dword_267A2C
कुछ वेरिएबल जो किसी फंक्शन में स्थानीय रूप से संग्रहीत होते हैं, स्टैक वेरिएबल होते हैं। उन वेरिएबल के लिए जिन्हें स्टैक या रजिस्टरों पर मैप किया जा सकता है, हम उन्हें सुविधा वेरिएबल के रूप में आयात करते हैं। आप उनकी सामग्री को सामान्य GDB सुविधा वेरिएबल की तरह देख सकते हैं:
p $v4
स्टैक वेरिएबल हमेशा अपना पता स्टैक पर संग्रहीत करेंगे। यह देखने के लिए कि वास्तव में उस स्टैक वेरिएबल में क्या मान है, बस वेरिएबल को डीरेफरेंस करें:
x $v4
यह फंक्शन आर्गुमेंट के साथ भी काम करता है यदि लागू हो (माइलेज भिन्न हो सकता है):
p $a1
नोट: इस मामले में $v4 केवल तब तक मैप रहेगा जब तक आप उसी फंक्शन में हैं। एक बार जब आप फंक्शन छोड़ देते हैं, तो यह अनमैप हो सकता है या किसी अन्य मान पर रीमैप हो सकता है।
जब आप मेमोरी के किसी अनुभाग के लिए डीकंपाइलेशन (और प्रतीक) प्रदर्शित करना चाहते हैं जो मुख्य बाइनरी नहीं है, जैसे कि किसी साझा लाइब्रेरी को डीबग करते समय, तो आपको कुछ अतिरिक्त कदम उठाने होंगे। वर्तमान में, d2d एक बार में केवल 1 डीकंपाइलर कनेक्टेड का समर्थन करता है, जिसका अर्थ है कि यदि आपके पास वर्तमान में कोई डीकंपाइलर कनेक्टेड है जो लाइब्रेरी नहीं है, तो आपको इसे डिस्कनेक्ट करना होगा।
अपनी साझा लाइब्रेरी के लिए d2d सर्वर चला रहे डीकंपाइलर के सामान्य सेटअप का पालन करने के बाद, आपको इस लाइब्रेरी के लिए आधार पता और इसके अंत का पता मैन्युअल रूप से सेट करना होगा:
decompiler connect ida --base-addr-start 0x00007ffff7452000 --base-addr-end 0x00007ffff766d000
आपकी लाइब्रेरी मेमोरी में किस आधार पते पर लोड हुई है, यह जानने के लिए, यह अनुशंसा की जाती है कि आप मेमोरी स्पेस में लाइब्रेरी के नाम को देखने के लिए GEF से vmmap कमांड जैसी किसी चीज़ का उपयोग करें। इस मैन्युअल रूप से सेट किए गए पते के साथ कनेक्ट करने के बाद, प्रतीक सामान्य d2d की तरह काम करेंगे। डीकंपाइलेशन केवल तभी स्क्रीन पर मुद्रित होगा जब आप इस पता स्थान की सीमा में हों।