2009-04-16 10 views
11

मैं संकलक जादू से अच्छी तरह से परिचित नहीं हूं। मशीन कोड में मानव-पठनीय कोड (या वास्तव में पठनीय असेंबली निर्देश) को बदलने का कार्य, मेरे लिए, रॉकेट विज्ञान जादूगर के साथ संयुक्त है।मैन्युअल रूप से .exe मशीन कोड को पढ़ने/लिखने के लिए कैसे?

मैं इस प्रश्न के विषय को Win32 execables (.exe) पर सीमित कर दूंगा। जब मैं इन फ़ाइलों को एक विशेष दर्शक में खोलता हूं, तो मैं विभिन्न स्थानों पर बिखरे हुए स्ट्रिंग्स (आमतौर पर 16 बी प्रति चरित्र) पा सकता हूं, लेकिन बाकी सिर्फ कचरा है। मुझे लगता है कि अपठनीय हिस्सा (बहुमत) मशीन कोड है (या शायद संसाधन, जैसे छवियों आदि ...)।

क्या मशीन कोड पढ़ने का कोई सीधा तरीका है? Exe को फ़ाइल स्ट्रीम के रूप में खोलना और बाइट द्वारा बाइट को पढ़ना, इन व्यक्तिगत बाइट्स को असेंबली में कैसे बदल सकता है? क्या इन निर्देश बाइट और विधानसभा निर्देश के बीच एक सीधा मैपिंग है?

.exe कैसे लिखा गया है? प्रति निर्देश चार बाइट्स? अधिक? कम? मैंने देखा है कि कुछ एप्लिकेशन निष्पादन योग्य फ़ाइलों को इस तरह बना सकते हैं: उदाहरण के लिए, एसीडी में देखें कि आप छवियों की एक श्रृंखला को स्लाइड शो में निर्यात कर सकते हैं। लेकिन यह अनिवार्य रूप से एक एसडब्ल्यूएफ स्लाइड शो होना जरूरी नहीं है, एसीडी देखें EXEcutable प्रस्तुतियों के उत्पादन में भी सक्षम है। यह कैसे किया जाता है?

मैं कैसे समझ सकता हूं कि EXE फ़ाइल के अंदर क्या चल रहा है?

+1

एसीडीएसआई चाल एक प्रीकंपिल्ड प्रोग्राम का उपयोग करेगी, और इसके संसाधनों को संपादित करेगी। Http://www.silurian.com/win32/peformat.htm देखें और प्रक्रिया एक्सप्लोरर के साथ खेलें (http://live.sysinternals.com/procexp.exe) – Mark

+0

धन्यवाद, यह अच्छा लगता है। और प्रक्रिया एक्सप्लोरर भयानक। कुछ महीने पहले इसका उपयोग शुरू किया, और यह सिर्फ अद्भुत है। हर बार जब मैं इसे चलाता हूं, मैं सोचने में मदद नहीं कर सकता कि वे कैसे करते हैं ??? ??? –

+0

बस यहां देरी हुई टिप्पणी; अंत में आप इसके साथ कैसे आगे बढ़ने का प्रबंधन करते थे? क्या आप बहुत दूर जाने का प्रबंधन करते थे? – dreamlax

उत्तर

15

OllyDbg एक शानदार उपकरण है जो एक EXE को पठनीय निर्देशों में विभाजित करता है और आपको निर्देशों को एक-एक करके निष्पादित करने की अनुमति देता है। यह आपको यह भी बताता है कि कौन सी एपीआई प्रोग्राम का उपयोग करती है और यदि संभव हो, तो यह तर्क जो प्रदान करता है (जब तक तर्क स्टैक पर पाए जाते हैं)।

आम तौर पर, सीपीयू निर्देश परिवर्तनीय लंबाई के होते हैं, कुछ एक बाइट होते हैं, अन्य दो होते हैं, कुछ तीन, कुछ चार आदि। यह ज्यादातर उस प्रकार के डेटा पर निर्भर करता है जो निर्देश की अपेक्षा करता है। कुछ निर्देश सामान्यीकृत होते हैं, जैसे कि "mov" जो सीपीयू को सीपीयू रजिस्टर से डेटा को स्मृति में किसी स्थान पर ले जाने के लिए कहता है, या इसके विपरीत। हकीकत में, कई अलग-अलग "mov" निर्देश हैं, जो 8-बिट, 16-बिट, 32-बिट डेटा को संभालने के लिए हैं, जो विभिन्न रजिस्टरों से डेटा ले जाने के लिए हैं।

आप डॉ पॉल कार्टर के PC Assembly Language Tutorial को चुन सकते हैं जो एक मुफ्त प्रवेश स्तर की पुस्तक है जो असेंबली के बारे में बात करती है और इंटेल 386 सीपीयू कैसे काम करती है। यह अधिकांश आधुनिक उपभोक्ता इंटेल CPUs तक भी लागू होता है।

EXE प्रारूप विंडोज के लिए विशिष्ट है। एंट्री पॉइंट (यानी पहला निष्पादन योग्य निर्देश) आमतौर पर EXE फ़ाइल के भीतर एक ही स्थान पर पाया जाता है। सभी को एक बार में समझा जाना मुश्किल है, लेकिन मैंने जो संसाधन प्रदान किए हैं, उन्हें कम से कम अपनी जिज्ञासा का इलाज करने में मदद करनी चाहिए! :)

+1

यह शक्तिशाली अच्छा जवाब है। तुम मेरी जिज्ञासा के बारे में सही हो। ऐसा नहीं है कि मुझे निष्पादन योग्यों को अलग करने की ज़रूरत है, मैं बहुत दिलचस्पी लेता हूं, और एक्जिक्यूटिव के साथ खिलौना करना चाहता हूं। जब मैं अपने वर्तमान क्षितिज से परे कुछ समझता हूं तो उस वाह को महसूस करें :) –

+1

कुछ लोग ओएलडीडीबीजी को आईडीए प्रो पसंद करते हैं: http://www.hex-rays.com/idapro/ –

4

आप कमांड लाइन से डीबग का उपयोग कर सकते हैं, लेकिन यह मुश्किल है।

C:\WINDOWS>debug taskman.exe 
-u 
0D69:0000 0E   PUSH CS 
0D69:0001 1F   POP  DS 
0D69:0002 BA0E00  MOV  DX,000E 
0D69:0005 B409   MOV  AH,09 
0D69:0007 CD21   INT  21 
0D69:0009 B8014C  MOV  AX,4C01 
0D69:000C CD21   INT  21 
0D69:000E 54   PUSH SP 
0D69:000F 68   DB  68 
0D69:0010 69   DB  69 
0D69:0011 7320   JNB  0033 
0D69:0013 7072   JO  0087 
0D69:0015 6F   DB  6F 
0D69:0016 67   DB  67 
0D69:0017 7261   JB  007A 
0D69:0019 6D   DB  6D 
0D69:001A 206361  AND  [BP+DI+61],AH 
0D69:001D 6E   DB  6E 
0D69:001E 6E   DB  6E 
0D69:001F 6F   DB  6F 
+0

आज कुछ नया सीखा। मुझे उम्मीद है कि मैं जल्द ही अपना ओएस नहीं तोड़ूंगा। एक बार हुआ जब मैं रजिस्ट्री प्रविष्टियों tweaking के बारे में उत्साहित हो गया ... कभी मेरे डेस्कटॉप कभी नहीं देखा। –

+0

आप नया कोड भी लिख सकते हैं और इसे वापस फाइल में सहेज सकते हैं। केवल एक पागल आदमी [या हैकर] डीबग –

+0

का उपयोग करेगा जो मुझे अभी भी डीबग का उपयोग करने वाले कुछ लोगों के बीच गिनें। एफवाईआई: माइक्रोसॉफ्ट के डीईबीयूजी केवल 16-बिट असली मोड को अलग करता है। यदि आप 32-बिट डीपीएमआई सक्षम डीबग चाहते हैं, तो जैफथ के संस्करण को आजमाएं: http://www.japheth.de/debxxf.html –

6

आपको एक डिस्सेबलर की आवश्यकता है जो मशीन कोड को असेंबली भाषा में बदल देगा। यह Wikipedia link प्रक्रिया का वर्णन करता है और मुक्त डिस्सेबलरों के लिंक प्रदान करता है। बेशक, जैसा कि आप कहते हैं कि आप असेंबली भाषा नहीं समझते हैं, यह बहुत जानकारीपूर्ण नहीं हो सकता है - आप यहां क्या करने की कोशिश कर रहे हैं?

+0

विंडबग से लिंक नहीं है http://www.microsoft.com/whdc/devtools/ डीबगिंग/installx86.mspx – Mark

1

MSDN

पर Win32 exe format

मैं Windows सी स्रोत कोड का एक सा लेने का सुझाव देते हैं और निर्माण और दृश्य स्टूडियो में यह डिबगिंग शुरू कर दूं। Disassembly दृश्य पर स्विच करें और आदेशों पर कदम।आप देख सकते हैं कि सी कोड को कोड कोड में कैसे संकलित किया गया है - और इसे चरण-दर-चरण चलाएं।

5

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

अनुभाग का प्रारूप इसमें क्या है इस पर निर्भर करता है। कोड अनुभाग निष्पादन योग्य लक्ष्य आर्किटेक्चर के अनुसार मशीन कोड रखता है। माइक्रोसॉफ्ट पीई द्विआधारी के लिए सबसे आम मामलों में यह इंटेल x86 या AMD-64 (ईएम 64 टी के समान) है। मशीन कोड का प्रारूप सीआईएससी है और 8086 और इससे पहले की उत्पत्ति करता है। सीआईएससी का महत्वपूर्ण पहलू यह है कि इसका निर्देश आकार स्थिर नहीं है, आपको इसे कुछ मूल्यवान प्राप्त करने के लिए सही स्थान पर पढ़ना शुरू करना होगा। इंटेल x86/x64 निर्देश सेट पर अच्छे मैनुअल प्रकाशित करता है।

आप सीधे मशीन कोड देखने के लिए एक डिस्सेबलर का उपयोग कर सकते हैं। मैनुअल के साथ संयोजन में आप ज्यादातर समय स्रोत कोड अनुमान लगा सकते हैं।

और फिर एमएसआईएल EXE है: माइक्रोस्कोफ्ट इंटरमीडिएट भाषा रखने वाले .NET निष्पादन योग्य, इसमें मशीन विशिष्ट कोड नहीं है, लेकिन .NET CIL कोड है। इसके लिए विनिर्देश ईसीएमए पर ऑनलाइन उपलब्ध हैं।

इन्हें परावर्तक जैसे टूल के साथ देखा जा सकता है।

5

EXE फ़ाइल की सामग्री Portable Executable में वर्णित है। इसमें फ़ाइल को लोड करने के तरीके पर ओएस को कोड, डेटा और निर्देश शामिल हैं।

मशीन कोड और असेंबली के बीच 1: 1 मानचित्रण है। एक डिस्सेबलर प्रोग्राम रिवर्स ऑपरेशन करेगा।

i386 पर प्रति निर्देश बाइट्स की एक निश्चित संख्या नहीं है। कुछ एक बाइट हैं, कुछ बहुत लंबे हैं।

2

यदि ऐसा लगता है कि यह आपके जैसा विदेशी है, तो मुझे नहीं लगता कि एक डीबगर या डिस्सेबलर मदद करने जा रहा है - आपको पहले असेंबलर प्रोग्रामिंग सीखना होगा; प्रोसेसर के आर्किटेक्चर का अध्ययन करें (इंटेल से डाउनलोड करने योग्य दस्तावेज के बहुत सारे)। और तब से अधिकांश मशीन कोड कंपाइलर्स द्वारा उत्पन्न होते हैं, आपको समझने की आवश्यकता होगी कि कंपाइलर्स कोड कैसे उत्पन्न करते हैं - बहुत से छोटे प्रोग्राम लिखने का सबसे आसान तरीका और फिर उन्हें देखने के लिए उन्हें अलग करें कि आपका सी/सी ++ क्या बदल गया है।

पुस्तकों के एक जोड़े में मदद करेंगे कि आप समझते हैं: -

1

बस इस प्रश्न से संबंधित है, किसी को अब भी सीडी 21 तरह बातें पढ़ा है?

मुझे एक शो में सैंड्रा बुलॉक याद आया, वास्तव में हेक्स संख्याओं का एक स्क्रीनफुल पढ़ना और यह पता लगाना कि कार्यक्रम क्या करता है। मैट्रिक्स कोड पढ़ने के वर्तमान संस्करण की तरह सॉर्ट करें।

यदि आप सीडी 21 जैसी चीजें पढ़ते हैं, तो आप विभिन्न विभिन्न संयोजनों को कैसे याद करते हैं?

+0

उसी तरह प्रोग्रामर जो अंग्रेजी नहीं समझते अंग्रेजी वाक्यविन्यास के साथ भाषाओं में कोड सीखना सीखें। मुझे लगता है कि जो भी डॉस में कम स्तर पर कोड किया गया है, उसे सीडी 21 याद होगा। –

1

आपकी जिज्ञासा और समझ का स्तर बिल्कुल ठीक है जहां मैं एक बिंदु पर था। मैं अत्यधिकCode: The Hidden Language of Computer Hardware and Software की अनुशंसा करता हूं।यह उन सभी प्रश्नों का उत्तर नहीं देगा जो आप यहां पूछते हैं लेकिन यह कंप्यूटर के कुछ काले रंग के जादू पहलुओं पर प्रकाश डालेगा। यह एक मोटी किताब है लेकिन अत्यधिक पठनीय है।

1

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

(मुझे नहीं पता कि वास्तव में एसीडी देखें क्या है लेकिन नमक का एक बड़ा अनाज के साथ मैं जानते हैं कि कुछ कार्यक्रम इस तरह से उत्पन्न कर रहे हैं करना ।)

+0

एसीडी देखें और बड़े फोटो संपादन सॉफ्टवेयर द्वारा देखा गया है।http://www.acdsee.com/ –

2

एक विचार प्राप्त करने के लिए, कुछ रोचक कोड पर एक ब्रेकपाइंट सेट, और फिर सीपीयू विंडो पर जाएं।

यदि आप अधिक रुचि रखते हैं, तो -al पैरामीटर का उपयोग करके फ्री पास्कल के साथ छोटे टुकड़े संकलित करना आसान है।

एफपीसी -ए पैरामीटर का उपयोग करके असेंबलर प्रारूपों (टीएएसएम, एमएएसएम, जीएएस) की एक भीड़ में उत्पन्न असेंबलर को आउटपुट करने की अनुमति देता है, और आप आसानी से क्रॉसरेफर के लिए टिप्पणियों (और अधिक) में मूल पास्कल कोड इंटरलेव किया जा सकता है।

क्योंकि यह कंपाइलर असेंबलर उत्पन्न होता है, क्योंकि असेंबलर के विपरीत असेंबलर के विपरीत, यह अधिक प्रतीकात्मक और अनुसरण करना आसान है।

+0

+1, मैं डेल्फी का उपयोग 'आकस्मिक आधार' पर कर रहा हूं और मुझे सीपीयू, एफपीयू, आदि द्वारा चिंतित किया गया है ... विंडोज़ जहां कोई एक निर्देश से दूसरे में कदम उठा सकता है और देख सकता है क्या चल रहा है। मैं सोच रहा था कि इन निर्देशों को तब EXE फ़ाइल में कैसे बनाया जाता है। और कैसे EXE फ़ाइलें उत्पन्न की जा सकती हैं (एसीडी देखें उदाहरण देखें)। मुझे विशेष रूप से बीसीएस द्वारा पेश किए गए विचार पसंद हैं :) –

+0

http://www.stack.nl/~marcov/compiler.pdf क्रैनशॉ के ट्यूटोरियल को याद करने के लिए लगभग असंभव का एक पीडीएफ संस्करण है। दुर्भाग्यवश एक अलग CPU (m68k) के लिए, लेकिन यह एक कंपाइलर के मूलभूत सिद्धांतों को काफी अच्छी तरह से दिखाता है। –

1

निम्न स्तर की असेंबली के साथ परिचितता (और मेरा मतलब है निम्न स्तर की असेंबली, "मैक्रोज़" और वह बैल नहीं) शायद एक जरूरी है। यदि आप वास्तव में कच्चे मशीन कोड को सीधे पढ़ना चाहते हैं, तो आमतौर पर आप इसके लिए एक हेक्स संपादक का उपयोग करेंगे। यह समझने के लिए कि निर्देश क्या करते हैं, हालांकि, अधिकांश लोग उचित असेंबली निर्देशों में परिवर्तित करने के लिए एक डिस्सेबलर का उपयोग करेंगे। यदि आप अल्पसंख्यक हैं जो मशीन भाषा को समझना चाहते हैं, तो मुझे लगता है कि आप Intel® 64 and IA-32 Architectures Software Developer's Manuals चाहते हैं। वॉल्यूम 2 ​​ विशेष रूप से निर्देश सेट को शामिल करता है, जो मशीन कोड को पढ़ने और कैसे असेंबली से संबंधित है, इस बारे में आपकी क्वेरी से संबंधित है।

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