2012-04-19 22 views
5

आज मैंने आईडीए प्रो का उपयोग करके दृश्य सी ++ में लिखे गए एक साधारण "हैलो वर्ल्ड" प्रोग्राम को डीकंपाइल करने का निर्णय लिया।रिवर्स इंजीनियरिंग सी ++

मेरे पिछले ज्ञान के साथ मुझे यकीन था कि मुझे निष्पादन योग्य प्रविष्टि बिंदु पर printf को तत्काल कॉल नहीं मिलेगा, और मैं सही था। मुझे बहुत सारे कोड मिले जो मेरे द्वारा नहीं लिखे गए थे और संकलन प्रक्रिया के दौरान संकलक द्वारा जोड़ा गया था।

मुझे संकलन प्रक्रिया के दौरान कौन सा कोड जोड़ा गया है, इसकी बेहतर समझ चाहिए। यह क्या करता है? क्या "मुख्य" जल्दी से खोजने के लिए कोई "चाल" है और डिस्सेप्लर द्वारा उत्पन्न सभी अनावश्यक कोड को छोड़ दें?

सबसे अच्छा मैं मिल सकता है इस पोस्ट में था

: http://www.codeproject.com/Articles/4210/C-Reverse-Disassembly, कह एक निष्पादन के निष्पादन के आदेश दृश्य ग का उपयोग कर संकलित ++ इस प्रकार है:

  1. CrtlStartUp

  2. मुख्य

  3. CrtlCleanUp

क्या मैं अधिक विस्तृत उत्तर प्राप्त कर सकता हूं?

+5

बहुत संकलक और मंच विशिष्ट। मुझे संदेह है कि आपको वह सटीक उत्तर मिलेगा जो आप चाहते हैं। – Matt

+1

मैं [इस पोस्ट] की सिफारिश करता हूं (http://stackoverflow.com/a/9952374/176769) किसी भी रिवर्स-इंजीनियर-गुरु-वानबे व्यक्ति के लिए रोडमैप के रूप में। – karlphillip

+1

मुझे रिवर्स इंजीनियरिंग में कोई अनुभव नहीं है, लेकिन क्या आप सापेक्ष पते प्राप्त करने के लिए मुख्य रूप से मुख्य शुरुआत में डीबगर ब्रेक पॉइंट सेट नहीं कर सकते? या, वैकल्पिक रूप से, निष्पादन योग्य के ऑब्जेक्ट डंप में मुख्य रूप से देखें? – bjhend

उत्तर

4

सी ++ मानक द्वारा आवश्यक विभिन्न चीजें हैं जिनकी आपको संभावना होगी।

सबसे महत्वपूर्ण बात यह है कि वहाँ कोड है कि मुख्य से पहले मुख्य अनुवाद इकाई में किसी भी स्टैटिक्स के निर्माण संभालती है कहा जाता है, और एक समारोह है कि मुख्य पत्तियों के बाद कि उनके विनाश हैंडल करने की जरूरत है। इसके अतिरिक्त, मानक को atexit फ़ंक्शन की आवश्यकता होती है जो आपको मुख्य रिटर्न के बाद कॉल करने के लिए अतिरिक्त फ़ंक्शंस पंजीकृत करने की अनुमति देती है।

तो कम से कम, स्टार्टअप कोड को उन कार्यों की डेटा संरचना बनाने में सक्षम होना चाहिए जिन्हें मुख्य से वापसी पर बुलाया जाएगा। यह एक गतिशील डेटा संरचना है क्योंकि इसे प्रोग्राम द्वारा रनटाइम में जोड़ा जाना आवश्यक है, और कॉल का क्रम पंजीकरण करने के विपरीत है (इसलिए आमतौर पर आप एक डेटा संरचना चाहते हैं जो उस स्थान पर आसानी से चलती है)।

लेकिन इसके अतिरिक्त, मानक की आवश्यकता है कि अन्य अनुवाद इकाइयों में स्थिरता उस अनुवाद इकाई में किसी भी फ़ंक्शन को निष्पादित करने से पहले बनाई गई हो। अक्सर, कंपाइलर्स बस लिंकर में सबकुछ व्यवस्थित करेंगे ताकि सभी को मुख्य से पहले बुलाया जा सके, लेकिन इसकी आवश्यकता नहीं है। वे कंपाइलर्स जो चीजों को अलग-अलग करते हैं, फिर उन्हें अन्य अनुवाद इकाई कोड में प्रारंभिक दिनचर्या के लिए थंक्स प्रदान करने की आवश्यकता होती है जिसे पहले फ़ंक्शन कॉल पर कॉल किया जाएगा। अगर आप किसी भी मानक पुस्तकालय का उपयोग

बस यह काफी काम का एक सा है। याद रखें, std :: अदालत एक स्थिर वस्तु (स्थिर जीवन, नहीं स्थिर संबंध - भ्रमित करने वाले अतिभारित शब्द चेतावनी) है। ताकि अपने कंसोल बाहर करने के लिए संचार का निर्माण है, जो जो कुछ भी कहा जाता है अपने मंच की जरूरत एपीआई होगा का मतलब है। मानक में ऐसी कई वस्तुएं हैं।

और फिर, आपके प्लेटफ़ॉर्म और/या कंपाइलर के लिए विशिष्ट सामग्री हो सकती है जो प्रक्रिया को कुछ उपयोगी तरीके से तैयार करती है, या पर्यावरण चरों को पार्स करती है, या "मानक" गतिशील/साझा पुस्तकालयों या समान सामान लोड करती है।

आमतौर पर, बाहर निकलने वाली सूची केवल उस सूची को चल रही है और किसी भी तरह से पर्यावरण के लिए मुख्य रूप से वापसी मूल्य प्रदान करती है, क्योंकि अधिकांश आधुनिक ओएस स्वयं के बाद साफ हो जाते हैं, लेकिन इसके अलावा सिस्टम विशिष्ट सामग्री भी हो सकती है।

2

आज के कंपाइलर्स बड़े निष्पादन योग्य बनाते हैं, भले ही आपको प्रवेश बिंदु मिले, भले ही आपको समझने के लिए कुछ समय लगेगा और आपको वास्तव में आवश्यक अनुभाग प्राप्त होगा।

हैलो वर्ल्ड ऐप के साथ आपके मामले में आप आईडीए का उपयोग फ़ंक्शन सूची संवाद में प्रवेश बिंदु ढूंढ सकते हैं (मुझे सटीक नाम याद नहीं है)। लेकिन फिर से मैं इस दृष्टिकोण की सिफारिश नहीं करता, जब तक कि ऐप बहुत छोटा न हो।

दृष्टिकोण मैं मैं "ऊपर से नीचे दृष्टिकोण के लिए" (ग)

मैं किसी भी उपकरण से जुड़े बिना आवेदन की वर्तमान व्यवहार का विश्लेषण से शुरू होगा फोन का उपयोग कर रहा हूँ। यह बहुत महत्वपूर्ण कदम है जो बहुत समय बचाएगा क्योंकि आपको पता चलेगा कि आप क्या खोज रहे हैं और जब ऐसा होता है। फिर स्ट्रिंग्स जैसे "कमजोर बिंदु" निर्धारित करें, निरंतर मान जिन्हें आप स्थिर विश्लेषण टूल (आईडीए) के साथ पा सकते हैं।

अगला चरण (आईडीए में तार मॉड्यूल) तो क्या कार्यों वे इस्तेमाल

(आप नए आईडीए संस्करणों में ग्राफिक्स पदानुक्रम दृश्य का उपयोग कर सकते हैं) से उन्हें संदर्भ खोजने के अनुप्रयोग एकत्रित न और उन "कमजोर अंक" देखने के लिए है

यदि आप अभी भी यह काम नहीं कर रहे हैं कि यह कैसे काम कर रहा है या यह कोड कई स्थानों से बुलाया जाता है तो आप नहीं जानते कि आपको किसकी आवश्यकता है। आप रनटाइम विश्लेषण से शुरू कर सकते हैं और डीबगर (सॉफ्टिस? :)) का उपयोग ollydbg की तरह कर सकते हैं। यह आपको ऐसी चीजें दिखाएगा जो स्थिर विश्लेषण के साथ दिखाई नहीं दे रहे हैं जैसे वर्चुअल फ़ंक्शन/फ़ंक्शन पॉइंटर्स उदाहरण के लिए: EAX पर कॉल करें।

फिर आप केवल तब तक कदम संसाधित करते हैं जब तक आपको अपनी आवश्यकता न हो।

संबंधित मुद्दे