2009-09-04 18 views
18

मैं गुग हो गया और मुझे पूछताछ करने वाले प्रश्नोत्तरी प्रतिक्रिया की एक आश्चर्यजनक राशि मूल रूप से ऐसे प्रश्न पूछने के लिए पूछने पर हंस रही है।एएसएम से सी (रिवर्स इंजीनियर नहीं)

माइक्रोचिप कुछ स्रोत कोड मुफ्त में प्रदान करता है (मैं इसे यहां पोस्ट नहीं करना चाहता हूं, क्योंकि यह कोई नंबर नहीं है। मूल रूप से, Google AN937, पहले लिंक पर क्लिक करें और "स्रोत कोड" और उसके लिए एक लिंक है ज़िप फ़ाइल)। एएसएम में और जब मैं इसे देखता हूं तो मुझे क्रॉस-आइड जाना शुरू होता है। मैं इसे एक सी प्रकार की भाषा जैसा कुछ बदलना चाहता हूं ताकि मैं साथ चल सकूं। क्योंकि इस तरह के रूप में लाइनों:

GLOBAL _24_bit_sub 
movf BARGB2,w 
subwf AARGB2,f 

शायद बहुत सरल हैं, लेकिन वे मेरे लिए कुछ भी नहीं मतलब है।

सी अनुवादक के लिए कुछ स्वचालित एएसएम होना चाहिए, लेकिन मुझे लगता है कि लोग यह असंभव कह रहे हैं। स्पष्ट रूप से, यह असंभव होने के लिए असंभव है। दोनों भाषाओं में संरचना है और उस संरचना का निश्चित रूप से अनुवाद किया जा सकता है।

धन्यवाद।

+3

स्पष्ट रूप से, यह एक कारण दें कि यह क्यों संभव हो। – Gerhard

+4

यदि आप कोड को समझना चाहते हैं, तो इस असेंबली भाषा को सीखना एकमात्र तरीका है। स्वचालित अनुवाद आपको कुछ अपठनीय देगा। शायद स्रोत से भी ज्यादा अपठनीय। और decompiler (यदि मौजूद है) आपकी मदद नहीं कर सकता है, अगर यह कोड हाथ से लिखा गया है (पहले संकलित नहीं किया गया है)। लेकिन अगर आप कोड को चलाने/बंद करना चाहते हैं, तो मेरी पोस्ट देखें। – zxcat

+0

@ गेरहार्ड पहले से ही एक असेंबली-भाषा-टू-सी संकलक है जिसे बुमेरांग कहा जाता है। कुछ असेंबली भाषा कार्यक्रम स्वचालित रूप से सी को संकुचित कर सकते हैं, जैसे [यह एक यहां] (http://boomerang.sourceforge.net/cando.php?hidemenu)। –

उत्तर

37

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

add r1,r2 

था सी में कहना है कि

r1 = r1 + r2; 

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

q = mem[0x12]; 
e = q; 
q = mem[0x13]; 
e = e + q; 
mem[0x12] = e; 

लांग, पता देखो क्या दो रजिस्टरों एक संचायक और एक अन्य, अच्छी तरह से तो यह आसान है क्योंकि चर अधिकांश भाग के लिए स्मृति में थे हो सकता है कुछ के बारे में बात कर रहे हैं और बाहर निकाला गया लेकिन यह स्पष्ट है कि mem [0x12] = mem [0x12] + mem [0x13];

ये मेमोरी स्थान संभावित चर हैं जो रजिस्टरों के समूह के साथ एक प्रोसेसर के लिए संकलित सी कोड की तरह कूद नहीं पाएंगे। तस्वीर चर को समझना आसान कर सकती है और फिर एक खोज कर सकती है और फ़ाइल में उन्हें नाम देने के लिए प्रतिस्थापित कर सकती है।

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

मिलियन डॉलर का सवाल, क्या आप एक तस्वीर के लिए एक स्थिर बाइनरी अनुवादक पा सकते हैं? कौन जानता है, आपको शायद खुद को लिखना होगा। और अनुमान लगाएं कि इसका क्या अर्थ है, आप एक डिस्सेबलर लिखते हैं, और देशी असेंबलर सिंटैक्स में एक निर्देश को अलग करने की बजाय R0 जोड़ने के बजाय, r1 आपके पास अपने डिस्सेबलर प्रिंट r0 = r0 + r1 है; जब तक आप इस डिस्सेबलर को पूरा करते हैं, तब भी आपको तस्वीर असेंबली भाषा अच्छी तरह से पता चलेगी कि आपको सी अनुवादक के लिए एएसएम की आवश्यकता नहीं है। आपके पास चिकन और अंडे की समस्या है।

+7

अच्छे अंक; अपनी व्याख्या के लिए +1। हालांकि मुझे विश्वास नहीं है कि यह 100% स्वचालित रूप से किया जा सकता है। क्योंकि असेंबली में कोड सीपीयू के हर बिट का उपयोग कर सकते हैं। उदाहरण के लिए, कोड में किसी भी स्थान पर शून्य और कैरी और साइन बिट्स की सेटिंग के रूप में साइड इफेक्ट्स का उपयोग किया जा सकता है। ये आम तौर पर सी में दिखाई नहीं दे रहे हैं। ऐसे अनुवादक को गैर-इच्छित परिवर्तनों से इच्छित फ़िल्टर को फ़िल्टर करने की आवश्यकता होगी। वर्चुअलाइजेशन आसान है, क्योंकि इसे कोड की समझ की आवश्यकता नहीं है, यह सिर्फ सीपीयू मॉडल करता है। – Adriaan

+2

यह स्वचालित रूप से 100% किया जा सकता है और semantics संरक्षित किया जा सकता है। दूसरी तरफ कोडिंग शैली और अन्य सम्मेलन पूरी तरह से खो जाएंगे (क्योंकि वे निहित हैं)। –

6

सी अनुवादक के लिए कुछ स्वचालित एएसएम होना चाहिए, लेकिन मुझे लगता है कि लोग यह असंभव कह रहे हैं। स्पष्ट रूप से, यह असंभव होने के लिए असंभव है।

नहीं, ऐसा नहीं है। संकलन जानकारी खो देता है: सी स्रोत कोड की तुलना में अंतिम ऑब्जेक्ट कोड में कम जानकारी होती है। एक डीकंपलर जादुई रूप से उस जानकारी को कुछ भी नहीं बना सकता है, और इसलिए वास्तविक अपघटन असंभव है। इस बाहर

+2

जब तक कि मैं कुछ गलत नहीं समझता, सवाल असंगत होने के बारे में नहीं है, बल्कि एएसएम स्रोत को सी – UnkwnTech

+15

में परिवर्तित करने के लिए वह * मूल * स्रोत (जो हैमबर्गर-बैक-टू-गाय समस्या है) पर वापस डिकंपलर होने के लिए नहीं कह रहा है। वह सिर्फ एक सी * अनुवाद * चाहता है, जो बिल्कुल संभव है क्योंकि सी ट्यूरिंग-पूर्ण है। – caf

+2

कभी सी अनुवादक के लिए एक असेंबली का इस्तेमाल किया? वे असेंबली भाषा थूकते हैं लेकिन सी सिंटैक्स के साथ: आपको 'ईएक्स' और' ईबीएक्स '(आईए -32 के लिए) जैसे चर मिलते हैं। वे लगभग पूरी तरह से बेकार हैं, लेकिन काफी नहीं हैं। आप असेंबली भाषा को पढ़ना सीख सकते हैं। – kquinn

3

की जांच: decompiler

एक decompiler नाम एक कंप्यूटर प्रोग्राम है कि एक संकलक की है कि रिवर्स कार्रवाई निष्पादित करने के लिए दिया है। यही कारण है, यह एक अमूर्त की अपेक्षाकृत कम स्तर पर एक युक्त जानकारी फ़ाइल तब्दील एक रूप अमूर्त के एक उच्च स्तर के होने में (आमतौर पर कंप्यूटर पठनीय नहीं बल्कि मानव पठनीय से होने के लिए बनाया) (आमतौर पर मानव होने के लिए बनाया पठनीय)।

17

ठीक उसी स्रोत कोड एक संकलित कार्यक्रम से वापस हो रही है मूल रूप से असंभव है। लेकिन डीकम्पाइलर कंप्यूटर विज्ञान (जैसे the dcc decompiler है, जो एक पीएचडी परियोजना थी) में अनुसंधान के एक क्षेत्र को दिया गया है।

ऐसे कई एल्गोरिदम हैं जिनका उपयोग असेंबली कोड पर पैटर्न मिलान करने और समकक्ष सी कोड उत्पन्न करने के लिए किया जा सकता है, लेकिन यह सामान्य तरीके से ऐसा करना बहुत मुश्किल है जो सभी इनपुट के लिए अच्छा काम करता है।

आप एक सामान्यीकृत decompiler पर एक अर्द्ध हाल खुला स्रोत के प्रयास के लिए Boomerang की जाँच कर सकते हैं।

+0

बुमेरांग ने मेरे उद्देश्य के लिए काफी अच्छा काम किया, धन्यवाद! – Steven

+0

मैंने बहुत जल्द बात की। सबसे पहले, जब मैंने "काम किया" लिखा था, यह एक टाइपो था - जिसे "काम" माना जाता था। मैंने अपने पृष्ठों के माध्यम से पढ़ा लेकिन वास्तव में कोशिश नहीं की थी। अब मेरे पास है, यह बिल्कुल काम नहीं करता है! यह निश्चित रूप से रिवर्स इंजीनियरिंग के लिए है, क्योंकि यह केवल (बेवकूफ) बाइनरी फ़ाइल स्वीकार करेगा। आह। हो सकता है कि "डिकंपेलर" वह नहीं है जिसे मैं ढूंढ रहा हूं, बल्कि बस "अनुवादक" – Steven

+2

@ स्टेवन: - क्या आप कोड संकलित नहीं कर सकते हैं और फिर बुमेरांग का उपयोग करके इसे संकुचित कर सकते हैं? –

4

यह असंभव नहीं है, बस बहुत मुश्किल है। एक कुशल असेंबली और सी प्रोग्रामर शायद यह कर सकता है, या आप Decompiler का उपयोग कर देख सकते हैं। इनमें से कुछ सेल्सियस के लिए एएसएम परिवर्तित करने की काफी एक अच्छा काम करने हालांकि आप शायद कुछ चर और तरीकों का नाम बदलने का होगा।

86 आर्किटेक्चर के लिए उपलब्ध डीकम्पाइलर की एक सूची के लिए बाहर this site चेक।

3

आसानी से संभव नहीं है।

पठनीयता के अलावा एएसएम पर सी के महान फायदों में से एक यह था कि यह "चालाक" प्रोग्रामिंग चाल को रोकता था।

कोई प्रत्यक्ष सी बराबर, है या सी

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

इसके अलावा सभी असेंबलर स्टोरेज अनिवार्य रूप से एक "संरचना" है; भंडारण को परिभाषित क्रम में रखा गया है (सी के विपरीत जहां रनटाइम के दौरान भंडारण का आदेश दिया जाता है)। कई एएसएम कार्यक्रम सटीक भंडारण लेआउट पर निर्भर करते हैं - सी में एक ही प्रभाव को प्राप्त करने के लिए आपको एक ही संरचना के हिस्से के रूप में सभी भंडारण को परिभाषित करने की आवश्यकता होगी।

इसके अलावा absused निर्देश का एक बहुत (Olde worldy पर आईबीएम manframes ला, लोड का पता, अनुदेश था नियमित रूप से के रूप में यह तेजी से था सरल arithimatic प्रदर्शन किया और फ्लॉप एक अतिप्रवाह रजिस्टर की जरूरत है)

हालांकि यह हो सकता है कर रहे हैं परिणामस्वरूप सी कोड का अनुवाद करने के लिए तकनीकी रूप से संभव हो सकता है जो एएसएम कोड से ट्रांसलेटर किया गया था उससे कम पठनीय होगा।

7

मैंने एक बार एक परियोजना का काम किया जहां बौद्धिक संपदा का एक महत्वपूर्ण हिस्सा x86 असेंबली कोड में कोडित कुछ गंभीर एल्गोरिदम था। बंदरगाह के लिए एक एम्बेडेड सिस्टम के लिए कोड, कि कोड के विकासकर्ता (मुझे नहीं) ने एक संगठन MicroAPL कहा जाता है से एक उपकरण का उपयोग किया है (अगर मैं सही ढंग से याद करते हैं):

मैं बहुत था, बहुत आश्चर्यचकित हुआ कि टूल ने कितना अच्छा किया।

दूसरी तरफ, मुझे लगता है कि यह उन लोगों में से एक है, "यदि आपको पूछना है, तो आप इसे बर्दाश्त नहीं कर सकते हैं" चीजें हैं (उनकी कीमत एक परियोजना के एक-एक रूपांतरण के लिए लगभग 4 तक है एक डॉलर के लिए संसाधित असेंबली की लाइनें)।

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

+1

हां, इसका मतलब सिर्फ बुलाया जाना है। बात यह है कि, हमारे पास पहले से ही एक घर उगाया गया पीआईडी ​​है जो कम या ज्यादा काम कर रहा है। मैं देखना चाहता हूं कि उनके कार्यान्वयन से कोई लाभ मिलता है या नहीं। मुझे नहीं पता कि आपने कभी पीआईडी ​​नियंत्रण को ट्यून किया है, लेकिन यह बहुत कठिन और समय लेने वाला है, इसलिए मुझे यह समझाने के लिए बहुत ही मूल्यवान है कि इसका उपयोग करने और सर्वोत्तम की उम्मीद करने के बजाए ऐसा करने का एक कारण है। दूसरी तरफ ... इसके लिए कुछ भी भुगतान करने लायक नहीं है :) – Steven

0

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

2

मैं 99% गारंटी के साथ कह सकता हूं, इस असेंबली भाषा के लिए कोई तैयार कनवर्टर नहीं है, इसलिए आपको एक लिखना होगा। आप बस सी समारोह के साथ एएसएम आदेश की जगह इसे लागू कर सकते हैं:

movf BARGB2,w -> c_movf(BARGB2,w); 
subwf AARGB2,f -> c_subwf(AARGB2,f); 

इस भाग के लिए आसान है :) तो फिर तुम प्रत्येक कार्य को लागू करने की जरूरत है। चीजों को आसान बनाने के लिए आप रजिस्टरों को ग्लोबल्स के रूप में घोषित कर सकते हैं। इसके अलावा आप फ़ंक्शंस का उपयोग नहीं कर सकते हैं, लेकिन # डिफाईन्स, यदि आवश्यक हो तो कॉलिंग फ़ंक्शन। यह तर्क/परिणाम प्रसंस्करण के साथ मदद करेगा।

#define c_subwf(x,y) // I don't know this ASM, but this is some Substraction must be here 

विशेष मामला एएसएम निर्देशों/लेबल, मुझे लगता है कि यह केवल #defines साथ परिवर्तित किया जा सकता है।

मज़ा तब शुरू होता है जब आप कुछ सीपीयू-विशिष्ट विशेषताओं तक पहुंच जाएंगे। यह स्टैक ऑपरेशंस, कुछ विशिष्ट आईओ/मेमोरी ऑपरेशंस के साथ सरल फ़ंक्शन कॉल हो सकता है। अधिक मजेदार प्रोग्राम काउंटर रजिस्टर के साथ संचालन होते हैं, गणना के लिए उपयोग किए जाते हैं, या टिक/लेटेंसी का उपयोग/गणना करते हैं।

लेकिन यह कट्टर होता है, तो एक और तरीका है। यह कट्टर भी है :) dynamic recompilation नाम की एक तकनीक मौजूद है। इसका उपयोग कई emulators में किया जाता है।

आपको अपने एएसएम को पुन: संकलित करने की आवश्यकता नहीं है, लेकिन विचार लगभग समान है। आप अपने सभी # डिफाइन का उपयोग पहले चरण से कर सकते हैं, लेकिन उन्हें आवश्यक कार्यक्षमता का समर्थन (पीसी/टिक्स में वृद्धि) जोड़ना। इसके अलावा आपको अपने कोड के लिए कुछ आभासी वातावरण जोड़ने की जरूरत है, जैसे मेमोरी/आईओ प्रबंधक, इत्यादि।

गुड लक :)

1

मुझे लगता है कि यह आसान है पीआईसी विधानसभा पर एक किताब ले सकते हैं और इसे पढ़ने के लिए सीखने के लिए। असेंबलर आमतौर पर सीखने के लिए काफी सरल है, क्योंकि यह बहुत कम स्तर है।

8

आप नहीं कर सकतेसी अवरोध, स्वयं संशोधित कोड, और अन्य निम्न स्तर बातें करने के निर्धारणात्मक परिवर्तित विधानसभा कोड सी में इनलाइन विधानसभा के अलावा अन्य कोई प्रतिनिधित्व है वहाँ केवल कुछ जो करने के लिए किस हद तक है के लिए एक सभा सी प्रक्रिया काम कर सकते हैं। परिणामस्वरूप सी कोड का उल्लेख नहीं करना वास्तव में असेंबली कोड पढ़ने से समझना मुश्किल होगा ... जब तक कि आप इसे सी में असेंबली कोड के पुनर्मूल्यांकन को शुरू करने के आधार के रूप में उपयोग नहीं कर रहे हैं, तो यह कुछ हद तक उपयोगी है। आईडीए के लिए हेक्स-रे प्लगइन देखें।

+1

... हालांकि हेक्स-रे ** ** ** ** भ्रामक हो सकता है, विशेष रूप से यदि आप अधिक से अधिक disassembly के लिए उपयोग किया जाता है ... – 0xC0000022L

+0

सहमत हुए। डुनो क्यों मैंने इसका जिक्र नहीं किया –

6

हाँ, यह रिवर्स इंजीनियर अच्छी गुणवत्ता सी

मैं एक MicroAPL, एक कंपनी है जो सी कोडांतरक कोड में परिवर्तित करने Relogix नामक एक उपकरण का उत्पादन यह एक में उल्लेख किया गया था के लिए काम करने के लिए कोडांतरक कोड के लिए बहुत संभव है अन्य पदों के।

कृपया हमारी वेब साइट पर उदाहरण पर एक नज़र डालें:

http://www.microapl.co.uk/asm2c/index.html

0

चेक बाहर asm2c

सी कोड के लिए डॉस/PMODEW 386 TASM विधानसभा कोड को बदलने के लिए स्विफ्ट उपकरण

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