कच्चे बाइनरी कोड से प्रोसेसर प्रकार की पहचान करें?


19

वास्तव में चिप्स से संबंधित नहीं है, लेकिन उम्मीद है कि मुझे यहाँ से कुछ दिशाएँ मिलेंगी।

मुझे कोड का एक हिस्सा मिला है, लेकिन मुझे नहीं पता कि यह किस प्रोसेसर के लिए है। क्या ऐसे उपकरण उपलब्ध हैं जो मुझे कोड प्रकार की पहचान करने में मदद कर सकते हैं? क्या सांख्यिकीय तरीके मदद कर सकते हैं? बाइट वितरण? जोड़े वितरण, आदि? मार्कोव श्रृंखला शायद?


7
क्या आप हमें कच्चे हेक्स में पहले 200 बाइट दे सकते हैं?
pingswept

यह एक मजेदार सवाल है। आप किस तरह की डिवाइस हैक कर रहे हैं?
डेविडग्रीसोन

1
आप इसे अलग-अलग असंतुष्टों के एक जोड़े को खिलाने की कोशिश कर सकते हैं और देख सकते हैं कि क्या होता है।
जस्टजेफ

2
मैं उस कोड को 100 बाइट्स में नाम दूंगा! = पी
जस्टजेफ़

बड़ा सवाल है। हालांकि StackOverflow के लिए एक बेहतर फिट हो सकता है।
शार्पटेल

जवाबों:


16

इसे GNU फ़ाइल के माध्यम से चलाने का प्रयास करें। यदि इसे कोई मानक हेडर मिला है, तो इसे उठा लेंगे।

उदाहरण के लिए।

jrt@lin:~/src$ file foo
foo: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, not stripped

कोशिश की है कि। GNU फ़ाइल कहती है कि यह "डेटा" है।
मेंटलिस्ट

3
क्या आप इसमें से कुछ पोस्ट कर सकते हैं? "तार" के साथ इसमें ASCII खोजने की कोशिश की?
टॉबी जाफ़े

9

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

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

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

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

यह जिस भाषा में प्रोग्राम किया गया था, उसके आधार पर, आपके पास कुछ अतिरिक्त सुराग हो सकते हैं। यदि इसे सी या इसी तरह की प्रक्रियात्मक भाषा में प्रोग्राम किया गया था, तो स्टैक से मूल मानों को वापस करने के लिए बहुत सारे चबूतरे वापस करने से ठीक पहले स्टैक को कुछ रजिस्टरों को बचाने के लिए निर्देशों का क्रम लगभग हमेशा शुरू होगा। । यदि आप कुछ पैटर्न पहचान कर सकते हैं, तो आपको इनमें से कई क्रम मिलेंगे, और यह निर्धारित करने में सक्षम हो सकते हैं कि कौन से निर्देश सबसे अधिक संभावना पुश / पॉप निर्देश, वापसी, आदि हैं, जो आपकी पसंद को थोड़ा कम कर सकते हैं।

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

उस बिंदु पर, मैं सबसे सामान्य प्रोसेसर आर्किटेक्चर के साथ शुरू होता हूं और देखता हूं कि क्या कुछ भी संबंधित है। x86, arm, mips, 8051, avr, pic, powerpc, Z80, 68k, 6502, etc, etc, आदि सामान्य प्रोसेसर और निर्देश सेट की सूची हैं - कम से कम अंग्रेजी बोलने वाले दुनिया में - जो सहायक साबित हो सकता है।

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


"यहां तक ​​कि यूरोप में कुछ प्रोसेसर हैं जो दूसरों की तुलना में अधिक सामान्य हैं।" यूरोप में रहते हुए, यह मेरे लिए कभी नहीं हुआ। क्या आप उदाहरण दे सकते हैं?
स्टीवनव

@ ostvenvh एकोर्न और सिनक्लेयर कंपनियों के कारण, 6502 और Z80 आधारित एम्बेडेड सिस्टम बहुत लोकप्रिय थे। और, बेशक, एआरएम प्रोसेसर एकोर्न कंप्यूटर्स में शुरू हुआ।
एडम डेविस

5

आइडिया: क्या आप जानते हैं कि सोर्सकोड की उम्र , यानी, किस समय / वर्ष के आसपास बनी थी?

यदि यह काफी पुराना था, तो यह आपको एक संकेत दे सकता है कि यह किस प्रोसेसर के लिए लिखा गया था। आप उस आयु / वर्ष को लिख सकते थे और यह निर्धारित कर सकते थे कि उस समय की अवधि के आसपास कौन सा प्रोसेसर लोकप्रिय था, और उन पर हेक्स फ़ाइल को लोड / निष्पादित करने का प्रयास करें।

दूसरे विचार में, पिछले 20 वर्षों में प्रोसेसर के बड़े पैमाने पर प्रसार को देखते हुए, यह एक सुई-इन-हिस्टैक तकनीक हो सकती है और बहुत फलदायी नहीं हो सकती है।


4

कई चंद्रमा पहले, जब वहाँ नहीं थे कि कई अलग प्रोसेसर कोर के आसपास, मैंने Z80 कोड को आवृत्ति विश्लेषण के माध्यम से कुछ बार पहचाना । Z80 CDके लिए मशीन कोड है call subroutineऔर C9है return from subroutine(मैं कभी नहीं भूलूँगा), और ये अक्सर सबसे अधिक होने वाले कोड हैं। इसके लिए आवश्यक है कि आप मशीन कोड स्तर पर निर्धारित निर्देश से परिचित हों। हाथ से असेंबली में अनुभव करने से मदद मिलती है (ऐसा बहुत कुछ किया है, और मैं अभी भी ऑफसेट की गणना करने के लिए हेक्स में पीछे की ओर गिन सकता हूं)।


3

यदि फ़ाइल 12-बिट या 14-बिट PIC के लिए है, तो बाइट्स की प्रत्येक जोड़ी एक 12- या 14-बिट शब्द होगी, आमतौर पर दो या चार सबसे महत्वपूर्ण बिट्स स्पष्ट होने के साथ, पहले एलएसबी संग्रहीत किया जाता है।


1

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

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

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