जैसा कि ओली ने अपने जवाब में पहले ही बताया था, आप एक निष्पादन योग्य मूल स्रोत कोड प्राप्त नहीं कर सकते।
एक स्रोत कोड के संकलन के दौरान (इसकी विशिष्ट व्यापक स्वीकृति के रूप में संकलन का इरादा है, इसलिए पूरी प्रक्रिया के रूप में कि एक स्रोत कोड को एक निष्पादन योग्य में "रूपांतरित"), बहुत सारे 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");
लब्बोलुआब यह है (जैसा कि पहले से ही अन्य उत्तरों में बताया गया है): आप एक निष्पादन योग्य * के मूल स्रोत को प्राप्त नहीं कर सकते ।
* हालांकि, निष्पादन योग्य और आपके भाग्य के आधार पर, आप एक डिकम्पॉइलर का उपयोग करके कुछ प्राप्त करने में सक्षम हो सकते हैं।
strings
फ़िल्टर प्रोग्राम यह पहचानने में बहुत उपयोगी हो सकता है कि कोई विशेष बाइनरी प्रोग्राम क्या है या क्या करता है क्योंकि यह एक निर्दिष्ट लंबाई की तुलना में लंबे समय तक सभी एम्बेडेड टेक्स्ट स्ट्रिंग्स को प्रिंट करेगा बाइनरी फ़ाइल और एक कार्यक्रम में संदेशों को देखना कभी-कभी आपको बहुत कुछ बताता है कि यह क्या है और क्या करता है।