लिनक्स निष्पादन योग्य फ़ाइलों में प्रयुक्त कोड रूपांतरण का प्रकार


13

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

यहाँ मेरे पास थोड़ा सा कोड है:

ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N�    4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)

इसका मतलब क्या है?


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

संभव / आंशिक डुप्लिकेट? stackoverflow.com/questions/193896/whats-a-good-c-decompiler
arielf

जवाबों:


29

यह बाइनरी है। स्रोत कोड संकलित किया गया है। आप इसे एक संपादक में देख सकते हैं (एक हेक्स संपादक जैसे blessअधिक परिष्कृत परिवर्तन के लिए बना सकते हैं) लेकिन आपको वास्तव में यह जानना होगा कि आप क्या कर रहे हैं। यह केवल स्ट्रिंग परिवर्तन करने के लिए अच्छा है।

अधिक कट्टर कुछ भी के लिए, आप असेंबली कोड में बाइनरी को रिवर्स इंजीनियर करना शुरू कर सकते हैं । इसे प्रायः सबसे निचले स्तर की मानव-पार्सबल कंप्यूटर भाषा के रूप में माना जाता है।

objdump -d helloworld | less

लेकिन इसमें बहुत सारे कंपाइलर बकवास भी शामिल होंगे। उदाहरण के लिए, यदि आप G ++ के साथ सबसे सरलhelloworld.cpp संकलन करते हैं और फिर objdumpयह, आप 226 लाइनों (208 छीन) के साथ समाप्त होते हैं। आप विधानसभा की सिर्फ 15 लाइनों में एक "हैलो वर्ल्ड" लिख सकते हैं , इसे संकलित कर सकते हैं और objdumpयह है कि अभी भी 166 लाइनों (छीन) में खिलता है।

यदि आप असेंबली के साथ काफी अच्छे हैं, तो आपको यह समझने के लिए पर्याप्त पहुंच मिल सकती है कि क्या हो रहा है, और यहां तक ​​कि आप इसे बदल भी सकते हैं ... लेकिन अपने मूल प्रश्नों का उत्तर देने के लिए:

आप संकलित कोड को मूल स्रोत कोड में वापस नहीं बदल सकते ।

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

आपको समस्या के पैमाने का अंदाजा लगाने के लिए, रिवर्स इंजीनियरिंग सॉफ्टवेयर के पूरे विचार का अपना स्टैक एक्सचेंज साइट है


क्या आप मुझे बता सकते हैं कि मैं इसे कैसे रिवर्स कर सकता हूं और कोड
कोज़ की

7
मेरा हालिया संपादन देखें। मूल स्रोत पर वापस नहीं जाना है। बहुत अधिक सीखने और बहुत समय के साथ, आप असंतुष्ट असेंबली कोड के आधार पर स्रोत को फिर से लिखने में सक्षम हो सकते हैं , लेकिन ज्यादातर मामलों में, यह सस्ता होगा (जब तक कि आपका समय बेकार नहीं है) और खरोंच के लिए इसे फिर से लिखना आसान है।
ओली

1
कोड की अधिकतम राशि वापस पाने का तरीका सबसे हालिया बैकअप को पुनर्स्थापित करना है। यही कारण है कि यह भी, संयोग से, है केवल मज़बूती से वापस कुछ मूल स्रोत कोड जैसी पाने के लिए जिस तरह से।
बजे एक सीवी

1
अंतिम पैराग्राफ से असहमत नहीं, बस एक साइड नोट: कुछ डिकंपाइलर सटीक कोड संरचना को बहाल करने में एक महान काम करते हैं (बिल्कुल अलग से जैसा कि आपने टिप्पणी, स्वरूपण, प्रतीकों के नाम ...) कहा है। यदि आपने प्रोग्राम को पहले स्थान पर नहीं लिखा है, तो पुनर्प्राप्त स्रोत कोड अभी भी अनजाने में हो सकता है, हालाँकि मुझे लगता है कि यह कम से कम (आंशिक रूप से) खोए हुए स्रोत कोड / अज्ञात स्रोत कोड (इसके कम से कम भागों के साथ) पुनर्प्राप्त करने का एक बढ़िया विकल्प है। वास्तव में समझदार, विशिष्ट कोड पर निर्भर करता है और उस पर भी आप भाग्यशाली हैं)
कोस

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

7

मेरे पास टिप्पणी के लिए पर्याप्त प्रतिष्ठा अंक नहीं हैं, इसलिए यह एक उत्तर है:

नहीं, इसे "बैक" में बदलना संभव नहीं है। आपने upx packer का उल्लेख किया है, क्या आपने कभी upx का मैनुअल पढ़ा है?

यदि आपने स्रोत खो दिया है, या किसी और के कोड तक पहुंच नहीं है, तो यहां कोई फर्क नहीं पड़ता, बस संभव नहीं है।

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


3

यह शायद एक द्विआधारी फ़ाइल (एक ईएलएफ फ़ाइल) है जैसा कि यहाँ अच्छी तरह से वर्णित है:

https://en.wikipedia.org/wiki/Executable_and_Linkable_Format

यदि आपने इसे एक सामान्य पाठ संपादक के साथ बदल दिया है और अपने परिवर्तनों को सहेज लिया है, तो यह कोई अच्छा विचार नहीं था और आपने इसे नष्ट कर दिया होगा।


3

जैसा कि ओली ने अपने जवाब में पहले ही बताया था, आप एक निष्पादन योग्य मूल स्रोत कोड प्राप्त नहीं कर सकते।

एक स्रोत कोड के संकलन के दौरान (इसकी विशिष्ट व्यापक स्वीकृति के रूप में संकलन का इरादा है, इसलिए पूरी प्रक्रिया के रूप में कि एक स्रोत कोड को एक निष्पादन योग्य में "रूपांतरित"), बहुत सारे informations खो जाते हैं।

C प्रीप्रोसेसर, एक के लिए, निम्नलिखित कार्य करेगा (अन्य बातों के अलावा):

  • प्रीप्रोसेसर निर्देश ( #कथन) को इंटरप्रेट करें, निष्पादित करें और हटाएं
  • टिप्पणियाँ निकालें
  • अनावश्यक व्हाट्सएप को हटा दें

दूसरी ओर जो स्रोत कोड के संकलन के दौरान नहीं खोया है, वह तकनीकी रूप से एक समान रूप से समकक्ष स्रोत कोड के लिए उल्टा है।

यह है क्योंकि:

  • बाइनरी निर्देशों में विधानसभा निर्देशों के साथ 1: 1 भ्रष्टता है; असेंबली सोर्स कोड का असेम्बलिंग, कॉरस्पांडों की तालिका के आधार पर बाइनरी निर्देशों के लिए विधानसभा निर्देशों का मात्र रूपांतरण है; एक एकल बाइनरी निर्देश हमेशा एक ही विधानसभा निर्देश के लिए पहचाने जाने योग्य और पुन: प्रयोज्य है ;
  • विधानसभा निर्देशों में C निर्देशों के साथ 1: 1 भ्रष्टता नहीं है; सी स्रोत कोड का संकलन आमतौर पर विधानसभा निर्देशों के लिए केवल निर्देश का एक मात्र रूपांतरण नहीं है , जो कि भ्रष्टता की तालिका के आधार पर विधानसभा के निर्देशों का है, वास्तव में यह अक्सर विपरीत होता है; आमतौर पर एक सी निर्देश कई (अक्सर कंपाइलर के आधार पर अलग) विधानसभा निर्देशों में परिवर्तित हो जाता है; हालांकि, कई विधानसभा निर्देशों के पैटर्न आमतौर पर एकल सी निर्देश के लिए पहचाने जाने योग्य और पुन: प्रयोज्य होते हैं ;

ऐसे उपकरण हैं जिन्हें डिकंपाइलर कहा जाता है, जिसका उद्देश्य एक निष्पादन योग्य को कार्यात्मक रूप से समकक्ष स्रोत कोड पर वापस लाने का प्रयास करना है; हालाँकि परिणाम आम तौर पर बहुत मूल स्रोत कोड से कुछ दूर है (और आमतौर पर भी असंगत);

इस कार्यक्रम पर विचार करें:

#include <stdio.h>

#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered

/*

This comment and the comment above won't be recovered

*/

int main(int argc, char* argv[]) {
    printf(MESSAGE);
    return 0;
}

एक निष्पादन योग्य में इसे संकलित करके इसे फिर से एक स्रोत कोड में बदलना, यह कमोबेश वही है जो आपको आमतौर पर वापस मिलता है (इस विशिष्ट मामले में मैंने gcc/ बूमरैंग का उपयोग किया है ):

// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
    printf("Literal strings will be recovered");
    return 0;
}

जैसा कि भविष्यवाणी की गई है:

  • प्रीप्रोसेसर निर्देश गायब हैं
  • टिप्पणियां गायब हैं (एक तरफ से // address: 0x80483fb, जिसे डिकम्पॉइलर द्वारा जोड़ा गया है)
  • अनावश्यक व्हाट्सएप गायब है (नई कथानक और सारणी से अलग, जिसे डिकंपाइलर द्वारा जोड़ा गया है)

यह भी एक बहुत अच्छा परिणाम है; कोड में इनलाइन विधानसभा निर्देश प्राप्त करना दुर्लभ नहीं है:

asm("assembly_instruction");
__asm__("assembly_instruction");

लब्बोलुआब यह है (जैसा कि पहले से ही अन्य उत्तरों में बताया गया है): आप एक निष्पादन योग्य * के मूल स्रोत को प्राप्त नहीं कर सकते

* हालांकि, निष्पादन योग्य और आपके भाग्य के आधार पर, आप एक डिकम्पॉइलर का उपयोग करके कुछ प्राप्त करने में सक्षम हो सकते हैं।


2

यदि आप संकलित कार्यक्रमों के बारे में बात कर रहे हैं, तो आमतौर पर निष्पादन योग्य बाइनरी होते हैं। आप अधिक जानकारी का उपयोग करके पा सकते हैं file path/to/executable। आप उदाहरण के लिए हेक्साडेसिमल में द्विआधारी निष्पादन योग्य प्रदर्शित कर सकते हैं hexdump -C path/to/executable | less(जो भी अच्छा होगा वह आप करेंगे)। यदि आप "इसे अपने मूल रूप में वापस बदलना चाहते हैं" तो आपको इस पोस्ट को देखने के लिए एक उपयुक्त डिकम्पॉइलर का उपयोग करना होगा , उदाहरण के लिए , हालांकि यह आपको काफी अपठनीय कोड देगा जो मूल से संकलित नहीं था। यदि यह संकलित बाइनरी नहीं है तो यह किसी प्रकार की निष्पादन योग्य स्क्रिप्ट होगी, जिसे किसी भी पाठ संपादक में आसानी से पढ़ा जा सकता है। आपने हमें यहां जो दिखाया, वह शायद एक संकलित निष्पादन योग्य है। ईएलएफ का अर्थ है "निष्पादन योग्य और लिंकिंग प्रारूप" जो लिनक्स / यूनिक्स सिस्टम पर एक सामान्य द्विआधारी प्रारूप है। वहाँ'strings path/to/executable, अगर यह वही है जो आपको चाहिए।


मैंने इसे ऊपर के पैकर के साथ इंजीनियर को उलटने की कोशिश की, लेकिन आपके द्वारा सुझाए गए पोस्ट के साथ काम नहीं किया। तो कृपया मुझे बताएं कि क्या कोई और तरीका है।
लालफीताशाही red

बहुत खेद है, लेकिन मैं आपको @ ओली की उत्कृष्ट पोस्ट में जो लिखा गया है, उससे अधिक कुछ नहीं बता सकता।
हिंज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.