मेरे पास कुछ निर्दोष / शुरुआती प्रश्न हैं:
- रिवर्स इंजीनियरिंग किसके लिए अच्छा है?
- एक प्रोग्रामर के रूप में, क्या मुझे रिवर्स इंजीनियरिंग की कला सीखनी चाहिए?
- एक प्रोग्रामर को क्या लाभ है जो इसके साथ अनुभवी है?
मेरे पास कुछ निर्दोष / शुरुआती प्रश्न हैं:
जवाबों:
रिवर्स इंजीनियरिंग क्या अच्छा है?
रिवर्स इंजीनियरिंग मुख्य रूप से क्रैकिंग और हैकिंग के लिए अच्छा है (सीरियल नंबर सुरक्षा या पासवर्ड संकेतों को हटा दें), लेकिन वायरस या चमत्कार को समझने के लिए भी जो अन्य सॉफ्टवेअर प्रदर्शन कर सकते हैं। कभी-कभी कार्यक्रमों में बग ढूंढने के लिए यह एक उपयोगी कौशल है जो आपको स्रोत नहीं मिला है और उन्हें पैच करने के लिए।
एक प्रोग्रामर के रूप में, क्या मुझे रिवर्स इंजीनियरिंग की कला सीखनी चाहिए?
हां, कोडांतरक सीखने और एक सभ्य डिबगर का उपयोग करने का प्रयास करें। यह आपको निचले स्तरों पर चीजों को समझने से बेहतर डेवलपर बना देगा, जो धातु के करीब हैं।
एक प्रोग्रामर को क्या लाभ होगा जो रिवर्स इंजीनियरिंग के साथ अच्छी तरह से अनुभव करता है?
आप एक अच्छे हैकर / क्रैकर होंगे। आप अन्य एंटी वायरस उत्पादकों के लिए काम कर सकते हैं। एक व्यक्तिगत उदाहरण के रूप में: मैंने एक बार एक सॉफ्टवेयर को उल्टा करके एक त्रुटि को ट्रैक करने के लिए एक सॉफ्टवेयर तैयार किया था, जो एक ओरेकल कनेक्शन स्थापित करते समय हुआ। कोई और समस्या का समाधान नहीं कर सकता था, इसलिए मुझे कुछ प्रसिद्धि मिली।
इसके अलावा, मैं भी @ johannes टिप्पणी का हवाला देना चाहूंगा , क्योंकि वह बिल्कुल सही है:
मैं इसे "खराब" क्रैकिंग तक सीमित नहीं करूंगा। Disassembling यह पता लगाने के लिए उपयोगी हो सकता है कि संकलक पागल हो गया (आमतौर पर यह आपका कोड है, हालांकि), अधिक sysadmin दृष्टिकोण से यह देखना दिलचस्प हो सकता है कि कोई एप्लिकेशन विफल नहीं होता है
मुझे फाल्कन का जवाब पसंद है , लेकिन मैं यह जोड़ना चाहूंगा कि कुछ पुराने उबाऊ व्यवसाय अनुप्रयोग दुनिया में रिवर्स इंजीनियरिंग आपको कुछ बुरा मुसीबतों से बाहर निकाल सकती है।
काम पर हम इसे बहुत कुछ करते हैं जब एक 3 पार्टी सिस्टम के साथ डेटा एकीकरण किया जाता है जिसमें कोई नया रखरखाव नहीं होता है, इसलिए हम यह जान सकते हैं कि इसे कहां तोड़ना चाहिए या नहीं तोड़ना चाहिए।
यदि हम सोर्स कोड को शामिल नहीं करते हैं, तो हम 3 पार्टी घटकों पर कोड गुणवत्ता (निश्चित रूप से कुछ बाधाओं के साथ) की जांच करने के लिए रिवर्स इंजीनियर का उपयोग करते हैं।
मेरा वास्तविक बिंदु यह है: रिवर्स इंजीनियरिंग किसी एकल तकनीक या भाषा से बंधा नहीं है, लेकिन यह एक ऐसी प्रक्रिया है, जहां आप एक "अश्वेत व्यक्ति" के आंतरिक ज्ञान को सीखते हैं । यदि आपके पास कोड है जो आप पर निर्भर करते हैं, लेकिन आप विश्वास नहीं कर सकते हैं या नहीं, तो आपको हुड के नीचे एक तिरछी नज़र डालनी चाहिए और देखना चाहिए कि वह कोड क्या कर रहा है।
रिवर्स इंजीनियरिंग का ड्रॉप-डेड बोरिंग पक्ष भी है। ऐसा तब होता है जब आप जिस कंपनी में होते हैं उसका कोड या प्रोग्राम होता है जो अभी भी उपयोग किया जा रहा है, लेकिन कोई भी इसके बारे में कुछ भी जानने का दावा नहीं करता है। तो आप इसके माध्यम से जाते हैं, इसे दस्तावेज करते हैं, परीक्षण लिखते हैं, और वह सभी इंजीनियरिंग सामान जो एक परियोजना शुरू होने से पहले किया जाना चाहिए। आप ऐसा सॉफ़्टवेयर के एक टुकड़े के लिए करते हैं जो पहले से ही लिखा गया है, इसलिए "रिवर्स इंजीनियरिंग"।
आपके पास कोड होने पर यह बहुत आसान है, लेकिन यह अभी भी तकनीकी रूप से रिवर्स इंजीनियरिंग है। जब वे विरासत परियोजनाओं के बारे में बात कर रहे हैं तो यह उन शर्तों में से एक है जो व्यापार बैठकों में बहुत अधिक पॉप अप करता है।
बस रिवर्स इंजीनियरिंग के व्यापार मूल्य पर विस्तार करने के लिए - हमारे द्वारा सामना किए जाने वाले नए ग्राहकों में से आधे से अधिक के पास एक मौजूदा सिस्टम / ऐप है (हमेशा उत्पादन में नहीं, आपके दिमाग में), लेकिन जहां पिछले सॉफ़्टवेयर डेवलपमेंट वेंडर के साथ संबंधों ने स्किड्स मारा।
लगभग 30% मामलों में ग्राहक को अपनी प्रणाली के लिए स्रोत बिल्कुल नहीं मिला है, और कई मामलों में, वास्तविक व्यापार प्रक्रिया, नियमों और ज्ञान का अधिकांश भाग कोड में बंद है।
और कुछ मामलों में जहां पिछले विक्रेताओं ने सादा दुर्भावनापूर्ण व्यवहार किया है, ग्राहक को अनिश्चित काल के लिए दूर करने के लिए बायनेरिज़ को बाधित किया, कोड आदि को समयबद्ध किया।
इसलिए आपके सवाल का जवाब देने के लिए, उल्टा इंजीनियरिंग अक्सर हताश (और जलाए गए) ग्राहकों के साथ नई व्यस्तताओं के लिए एक शुरुआती बिंदु होता है, और मौजूदा कोड से भूले हुए ज्ञान को निकालने के लिए यह एक 'व्यावसायिक महत्वपूर्ण' सफलता कारक हो सकता है।
मेरा तर्क है कि रिवर्स-इंजीनियरिंग के लिए कौशल-सेट और डीबगिंग के लिए कौशल-सेट बिल्कुल समान हैं - यदि आप एक शानदार डिबगर हैं, तो आप एक शानदार रिवर्स-इंजीनियर और इसके विपरीत भी हैं।
कभी-कभी इसे समझने के लिए कुछ भागों / सॉफ़्टवेयर को इंटर-ऑपरेट करने के लिए उपयोग किया जाता है। कुछ अजीब इंटरफेस, कार्यान्वयन में कीड़े आदि।
लेकिन जो मैं समझता हूं, यह बहुत फिसलन वाला विषय है, और इसलिए, सॉफ्टवेयर विकास के पहले से ही जटिल कानूनों को रिवर्स-इंजीनियरिंग के साथ चरम पर ले जाया जाता है।
खैर, रिवर्स इंजीनियरिंग के साथ आप अपने काम को कम से कम करने के लिए कोड का उपयोग करने में सक्षम हो सकते हैं। उदाहरण के लिए, Symfony2 में, आप सामान्य MySQL से बने डेटाबेस को बदल सकते हैं और इसे सिद्धांत प्रारूप में परिवर्तित कर सकते हैं और यह एक रिवर्स इंजीनियर प्रक्रिया है जो सिम्फनी में संभव हो गई है। .... और रिवर्स इंजीनियरिंग के साथ, आप कोड को '2D' में कहने में सक्षम हैं
मैं अपने अनुभव से सिर्फ एक वास्तविक दुनिया का उदाहरण दे रहा हूं।
एक बार हमारी कंपनी ने दूसरी कंपनी से प्रोजेक्ट लिया। परियोजना में लगभग आधे साल हमें एहसास हुआ कि एक उपप्रोजेक्ट बिना कोड का था। जब हमने पूर्व कंपनी को कोड देने के लिए कहा, तो उन्होंने विनम्रता से जवाब दिया कि वे सबप्रोजेक्ट के लिए कोड नहीं ढूंढ सकते। हमें कोड की आवश्यकता थी क्योंकि हम उस सबप्रोजेक्ट में कुछ बदलना चाहते थे।
मुझे इंजीनियर को उपप्रोजेक्ट को उल्टा करना पड़ा ।
पहले मैंने असेंबली को विघटित किया (हाँ, यह एक .NET प्रोजेक्ट है)। विघटित असेंबली का परिणाम स्थानीय चर और जटिल नियंत्रण संरचना के नामों के बिना ब्लेंड और भ्रामक कोड है। इसका कारण यह है कि संकलन महत्वपूर्ण जानकारी को त्याग देता है जिसे विघटित नहीं किया जा सकता है।
फिर मैंने यह पता लगाने की कोशिश की कि उस कोड को कहाँ बदलना है। ऐसा करने के लिए मैंने समान व्यवहार करने के लिए कोड को सुव्यवस्थित किया लेकिन अधिक संक्षिप्त तरीके से। मैंने इसके व्यवहार से चर के नामों का भी अनुमान लगाया। मैंने कई बार कोड के माध्यम से कदम रखा जब तक कि मुझे पता नहीं चल गया कि यह क्या कर रहा है।
मैंने सब कुछ रिवर्स इंजीनियर नहीं किया था, केवल उस हिस्से को बदलना था जो हमें बदलना था। यह बहुत बुरा नहीं था, वीबी कोड की लगभग 200 लाइनें। इसमें लगभग पांच दिन का समय लगा।