संकलित होने के बाद हम बाइनरी फ़ाइल की सामग्री को क्यों नहीं समझ सकते हैं?


11

जहाँ तक मुझे पता है, हर कार्यक्रम में प्रोसेसर के निर्देशों का एक पैकेट होता है, जो प्रोसेसर के रजिस्टरों पर काम करने के लिए कुछ विशिष्ट डेटा चर (फ्लोट, इंट, चार ...) के साथ होता है ।

तो, पहली बात जो मैंने इसके बारे में सोचा था (एक लंबे समय से पहले) यह है कि यदि आप जानते हैं कि एक x86 %¨#$¨#के ढेर पॉइंटर रजिस्टर (सिर्फ उदाहरण) के पते के रूप में ASCII मूल्य (सिर्फ एक यादृच्छिक उदाहरण) की व्याख्या की जा सकती है प्रोसेसर। यदि यह सच है, तो हर बार जब आप द्विआधारी फ़ाइल की सामग्री को पढ़ते समय यह "अपठनीय" मान पाते हैं, तो आप व्याख्या कर सकते हैं कि कुछ डेटा चर को प्रबंधित करने के लिए स्टैक पॉइंटर रजिस्टर का उपयोग किया जा रहा है।

दुर्भाग्य से ऐसा नहीं होता है। नीचे, ping.exeविंडोज से प्रोग्राम की सामग्री का एक उदाहरण है जिसे इसके साथ खोला गया है notepad.exe:

Ping.exe को MS Notepad में देखा गया

यह एक बाइनरी फ़ाइल है और इसका डेटा हमारे लिए मनुष्यों के लिए समझ से बाहर है (यह मशीनों के लिए समझ में आता है।) यह किसी को भी कोई मतलब नहीं है, भले ही वे विधानसभा कोड (मशीन भाषा का निम्नतम स्तर) जानते हों ।

इसलिए, अगर मैंने सब कुछ सही ढंग से समझा है, तो क्या कोई समझा सकता है

  1. क्यों बाइनरी कोड असेंबली कोड में वापस नहीं आ सकते हैं, जहां तक ​​वे नीचे हैं, वही बात?
  2. यदि कोई असेंबली कोड को समझ सकता है, तो इस कोड के परिणामस्वरूप संकलित बाइनरी अब "पठनीय" क्यों नहीं है?

12
तुम कर सकते हो, तुम सिर्फ एक disassembler की जरूरत है ।
डेविड श्वार्ट्ज

तो मैं किसी भी। Exe फ़ाइल को मिटा सकता हूँ ??? मुझे बस पता था कि यह प्रबंधित कोड के साथ काम करता है ...
डायगो

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

5
संकलन या असेंबली बहुत सारे मानव-महत्वपूर्ण जानकारी जैसे चर नाम, शाखा लेबल, आदि को हटा देती है। डिस्सैम्प को निर्देश धारा मिलती है, लेकिन आपको अभी भी बहुत कुछ पता लगाना है।
mpez0

1
इसके अलावा कोड obfuscation disassembly में बाधा हो सकती है।
गणित

जवाबों:


13

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

आप किसी चीज़ के ओपोड को पसंद कर सकते हैं जैसे MOV AL,SPया फिर उसके बाद उसकी खोज करना। x86 में बहुत सारे निर्देश हैं जो स्टैक पॉइंटर पर काम करते हैं।

लेकिन कृपया, नोटपैड का उपयोग करना छोड़ दें और इसके बजाय एक हेक्स संपादक का उपयोग करें। मैं एचएक्सडी की सिफारिश करूंगा, हालांकि कई अन्य हैं।

और @ दाविद श्वार्ट्ज सही है। एक disassembler एक फ़ाइल के माध्यम से पुनरावृत्ति करेगा, और पठनीय पाठ में वापस opcodes का अनुवाद करेगा। आप जो करना चाहते हैं वह पूरी तरह से संभव है।

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


1
आईडीए अधिक आम पीई असंतुष्टों में से एक है। लिनक्स और मैक फाइलों के साथ भी काम करता है। संस्करण 5.0 अभी भी फ्रीवेयर के रूप में उपलब्ध है
स्कॉट चैंबरलेन

1
> यदि आप गलत पते पर शुरू करते हैं, तो गलत व्याख्या हो सकती है। यही कारण है कि %¨#$¨#आवश्यक रूप से स्टैक-पॉइंटर का संदर्भ नहीं होगा; यह सिर्फ दो अलग-अलग आज्ञाओं के बीच हो सकता है : _3p%¨#और $¨#b5F( _3p   %¨#$¨#   b5F)।
Synetech

12

इसलिए, अगर मैंने सब कुछ सही ढंग से समझ लिया है

काफी नहीं।

यह एक बाइनरी फाइल है और इसका डेटा हम इंसानों के लिए समझ से बाहर है

आमतौर पर एक बाइनरी फ़ाइल मानव और मशीन के लिए समझ से बाहर है, खासकर जब फ़ाइल का उद्देश्य अज्ञात है। ध्यान दें कि सभी बाइनरी फाइलें निष्पादन योग्य फाइलें नहीं हैं। बहुत सारी बाइनरी फाइलें डेटा फाइलें होती हैं जिनमें कोई मशीन निर्देश नहीं होता है। यही कारण है कि फ़ाइल एक्सटेंशन का उपयोग फ़ाइलों का नामकरण करते समय (कुछ ओएस में) किया जाता है। द। CP / M द्वारा निष्पादन योग्य फ़ाइल को निरूपित करने के लिए com एक्सटेंशन का उपयोग किया गया था। द। exe एक्सटेंशन को MS-DOS द्वारा एक और निष्पादन योग्य फ़ाइल स्वरूप को दर्शाने के लिए जोड़ा गया था। * निक्स एग्जीक्यूट एट्रिब्यूट का इस्तेमाल यह बताने के लिए करता है कि कौन सी फाइल एक्जिक्यूट की जा सकती है, हालांकि यह स्क्रिप्ट के साथ-साथ कोड भी हो सकता है।

जैसा कि पहले ही दूसरों द्वारा उल्लेख किया गया है, बाइनरी फाइलें, जिसमें संख्याएं होती हैं, को हेक्स डंप प्रोग्राम या हेक्स संपादक द्वारा देखा जाना चाहिए, न कि एक पाठ दर्शक द्वारा।

ping.exe प्रोग्राम की सामग्री का एक उदाहरण है

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

"प्रोग्राम फ़ाइल" जिसे आप शायद सोच रहे हैं उसे बाइनरी इमेज फाइल या प्रोग्राम मेमोरी का डंप कहा जाता है। ऐसी फ़ाइल में केवल मशीन कोड और डेटा होगा, जिसमें सभी पते संदर्भ ठीक से निष्पादन के लिए निर्धारित होंगे।

भले ही वे असेंबली कोड (मशीन भाषा का निम्नतम स्तर) जानते हों।

असेंबली भाषा मशीन भाषा के समान नहीं है । विशिष्ट (उच्च-स्तरीय भाषा के कंप्यूटरों को बाहर करने के लिए) सीपीयू मशीन कोड को इनपुट के रूप में स्वीकार करता है, एक बार में एक निर्देश। ऑपरेंड या तो रजिस्टर या न्यूमेरिक मेमोरी एड्रेस हैं। असेंबली लैंग्वेज एक उच्च-स्तरीय भाषा है जो निर्देश स्थानों और चर के लिए प्रतीकात्मक लेबल का उपयोग कर सकती है , साथ ही साथ न्यूमेरिक ऑप-कोड को mnemonics के साथ बदल सकती है। असेंबली लैंग्वेज प्रोग्राम को मशीन लैंग्वेज / कोड में बदलना होता है, क्योंकि इसे वास्तव में निष्पादित किया जा सकता है (आमतौर पर यूटिलर, लिंकर और लोडर नामक उपयोगिताओं द्वारा)।

रिवर्स ऑपरेशन, असहमति, कुछ फाइलों के साथ प्रतीकात्मक सूचनाओं की सफलता और नुकसान के लिए प्रोग्राम फाइलों पर किया जा सकता है। मेमोरी डंप या प्रोग्राम इमेज फ़ाइल का डिस्सैस्पेक्शन अधिक परीक्षण और त्रुटि है, क्योंकि कोड और डेटा स्थानों को मैन्युअल रूप से पहचानने की आवश्यकता है।

BTW ऐसे व्यक्ति हैं जो (संख्यात्मक) मशीन कोड पढ़ और कोड कर सकते हैं। बेशक यह एक 32-बिट CISC प्रोसेसर की तुलना में 8-बिट सीपीयू या माइक्रोकंट्रोलर पर एक दर्जन मेमोरी मोड के साथ बहुत आसान है।


3

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

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

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

आपको क्या लगता है कि एमुलेटर प्रोग्राम किए गए हैं? डेवलपर को वास्तविक हार्डवेयर को किसी तरह से पहचानने और व्यवहार करने के लिए काल्पनिक प्रणाली को प्रोग्राम करने में सक्षम होने के लिए opcodes को जानने की आवश्यकता होगी। दस्तावेज़ सीपीयू के कई आर्किटेक्चर की व्याख्या करते हैं, और यहां तक ​​कि जीपीयू ने उन्हें (हालांकि अधिक गुप्त)।

ध्यान देने वाली एक और बात यह है कि निम्नतम स्तर में, हालांकि सहसंबंधी, "बाइनरी डेटा" वास्तव में शून्य और लोगों का एक गुच्छा नहीं है, लेकिन उच्च और निम्न वोल्टेज विद्युत प्रवाह के माध्यम से विद्युत प्रवाह के रूप में प्रवर्धित / स्विच किया जाता है।

बाइनरी आमतौर पर इसके साथ 1: 1 है, इसलिए यह इसके लिए संख्या प्रणाली का उपयोग करने के लिए बहुत समझ में आता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.