2013-09-03 4 views
12

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

उत्तर

10

कई मामलों में यह कोड संकलित करने के लिए उपयोग किए गए कंपाइलर की पहचान करने के लिए संभव है, और उस से मूल भाषा।

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

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

हालांकि, रनटाइम लाइब्रेरी कोड का उपयोग किए बिना भी, इस्तेमाल किए गए कंपाइलर की पहचान करना संभव हो सकता है।कई कंपाइलर विभिन्न परिचालनों का प्रतिनिधित्व करने के लिए बहुत अलग मुहावरे का उपयोग करते हैं। उदाहरण के लिए, मैं was able to guess कि डुक्वा वायरस के लिए उपयोग किया गया कंपाइलर विजुअल सी ++ था, जो बाद में confirmed था।

5

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

कई मामलों में, आप मूल भाषा के बारे में कुछ बता सकते हैं बशर्ते बाइनरी को छीन नहीं दिया गया है (प्रतीकों का)। उदाहरण के लिए, आप आमतौर पर सी ++ में द्विआधारी में प्रतीकों को देखकर (objdump का उपयोग करके, यह नहीं पता कि विंडोज पर समतुल्य क्या हो सकता है): सी ++ प्रतीकों में उलझन में हैं एक विशेष तरीका यह 100% गारंटी नहीं है, लेकिन एक उच्च संभावना है।

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

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

+0

बेशक मुझे नंगे स्रोत कोड की उम्मीद नहीं है :) लेकिन कार्यक्रम बहुत विकसित हुए हैं और वे असेंबली कोड को अधिक उपयोगकर्ता अनुकूल तरीके से दिखा सकते हैं ताकि सरल कार्यक्रमों को उलटना आसान हो। धन्यवाद वैसे भी – Kuzgun

+0

आप विंडोज पर भी 'ओब्जेडम्प' का उपयोग मिंगडब्ल्यू या सिगविन के माध्यम से कर सकते हैं। वे 'binutils' पैकेज में स्थापित हैं। – adam

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