2010-10-29 11 views
8

मुझे एक ऐसा वातावरण मिला है जिसमें यूनिक्स पर "संकलित" पर्ल स्क्रिप्ट है। क्या यह डी-संकलन करना संभव है, रिवर्स इंजीनियर (जो भी शब्द है), और संकलित ऑब्जेक्ट कोड से स्रोत कोड प्राप्त करें?मैं एक पर्ल प्रोग्राम को रिवर्स-इंजीनियर कैसे कर सकता हूं जिसे perlcc के साथ संकलित किया गया है?

संभव नहीं हो सकता है, लेकिन सोचा कि मैं मानने के बजाए पूछूंगा।

धन्यवाद, -केविन।

+0

संदर्भ उद्देश्यों के लिए, हाँ, शब्द "रिवर्स इंजीनियर" है; आप कम-अमूर्त प्रतिनिधित्व (संकलित/मशीन कोड) से उच्च-पृथक्करण प्रतिनिधित्व (संरचित स्रोत कोड) पर जा रहे हैं। –

उत्तर

9

ओह मेरी!

तो और केवल यदि यह perlcc -B के माध्यम से निष्पादन योग्य बाइट कोड में संकलित किया गया है, तो आप सकता है तो यह uncompile उसी तरह बी :: Deparse करता है। आप उन सभी स्रोतों को वापस प्राप्त करेंगे जिन्हें इस तरह से अनुकूलित नहीं किया गया था। यह थोड़ा मजाकिया लग सकता है, लेकिन यह एक समकक्ष कार्यक्रम होगा।

हालांकि, अगर इसे पूरी तरह से सी कोड में संकलित किया गया था और वहां से असेंबलर और मशीन भाषा में संकलित किया गया था और उचित a.out फ़ाइल के लिए ld के माध्यम से चलाया गया है, तो आप ऐसा कुछ भी करने में सक्षम नहीं होंगे। यह /bin/cat को अलग करने की कोशिश करना होगा।

तो ठीक है, आप इसे अलग कर सकते हैं, लेकिन वहां कोई खुशी नहीं है। भले ही आप मूल, जेनरेट किए गए सी कोड को प्राप्त कर सकें - जो आप नहीं कर सकते - यह लगभग अनुपयोगी होगा।

मुझे लगता है कि आप तार (1) पर चल सकते हैं यह देखने के लिए कि कहीं भी उपयोगी कुछ भी स्थायी रूप से झूठ बोल रहा है, लेकिन मैं उस पर भरोसा नहीं करता।

क्षमा करें।

13

बाईटकोड बैकएंड tchrist पहले से ही शामिल है और केवल C बैकएंड बारे में बात कर बाहर छोड़कर, सभी perlcc है एक सी कार्यक्रम है, जो यह तो संकलित में अपने संकलित पर्ल कार्यक्रम के optree अनुवाद किया गया है। वह सी प्रोग्राम चलाएगा, फिर उस ऑप्ट्री को स्मृति में पुनर्निर्मित करेगा, और मूल रूप से इसे निष्पादित करेगा जैसे कि आमतौर पर पर्ल। इसका मुद्दा वास्तव में नियमित पर्ल कोड के संकलन समय को गति देने के लिए है।

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

इसके अलावा सी फ़ंक्शन Perl_eval_pv है, जिसका उपयोग आप सी स्पेस से पर्ल स्निपेट का मूल्यांकन करने के लिए कर सकते हैं।

$ echo 'print 42, "\\n"' > foo.pl 
$ perl foo.pl 
42 
$ perlcc foo.pl 
$ ./a.out 
42 
$ gdb a.out 
... 
(gdb) b perl_run 
Breakpoint 1 at 0x4570e5: file perl.c, line 2213. 
(gdb) r 
... 
Breakpoint 1, perl_run (my_perl=0xa11010) at perl.c:2213 
(gdb) p Perl_eval_pv (my_perl, "use B::Deparse; B::Deparse->compile->()", 1) 
print 42, "\n"; 
$1 = (SV *) 0xe47b10 
बेशक

सामान्य बी :: Deparse चेतावनियां लागू होते हैं, लेकिन यह निश्चित रूप से रिवर्स इंजीनियरिंग के लिए आसान हो जाएगा। असल में मूल स्रोत कोड का पुनर्निर्माण अधिकांश मामलों में संभव नहीं होगा, भले ही यह उपर्युक्त उदाहरण के लिए काम करता हो।

बीडी प्राप्त करने के लिए आपको सटीक जीडीबी जादू करना होगा :: आपको कुछ समझदार देने के लिए अव्यवस्था भी आपके पर्ल पर निर्भर करती है। मैं इथ्रेड के साथ एक पर्ल का उपयोग कर रहा हूं, और इसलिए बहुतायत। यही कारण है कि मैं my_perl चर के आसपास गुजर रहा हूँ। अन्य perls की आवश्यकता नहीं हो सकती है।इसके अलावा, अगर किसी ने perlcc द्वारा संकलित बाइनरी को तोड़ दिया, तो चीजें थोड़ा कठिन हो जाएंगी, लेकिन वही तकनीक अभी भी काम करेगी।

इसके अलावा आप किसी भी विकल्प को संकलित करने के लिए इसका उपयोग कर सकते हैं जिसे आप प्रोग्राम निष्पादन के दौरान किसी भी समय रोक सकते हैं। बी :: डिपर्स के संकलन उप पर एक नज़र डालें और के बजाय जो भी विकल्प आप डंप किया गया है, उसे B ऑब्जेक्ट के साथ प्रदान करने के अलावा कुछ ऐसा ही करें।

वही बात perlcc के उल्लिखित बाइटकोड बैकएंड पर लागू होती है। मैं CC नामक अनुकूलित सी बैकएंड के बारे में पूरी तरह से निश्चित नहीं हूं।

+0

मैं केवल बी और सीसी बैकएंड के बारे में सोच रहा था; मैं सी बैकएंड के बारे में भूल गया था। – tchrist

+0

असल में, सीसी बैकएंड पर एक संक्षिप्त नज़र डालने के बाद, यह सी बैकएंड जैसा ही लगता है। वैसे भी इसके साथ काम करने के लिए उपर्युक्त दृष्टिकोण के लिए यह काफी समान है। – rafl

0

7-ज़िप का उपयोग करें। Exe फ़ाइल पर राइट क्लिक करें और फिर 7zip> ओपन आर्काइव करें और फिर perl फ़ाइल को पकड़ें।

+2

यह केवल पैक किए गए कार्यक्रमों के लिए काम करता है, संकलित प्रोग्राम के लिए नहीं। –

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

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