किसी प्रोग्राम के आउटपुट को कैसे संशोधित करें जिसके लिए आपके पास सोर्स कोड नहीं है


89

हमारी कंपनी में हमारे पास एक छोटा प्रोग्राम (.exe 500Kb आकार) है जो गणितीय गणना करता है और अंत में यह एक्सेल स्प्रेडशीट पर परिणाम निकालता है जिसका उपयोग हम अपने वर्कफ़्लो को जारी रखने के लिए करते हैं।

मैं एक्सेल स्प्रेडशीट पर कॉलम, रिक्ति प्रारूप को जोड़ना और VBA तर्क आदि को जोड़ना चाहता हूं, लेकिन चूंकि यह पैरामीटर उस प्रोग्राम में कॉन्फ़िगर करने योग्य नहीं हैं, इसलिए मुझे लगता है कि इसे संशोधित करने का एकमात्र तरीका है / इंजीनियर को उलटना।

कोई भी नहीं जानता है कि यह किस भाषा में प्रोग्राम किया गया था, केवल एक चीज जो हम जानते हैं:

  1. 20+ साल पहले विकसित
  2. डेवलपर 10 साल पहले सेवानिवृत्त हुआ था
  3. जीयूआई अनुप्रयोग
  4. स्टैंडअलोन चलाता है
  5. आकार 500Kb

इस तरह की समस्याओं से निपटने के लिए मेरे पास क्या विकल्प हैं? क्या रिवर्स इंजीनियरिंग एकमात्र विकल्प है, या बेहतर दृष्टिकोण है?


149
क्या आप जानते हैं कि वह क्या गणना करता है? यदि ऐसा है, तो एक नया ऐप लिखें, दोनों के माध्यम से कुछ परीक्षण डेटा को धक्का दें ताकि यह पता चले कि नया एक ही काम करता है, फिर पुराने को फेंक दें। फिर आप जो बदलाव करना चाहते हैं, करें।
डेविड अरनो

13
@DavidArno की टिप्पणी अच्छा जवाब देगी। रिवर्स इंजीनियरिंग संभव है, लेकिन ऐप को फिर से निर्दिष्ट करना और फिर से लिखना एक बहुत सस्ता / आसान / तेज होगा।
डैन पिचेलमैन

44
इसे संशोधित करने का दूसरा तरीका यह होगा कि आप जो भी मूल कार्यक्रम का उत्पादन करें और जो चाहें उसे फ़िल्टर करें।
ब्लरफ्ल

9
@ एलेक यदि आप एक हेक्स संपादक के साथ .exe खोलते हैं, तो आपको इस बारे में सुराग मिल सकता है कि यह क्या लिखा गया था। उदाहरण के लिए, संकलक का नाम एम्बेड किया जा सकता है। वहाँ से आप संभावित विघटित विकल्पों के बारे में अधिक जान पाएंगे।
ग्रैंडमास्टरबी

26
वैकल्पिक रूप से, आप उस सज्जन को ढूंढने का प्रयास कर सकते हैं जिन्होंने आवेदन लिखा है और देखें कि क्या वह एक या दो दिन (शायद हर दिन कुछ घंटे) एक सलाहकार के रूप में आने के इच्छुक हैं। यदि वह एक सेवानिवृत्त डेवलपर है, तो एक उदारवादी मौका है कि वह $ 100-150 / hr की दर से थोड़े पैसे खर्च करने की सराहना कर सकता है जबकि वास्तव में समय के साथ थोड़े समय के लिए काम करने के क्षण का आनंद ले रहा है।
RLH

जवाबों:


234

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

मैं कॉलम, रिक्ति प्रारूप को संशोधित करना और एक्सेल स्प्रेडशीट पर VBA तर्क आदि को जोड़ना चाहता हूं

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


9
नए प्रोग्राम में पुराने EXE को क्यों कॉल करना है? क्यों न केवल नए प्रोग्राम को स्वतंत्र किया जाए और फिर एक स्क्रिप्ट लिखी जाए जो दोनों को कॉल करे और आउटपुट और इनपुट का समन्वय करे? मेरा अनुभव बताता है कि कमांड लाइन लैंग्वेज जैसे बैश, पॉवरशेल या कमांड प्रॉम्प्ट हैंडल प्रोसेस कोऑर्डिनेट करने की अनुमति देना आम तौर पर इसे अनिवार्य भाषा में खुद को कोड करने की कोशिश से आसान है। अन्यथा, +1।
jpmc26

8
@ jpmc26: यह सही है जब तक आपको बैश के बेतुके उद्धरण नियमों से निपटना नहीं पड़ता। हाँ, वे (ज्यादातर) POSIX- अनुरूप हैं। नहीं, वे किसी भी तरह का ईश्वरीय अर्थ नहीं रखते हैं। $ FOO को शब्द विभाजन नहीं करना चाहिए, उदाहरण के लिए।
केविन

16
@ jpmc26: मुझे subprocess.run()व्यक्तिगत रूप से कॉल करने में कोई परेशानी नहीं हुई है ।
केविन

3
@ jpmc26: क्या पाइपिंग? यह शुद्ध रसोई की किताब है; यदि आप स्टडआउट चाहते हैं, तो आप जादू को PIPEलगातार पास करते हैं । अन्यथा, आप नहीं करते हैं और यह खारिज हो जाता है। समझने के लिए क्या है?
केविन

3
... मुझे यह जोड़ना चाहिए कि मैंने अतीत में वीबीए के साथ एक्सेल का उपयोग कमांड लाइन यूटिलिटीज के लिए एक सीमा के रूप में किया था, जो कि एक से अधिक बार सफलतापूर्वक स्थापित हुआ था। संरचना हमेशा समान होती है: "गरीब आदमी की यूआई" के रूप में मापदंडों को दर्ज करने के लिए एक शीट, उस शीट पर एक "प्रारंभ" बटन। VBA कोड में, Shellएक्सेल VBA में किसी को इस तरह कॉल की आवश्यकता होती है : stackoverflow.com/questions/8902022/… , कोई cmd उपयोगिता से stdout / stderr को अलग-अलग फ़ाइलों में पाइप कर सकता है और फिर आउटपुट स्वरूपण लागू कर सकता है।
डॉक ब्राउन

114

डॉक्टर ब्राउन और टेलस्टीन द्वारा पहले से ही दिए गए जवाबों के अलावा, मैं एक वैकल्पिक दृष्टिकोण (इस धारणा को कम करना) के तहत सुझाव देना चाहूंगा।

यदि आपको पता नहीं है कि यह गणना करता है और गणना (कुछ हद तक) मिशन-क्रिटिकल है: .exeफ़ाइल में मूल तर्क को किसी भी तरह से कम करना आवश्यक है। यदि आवश्यक हो तो आईडीए जैसे डिकंपाइलर / डिस्सेम्बलर का उपयोग करके इसे डिकोड करें । यदि आवश्यक हो तो एक सलाहकार (या सलाहकारों का एक बैच) को किराए पर लें।

निश्चित रूप से, उनके समाधान का उपयोग करने के लिए इसके चारों ओर काम करें, लेकिन इसे होने न दें।

मेरे सुझाव का कारण इस प्रकार है: आपने स्वीकार किया है कि गणना बहुत जटिल है (आपके द्वारा बोले गए इंजीनियर के अनुसार)। यह मिशन-क्रिटिकल भी है। इसलिए यदि किसी तरह .exeआपके द्वारा प्लेटफ़ॉर्म में परिवर्तन के कारण मूल काम करना बंद हो जाता है (शायद 16-बिट समर्थन समाप्त हो जाता है?), तो आपने अभी-अभी एक मिशन-क्रिटिकल नॉलेज खो दिया है ।

अब, मैं हारने के बारे में चिंतित नहीं हूं .exe, लेकिन ज्ञान को खोने के बारे में यह सांकेतिक है। उस ज्ञान को पुनः प्राप्त करना होगा।

पहले की तरह: यदि वह ज्ञान पहले से ही उपलब्ध है, तो इसे एक प्रारूप में लिखना सुनिश्चित करें कि यह जल्द ही खो जाने वाला नहीं है। अन्यथा, इसे पुनर्प्राप्त करें और इसे लिखें।


14
आधुनिक डिकंपाइलर्स वास्तव में कोड का उत्पादन करते हैं जो आमतौर पर काफी सुपाठ्य होता है, खासकर अगर मूल स्रोत सादे सी या कोडांतरक में था, और उच्च स्तर की भाषा नहीं।
फेयरफॉक्स

4
बहुत अच्छी बात है। इसके अलावा: बस इसे पैच अप करें ताकि यह फिर से काम करे जब तक कि अगले फिक्स को लागू करने की आवश्यकता न हो।
डैनियल जर्स

33
@phyrfox 20 साल पुराना ... डेवलपर 10 साल पहले सेवानिवृत्त हो गया ... केवल आउटपुट एक एक्सेल स्प्रेडशीट है ... मैं इसे VB6 एप्लिकेशन होने पर पैसा लगाता हूं।
जे ...

10
@micaho: या कंपनी अभी भी मौजूद है और परिणाम और छिपी मान्यताओं को सत्यापित करने के लिए जानने वाले व्यक्ति को सिर्फ एक ट्रक द्वारा मारा गया है। बेशक, यह एक व्यावसायिक जोखिम है इसलिए अंततः हितधारकों को फैसला करना चाहिए। मैं सिर्फ इस बात पर जोर देना चाहता था कि "रैपर" अब काम करेगा, लेकिन केवल तकनीकी ऋण में जोड़ता है।
सोज़र्ड जॉब पोस्टमॉस

22
@ जे ...: अगर यह वीबी 6 है तो मूल पोस्टर भाग्य में है। आप बहुत आसानी से एक VB6 संकलन से स्रोत कोड को पुनर्प्राप्त कर सकते हैं।
एरिक लिपर्ट

74

यदि संभव हो, तो मूल प्रोग्रामर से पूछें।

कुछ हफ़्ते पहले मुझे एक फर्म द्वारा संपर्क किया गया था जो मैंने 10 साल पहले काम करने के लिए इस्तेमाल किया था और एक ही सवाल के साथ एक mdb फ़ाइल को 90 के दशक के मध्य में विकसित किया गया था।


52
यह वास्तविक कम लटका हुआ फल है। हर कोई (खुद सहित) रिवर्स इंजीनियरिंग जैसे कठिन प्रोग्रामिंग कौशल के उपयोग को रोमीकृत करता है, कार्यक्रम की कार्यक्षमता को फिर से लागू करता है या डेटा प्रोसेसिंग में परतें जोड़ता है। वास्तव में, शुरू करने के लिए सबसे अच्छी जगह एक अनुकूल ईमेल है जो स्रोत कोड या किसी अन्य आदर्श समाधान के स्थान के साथ एक घंटे में वापस आ सकती है।
user1717828

2
जब एक 10 साल की उम्र के साथ घर पर आवेदन मुझे भी मैं एक disassembler आग लेकिन काम के घंटे के दौरान लक्ष्य अलग है ^ ^
पाओलो

2
क्या आपको इसके बारे में कुछ याद था? :)
.ngel

2
बेशक! दुर्भाग्य से कंपनी 3 अधिग्रहण से गुज़रती है और बहुत सारी जानकारी खो जाती है और बैकअप का कुछ हिस्सा खोए हुए बैग में होता है ... विकास उनकी मशीनों पर साइट पर था इसलिए मेरे पास स्रोत की कोई प्रतिलिपि नहीं है और यह बात है।
पाओलो

1
एम्बेडेड स्ट्रिंग के लिए EXE को स्कैन करें जिसमें एक डेवलपर का नाम या कुछ शामिल हो सकता है। यह पूर्ण डिस-असेंबली की तुलना में आसान है!
JDługosz

55

इस तरह की समस्याओं से निपटने के लिए मेरे पास क्या विकल्प हैं?

यदि आप सब करना चाहते हैं तो आउटपुट को संशोधित करें, फिर रचना का उपयोग क्यों न करें?

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


2
@ एलेक चाहे जावा एक उपयुक्त भाषा है या नहीं मुख्य रूप से उस डेटा की मात्रा पर निर्भर करता है जिसे आपको संभालने की आवश्यकता है / गणना की मात्रा जो आपको करने की आवश्यकता है। यदि दोनों कम हैं, तो जावा ठीक है। यदि कोई महत्वपूर्ण है, तो आप C या C ++ को बेहतर तरीके से छोड़ देते हैं। लेकिन जब से आप केवल डेटा की मात्रा का उपयोग करने लगते हैं जो किसी भी तरह से एक्सेल स्प्रेडशीट में फिट बैठता है, मुझे नहीं लगता कि जावा को एक बुरा विकल्प बनाने के लिए पर्याप्त डेटा शामिल है (एक्सेल संभवतः आपके ऐप से पहले विस्फोट हो जाएगा)।
cmaster

18
@cmaster यह विचार करता है कि जावा भारी गणना के लिए निषेधात्मक है, एक पुरानी धारणा है। सबसे खराब बेंचमार्क यहाँ सूचीबद्ध भी 4x नहीं है (सबसे 2x या उससे कम कर रहे हैं) और अगर एक एकल अंक अदिश अपने तोड़ने बिंदु है, सुरक्षा में बचत (जो डेवलपर डॉलर करने के लिए सीधे अनुवाद कर) की संभावना प्रदर्शन हिट ऑफसेट करने के लिए जा रहा से अधिक है ।
corsiKa

8
@ कोई भी भाषा काम करेगी। VBA एक अच्छा विकल्प लगता है क्योंकि यह पहले से ही Excel के साथ इतनी अच्छी तरह से एकीकृत है।
कैप्टन मैन

4
@corsiKa यह पूरी तरह से आपके आवेदन के पैमाने पर निर्भर करता है। यदि एक एकल रन कई दसियों हज़ारों सीपीयू-घंटों का उपभोग करता है, तो 2 या 4 का एक कारक निषेधात्मक हो जाता है: यह सीधे परिणामों की मात्रा में अनुवाद करता है जिससे आप एक मल्टी-मिलियन मशीन से बाहर निकल सकते हैं। इसके अलावा, ऐसे अनुप्रयोग आम तौर पर लॉकस्टेप में काम करते हैं, इसलिए कचरा संग्रह उनके प्रदर्शन के लिए शुद्ध जहर है, छोटे व्यवधान प्रक्रियाओं की संख्या से गुणा करेंगे। मैं आपको बताता हूं, ऐसे अनुप्रयोग मौजूद हैं, और वे निश्चित रूप से जावा में नहीं लिखे गए हैं। उनका उपयोग केवल औसत इंटरनेट व्यवसाय द्वारा नहीं किया जाता है।
cmaster

7
@cmaster हम कुछ सरल गणनाओं के बारे में बात कर रहे हैं, न कि वास्तविक वैश्विक रोशनी के साथ एक पूर्ण विकसित एएए गेम इंजन, शारीरिक रूप से आधारित प्रतिपादन, एनिमेटेड विरल ओक्सिलर्स, सार्वभौमिक भौतिकी क्षेत्र सिमुलेशन और जैसे। कोई अपराध नहीं है, लेकिन किसी भी तर्क को सम्मिलित करना आरई प्रदर्शन यहां खराब है। उपयोग में आसानी # 1 होनी चाहिए, और कोई है जो कुछ वर्षों से C ++ का उपयोग कर रहा है, यह अंतिम भाषा है जिसे मैं इस मामले में सुझाऊंगा।

3

ऐसी कंपनियां हैं जो इस तरह की समस्या के विशेषज्ञ हैं। वे मूल कोड को उच्च स्तर की भाषा में विघटित करने के लिए मालिकाना कोड का उपयोग करते हैं, फिर इसे उपयोगी बनाने के लिए मानव विशेषज्ञता को लागू करते हैं (जैसे चर को उपयुक्त रूप देना)।

कुछ साल पहले मेरे नियोक्ता ने लिनक्स सर्वर पर कुछ मूल एस / 390 मेनफ्रेम कोड को स्थानांतरित करने के लिए इसका उपयोग किया था। हमने उन्हें बाइनरी दी, उन्होंने हमें सी में सोर्स कोड दिया।

क्या यह आपके मामले में आवश्यक है, आप पर निर्भर है। यदि आप केवल आउटपुट के प्रारूप के बारे में परवाह करते हैं, तो आप उत्पादन के बाद बस आउटपुट की मालिश कर सकते हैं। हालांकि, जैसा कि दूसरों ने बताया है, बाइनरी ब्लॉब में छिपे हुए व्यावसायिक तर्क एक निरंतर जोखिम हो सकते हैं।


3

कार्यक्रम के चारों ओर एक साधारण आवरण लिखें, इसके आउटपुट को कैप्चर करें। इसके लिए कई भाषाओं ( जावा , C ++ , पायथन , .NET , उदाहरण के लिए) को करना जटिल नहीं है । आउटपुट को पार्स करें और वांछित रूप में एक और उत्पन्न करें। उपयोगकर्ता आपके नए प्रोग्राम को कॉल करेगा। पुराना निष्पादन योग्य इसके बगल में रहेगा, या यहां तक ​​कि स्वचालित रूप से संसाधन से निकाला जा सकता है, इसे लागू करने से पहले।

निश्चित रूप से यह समाधान पर्याप्त रूप से केवल तभी काम करता है जब आउटपुट को पार्स करना इतना आसान हो।

यह एक GUI अनुप्रयोग है, एक अवरुद्ध समस्या नहीं है। आप इसे लॉन्च कर सकते हैं, आउटपुट उत्पन्न कर सकते हैं, और फिर जब यह GUI समाप्त हो जाता है, तो स्वचालित रूप से इसे पोस्ट कर सकते हैं।


3
यह डॉक ब्राउन के शीर्ष-मतदान जवाब से कैसे अलग है?
लाफ

मैं डॉक्टर के उत्तर को बुरी तरह लिखे जाने की धारणा से असहमत हूं। यह स्पष्ट और संक्षिप्त है।
मस्त

1
यदि आप इस उत्तर के पाठ पर गौर करेंगे, तो आप देखेंगे कि एकमात्र सूचनात्मक भाग अंतिम वाक्य का अंत करता है "जो आपकी विरासत को" exe "कहता है, आउटपुट लेता है और इसे आगे संसाधित करता है।"
h22

2
एक नीचा नहीं है, और यह नहीं देख रहा है कि यह -3 क्यों मिला ... मेटा फिर से है? लेकिन अलग-अलग, मैं किसी और के जवाब को "मस्तिष्क-पतला करने वाले ब्लाह के बहुत से" के लिए सलाह देने के खिलाफ सलाह दूंगा, जब (ए) यह एक व्यक्तिपरक निर्णय है और (बी) मेरे व्यक्तिपरक राय में, तुम्हारा बस इतना ही है!
अंडरस्कोर_ड

इसे फिर से लिखा जा सकता है क्योंकि "इसमें बिना सूचना के सामान्य बातचीत शामिल है जो पाठकों के समय को बर्बाद करने वाले विषय से विचलित करता है", अगर वह तरीका अधिक उपयोगी लगता है। अंतिम वाक्य के दूसरे भाग पर सही दृष्टिकोण के लिए एक संकेत प्रदान करता है। इसका अपमान करने का कोई इरादा नहीं था। टिप्पणी हटा दी गई।
h22

1

कुछ परीक्षण लिखें जो पुराने कोड पर अधिक से अधिक मामलों में व्यायाम करते हैं। कोने के मामलों का पता लगाएं, गलत इनपुट का परीक्षण करें, और सही इनपुट का परीक्षण करें।

विभिन्न मामलों को देखते हुए सही आउटपुट को पिन करें, और फिर उसी परीक्षणों को पूरा करने वाले कार्यान्वयन को लिखने का प्रयास करें

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

यदि सॉफ्टवेयर 20 साल पहले एक आदमी द्वारा विकसित किया गया था, तो यह संभवतः ऐसा कुछ नहीं है जो बहुत अधिक आधुनिक शक्ति लेता है। GUI प्रोग्राम जिसने 20 साल पहले मशीन को बढ़ाया था, वह आधुनिक मशीन पर मुश्किल से पंजीकृत होगा, इसलिए आप शायद कुछ ऐसा देख रहे हैं जो पुन: पेश करने के लिए अपेक्षाकृत सरल है।


0

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

ईजीएयर ने कहा, 20 साल पहले बनाया गया रिवर्स इंजीनियर एक असली चुनौती है।


12
निर्वासन की डेटिंग वास्तव में मायने नहीं रखना चाहिए
ofngel

1
वास्तव में, ऑप्टिमाइज़र हर साल होशियार होने के साथ, रिवर्स-इंजीनियरिंग केवल कठिन हो जाता है।
MSalters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.