
एक मृत USB प्रोटोकॉल का पुनर्निर्माण: एक गर्म चाकू द्वारा अनलॉक किए गए हैंडहेल्ड के रहस्य, एक भूले हुए USB इंटरफ़ेस को पुनर्जीवित करने की एक बहु-विषयक यात्रा
2024 में, bjiru ने ME2 हैंडहेल्ड डिवाइस के बारे में एक वीडियो अपलोड किया, जो 2008 के आसपास बनाया गया एक खिलौना था जिसमें आपके डिवाइस और ऑनलाइन दुनिया के बीच अंक और रत्नों को सिंक्रोनाइज़ करने के लिए USB का उपयोग करने की सुविधा थी। यह गेम अत्यंत विशिष्ट था, इसलिए कोई भी सॉफ्टवेयर, ड्राइवर या संपत्ति संग्रहीत नहीं की गई थी, कम से कम तब तक जब तक bjiru ने ऑनलाइन गेम क्लाइंट के साथ आगे नहीं आया।
मैं Miuchiz Reborn का नेता हूं, जो 2015 में शुरू किया गया एक प्रयास है, जो इसी तरह के एक गेम को संरक्षित करने, रिवर्स इंजीनियरिंग करने, एम्यूलेट करने और पहुंच बनाए रखने के लिए है, जिसमें USB के माध्यम से जुड़ा एक ऑनलाइन भाग और एक हैंडहेल्ड भाग था। समान पुरानी और गेम के प्रकार के कारण, ME2 पहले ही 2018 में मेरे Miuchiz समुदाय द्वारा मेरे ध्यान में लाया गया था, क्योंकि उन्होंने सोचा था (गलती से) कि वे वास्तुशिल्प समानताएं साझा कर सकते हैं। वर्षों तक मुझे डिवाइस के अस्तित्व के बारे में पता होने के बावजूद, bjiru के वीडियो ने आखिरकार मुझे इस पर शोध शुरू करने के लिए प्रेरित किया।
मेरे शुरुआती प्रयास केवल कंप्यूटर गेम की bjiru की प्रतिलिपि को फिर से कार्यात्मक बनाने के लिए आवश्यक सर्वर को फिर से बनाने पर खर्च किए गए थे, लेकिन रास्ते में, मेरा ध्यान अनिवार्य रूप से हैंडहेल्ड की ओर चला गया। ऑनलाइन गेम का पुनर्निर्माण निश्चित रूप से उस तंत्र के बिना पूरा नहीं हो सकता जो आपके अंकों को डिवाइस से और डिवाइस पर सिंक्रोनाइज़ करता है। आपके कंप्यूटर और ME2 डिवाइस के बीच यह संचार ही गेम का मुख्य आकर्षण था। मैंने सोचा कि Miuchiz हैंडहेल्ड डिवाइसों के साथ मेरा पिछला अनुभव मुझे उनके द्वारा अपेक्षित किसी भी संचार अनुष्ठान को सुलझाने में मदद करेगा... जब तक मुझे रिवर्स इंजीनियर करने के लिए कुछ कोड मिल जाए।
मेरी जिज्ञासा ने ME2 के बलिदान की मांग की। eBay ने फिएट मनी के बलिदान की मांग की। कुछ ही समय में, ये नमूने मेरे सामने पड़े थे।

ये छोटी इकाइयाँ हैं जिनमें केवल कुछ बटन और एक महिला मिनी-USB पोर्ट है। बॉक्स में एक केबल शामिल है, लेकिन इसमें सॉफ्टवेयर और ड्राइवरों के लिए कोई डिस्क नहीं है। वह USB पोर्ट आपके कंप्यूटर और हैंडहेल्ड के बीच अंकों को सिंक्रोनाइज़ करने का तरीका होगा, लेकिन जब मैंने Miuchiz हैंडहेल्ड डिवाइस के लिए उसी यात्रा पर शुरुआत की, तो मैंने यह पता लगाकर कि इसके साथ आने वाला विंडोज सॉफ्टवेयर कैसे काम करता है, इसकी फ्लैश मेमोरी तक पूर्ण पहुंच प्राप्त कर ली। ME2 के लिए ऐसे कोई सॉफ्टवेयर न होने के कारण, डिवाइस के साथ संवाद करने का तरीका जानने के लिए रिवर्स इंजीनियर करने के लिए कुछ भी नहीं है। Wayback Machine और bjiru की जांच करने के बाद भी, इन चीजों से बात करने के लिए उपयोग किए जाने वाले सॉफ्टवेयर की कोई भी प्रतिलिपि बची हुई प्रतीत नहीं होती है। मुझे लगता है कि इसे ME2 डेस्कटॉप बडी कहा जाता था, लेकिन वह एप्लिकेशन उस गेम क्लाइंट से अलग था जिसे bjiru ने बरामद किया था। हैंडहेल्ड खुद को एक हटाने योग्य स्टोरेज डिवाइस के रूप में प्रस्तुत करता है, लेकिन सामग्री आपको ME2 गेम डाउनलोड करने के लिए ऑनलाइन निर्देशित करती है, जो अब उपलब्ध नहीं है।
आगे का रास्ता स्पष्ट है, क्योंकि केवल एक विकल्प बचा है: हार्डवेयर खोलना।

मुख्य ME2 फर्मवेयर एक SST39VF3201 पर संग्रहीत है, जो एक 2 मेगावर्ड (4 मेगाबाइट, 16-बिट एड्रेसेबल इकाइयों के साथ) फ्लैश चिप है। मुख्य माइक्रोकंट्रोलर... एक कठोर एपॉक्सी ग्लोब-टॉप के नीचे है। इसे चिप-ऑन-बोर्ड (CoB) के रूप में जाना जाता है और यह आमतौर पर लागत बचाने का एक उपाय है, लेकिन इसका एक दुष्प्रभाव अंदर एकीकृत सर्किट के बारे में किसी भी पहचान संबंधी जानकारी को छिपाना है। एक नियमित रूप से पैक किए गए चिप पर आमतौर पर निशान होते हैं जो इसे पहचानते हैं, जैसे फ्लैश चिप पर होते हैं। चूंकि ऐसे उपकरणों में उपयोग किए जाने वाले माइक्रोकंट्रोलर में अक्सर एक आंतरिक ROM होता है, इसलिए यह संभव है कि मैं जिस USB कोड को रिवर्स इंजीनियर करना चाहता था, उसका कुछ या सभी भाग उस ROM में हो। ROM में वह कोड होने से एक ब्रिक किए गए डिवाइस को पुनर्प्राप्त करने का लाभ मिलता है या, यदि निर्माता ऐसा करना चुनता है, तो असेंबली के बाद डिवाइस को फ्लैश करने का लाभ मिलता है। वह ROM एक चिप के अंदर मौजूद होगी जिसे मैं पहचान नहीं सका।
फ्लैश चिप से डेटा प्राप्त करना एक सीधी और अच्छी तरह से प्रलेखित प्रक्रिया है: चिप को डीसोल्डर करें, इसे XGecu जैसे ऑफ-द-शेल्फ फ्लैश प्रोग्रामर में डालें, और इसका उपयोग सामग्री को डंप करने के लिए करें। यदि मुझे माइक्रोकंट्रोलर के ROM से भी जानकारी चाहिए, तो यह कम सीधा है, लेकिन यह अभी भी इस तरह के एक उपकरण के लिए संभव है जहां सुरक्षा की संभावना नहीं है। अतीत में, मैंने एक Tamagotchi Pix पर SPI फ्लैश में कोड जोड़ा था जो इसके बूट ROM को फ्लैश चिप पर खाली स्थान पर कॉपी करेगा, जिसे बाद में उसी फ्लैश प्रोग्रामर द्वारा पढ़ा जा सकता था जिसका उपयोग मैंने कोड इंजेक्ट करने के लिए किया था। हालांकि, उस मामले में, माइक्रोकंट्रोलर ठीक से पैक किया गया था और उस पर मॉडल जानकारी मुद्रित थी, इसलिए मैं इसका डेटाशीट ढूंढ सकता था ताकि पता चल सके कि यह किस निर्देश सेट का उपयोग करता है और इसका ROM मेमोरी स्पेस में कहां है। इस बिंदु पर, मेरे पास ME2 के रहस्यमय चिप-ऑन-बोर्ड के बारे में उस जानकारी में से कोई भी नहीं था।
अनिश्चितताओं के बावजूद, यहां से आगे का एकमात्र स्पष्ट रास्ता फ्लैश चिप को डीसोल्डर करना है। मैंने फ्लैश चिप के लिए कुछ सॉकेट भी खरीदे थे, इस उम्मीद में कि मैं हैंडहेल्ड के PCB पर एक को सोल्डर कर पाऊंगा। यह मुझे ME2 को पुन: प्रोग्राम करने और यदि मुझे माइक्रोकंट्रोलर से आंतरिक ROM को डंप करने के लिए कोड लिखने की आवश्यकता होती है, तो तेजी से पुनरावृत्ति करने की अनुमति देगा।
दुर्भाग्य से, मैं चिप को नुकसान पहुंचाए बिना सोल्डरिंग आयरन से फ्लैश चिप को निकालने में असमर्थ था। कई असफल प्रयासों के बाद इस कौशल समस्या को हल करने के लिए, मैंने इसके बजाय एक रीवर्क स्टेशन (प्रभावी रूप से एक हीट गन जो 500 डिग्री सेल्सियस तक पहुंचने का दावा करती है) खरीदा और हॉट एयर से सोल्डर को पिघलाकर चिप को हटा दिया। इसने मुझे बिना किसी समस्या के फ्लैश की सामग्री को डंप करने की अनुमति दी, लेकिन इससे पता चला कि वास्तव में मेरे द्वारा खरीदे गए सॉकेट का उपयोग करना मेरी क्षमताओं से परे होगा। मुझे न केवल सभी 48 छोटे पिनों को PCB पर सोल्डर करना होगा, बल्कि सॉकेट पर प्लास्टिक को पिघलने से बचाने के लिए इसे पर्याप्त तेज़ी से भी करना होगा। मेरे पास उससे निपटने के लिए न तो उपकरण थे और न ही कौशल, इसलिए यदि मुझे ROM की आवश्यकता होती, तो मुझे एक और रणनीति की आवश्यकता होती।
हालांकि, डंप अच्छा लग रहा था, और एक उपकरण का उपयोग करके जिसे मैंने विशेष रूप से फर्मवेयर डंप में असंपीड़ित बिटमैप खोजने के लिए बनाया था, मैं उन छवियों को ढूंढ सका जो सामान्य रूप से डिवाइस पर प्रदर्शित होतीं:

मैंने फ्लैश चिप से फर्मवेयर का डंप प्राप्त कर लिया है, लेकिन गंभीर रिवर्स इंजीनियरिंग करने से पहले, मुझे कम से कम यह जानना होगा कि डिवाइस किस निर्देश सेट पर चलता है। हार्डवेयर पर कोई निशान नहीं थे, इसलिए इसका अनुमान लगाना होगा। मैंने Ghidra में कोड का विश्लेषण करने का प्रयास किया, जो एक ओपन सोर्स डिस्सेम्बलर, डीकंपाइलर और जंकी दुःस्वप्न है जो मुझे नियोजित रखता है, इसमें आने वाले लगभग हर प्रकार के प्रोसेसर स्पेक के साथ। कोई ARM वेरिएंट? कोई 6502 वंशज? MIPS? शाब्दिक रूप से Ghidra द्वारा समर्थित कोई अन्य चीज़? सभी ने जोरदार "नहीं" कहा।
मैंने सब कुछ करने की कोशिश की, और कुछ भी इस कोड को डिस्सेम्बल नहीं कर पाया। मुझे पता था कि यह कोड है, क्योंकि मैं उस कोड के कुछ हिस्सों को भी ढूंढ सकता था जिसकी मुझे तलाश थी!

Miuchiz हैंडहेल्ड डिवाइस पर अपने पिछले काम के कारण, मुझे USB मास स्टोरेज डिवाइस कैसे काम करते हैं, इसकी कुछ जानकारी थी। मैंने इस स्निपेट को लगभग निश्चित रूप से कहीं 'U', 'S', 'B', 'S' को स्थानांतरित करने के रूप में पहचाना, जो विशेष रूप से उस तरह के USB मास स्टोरेज संचार के लिए एक हस्ताक्षर है जिसकी मुझे तलाश थी। मुझे डिवाइस के साथ बातचीत करने का तरीका जानने के लिए जिस USB कोड को रिवर्स इंजीनियर करने की आवश्यकता थी, उसका कुछ या सभी निश्चित रूप से इस फ्लैश डंप में था, लेकिन यह पता नहीं था कि यह किस निर्देश सेट में लिखा गया था, इसलिए मैं इसे डिस्सेम्बल नहीं कर सका।
इस बिंदु पर, मेरे पास कुछ टूटी हुई ME2 इकाइयाँ थीं। यह बेवकूफी लगता है, लेकिन शायद एपॉक्सी ब्लॉब के नीचे कहीं निशान हैं? शायद नहीं, लेकिन शोध चरण के लिए, कभी-कभी एक पूरी तरह से नष्ट की गई इकाई उससे अधिक मूल्यवान होती है जो बस टूटी हुई है।
खैर, मेरे पास एक हीट गन थी, और मेरे पास एक चाकू था। जैसा कि वे कहते हैं, जब आपके पास हीट गन और चाकू हो, तो सब कुछ... एक कील की तरह दिखता है? मुझे लगता है कि यह कहावत है।

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

ओह।
हुह।
मुझे नहीं पता था कि आप CoB को इस तरह डीकैप्सुलेट कर सकते हैं। यह बस साफ-साफ बाहर निकल आया, और इसके तापमान को देखते हुए, मुझे खुशी है कि यह मेरी दिशा में ऐसा नहीं किया। यह बहुत सुंदर है, लेकिन वास्तव में यहां से आगे का एक रास्ता है। मुझे बस अपने इलेक्ट्रॉन माइक्रोस्कोप से इसे करीब से देखने दें।

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

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

इसके फिंगरप्रिंट रिकॉर्ड पर हैं!
कई घंटों के बाद, सुबह 4 बजे, मैंने आखिरकार कुछ परिचित देखा। यह मेरी तुलना में बेहतर गुणवत्ता का है, लेकिन लेआउट निर्विवाद है। मेरे पास एक GPL162002A (या B) है जो John McMaster द्वारा ली गई मिलती-जुलती छवि की तुलना में 180 डिग्री घुमाया गया है। यह एक GeneralPlus माइक्रोकंट्रोलर है, इसका डेटाशीट इंटरनेट पर उपलब्ध है, और इसका निर्देश सेट μ'nSP है।
μ'nSP, जैसा कि पता चला है, इस प्रकार और पुरानी के खिलौनों के लिए काफी सामान्य है। उम्मीद है, मुझे माफ किया जा सकता है कि मैंने इसका अनुमान नहीं लगाया कि यह एक निर्देश सेट है जिसके नाम में ऐसे अक्षर हैं जो लैटिन वर्णमाला में भी नहीं हैं। इसके बावजूद, यह अभी भी इतना विशिष्ट है कि यह बॉक्स से बाहर Ghidra द्वारा समर्थित नहीं है। सौभाग्य से, इसके लिए कुछ मौजूदा तृतीय-पक्ष कार्य है, इसलिए मैं Ghidra में इसे डिस्सेम्बल करना, फ़ंक्शन नाम देना और डेटाशीट से रजिस्टर नाम आयात करना शुरू करने में सक्षम था।
यहाँ वह फ़ंक्शन है जिसके बारे में मुझे इतना यकीन था कि यह सिर्फ इसके हेक्स डंप से USB कोड था, जो माइक्रोकंट्रोलर के डेटाशीट में निर्दिष्ट USB रजिस्टरों के साथ बातचीत कर रहा है:

जैसा कि मैंने पहले उल्लेख किया, मैं पहले से ही कुछ हद तक परिचित था कि इस तरह के USB मास स्टोरेज डिवाइस कैसे संचार करते हैं, विशेष रूप से लिबस्ब का उपयोग करके अपने Miuchiz USB लाइब्रेरी को macOS पर पोर्ट करने के कुछ प्रयोगात्मक कार्य के कारण। USB मास स्टोरेज डिवाइस अनिवार्य रूप से SCSI कमांड को टनल करते हैं, और वे ऑनलाइन अच्छी तरह से प्रलेखित हैं। उदाहरण के लिए, डिवाइस से रीड या राइट का अनुरोध करने के लिए कमांड हैं।

हालांकि, मुझे पता था कि सामान्य तौर पर, मानक कमांड, जैसे रीड या राइट, मेरे लिए उपयोगी नहीं होंगे। ये वही हैं जो आपका कंप्यूटर पहले से ही अपने अंतर्निहित मास स्टोरेज ड्राइवरों के साथ करना जानता है। यह किसी भी सामान्य हटाने योग्य मीडिया डिवाइस की तरह इसके साथ बातचीत करने के लिए उन्हें जारी करेगा। इस मामले में, रीड कमांड केवल हेल्प फ़ाइल वाली फ़ाइलसिस्टम को पुनः प्राप्त करेगा, और राइट कमांड कुछ नहीं करेगा, क्योंकि इसे लिखने योग्य नहीं माना जाता है। ये पूरे फ्लैश चिप के साथ इंटरफेस करने के लिए नहीं हैं; इसके बजाय, ये प्रभावी रूप से पहली बार उपयोगकर्ताओं की मदद करने के लिए एक छोटा सिम्युलेटेड CD-ROM हैं।
हालांकि, कुछ कमांड ID विक्रेता के लिए आरक्षित हैं जो चाहे जो भी लागू करना चाहे। सामान्य ID लुकअप चलने से पहले कुछ आरक्षित ID के लिए हैंडलर मोटे तौर पर इंजेक्ट किए जाते हैं।

स्थैतिक विश्लेषण के माध्यम से, मैं उन फ़ंक्शनों की पहचान करने और नाम देने में सक्षम था जिनकी मुझे तलाश थी: फ्लैश को पढ़ना, प्रोग्राम करना और मिटाना। ये सभी गैर-मानक कमांड हैं जो ME2 और संभवतः अन्य GeneralPlus उपकरणों के लिए लागू किए गए थे, और लगभग निश्चित रूप से मूल रूप से डिवाइस के साथ आने वाले सॉफ्टवेयर और ड्राइवरों द्वारा उपयोग किए जाते थे। आप इनमें से किसी भी पथ को ट्रिगर करने के लिए एक USB संदेश तैयार कर सकते हैं। रीड आपको फ्लैश से डेटा प्राप्त करने देता है। प्रोग्राम आपको फ्लैश को "प्रोग्राम" करने देता है। इरेज़ आपको फ्लैश क्षेत्र में सभी बिट्स को 1 पर रीसेट करने देता है, जो प्रोग्राम कमांड के संयोजन में उपयोग किए जाने पर फ्लैश को पूर्ण राइट जारी कर सकता है, क्योंकि "प्रोग्रामिंग" केवल बिट्स को 1 से 0 में फ्लिप कर सकता है। मैं जिन कस्टम कमांड में रुचि रखता था, उनमें से प्रत्येक आरक्षित ID 0xFF का उपयोग करता है, उसके बाद उप-कमांड के लिए ID और ऑपरेशन की आवश्यकता वाले किसी भी पैरामीटर का उपयोग करता है।
कमांड की सटीक संरचनाएं पाठक के लिए विशेष रूप से प्रासंगिक नहीं हैं, लेकिन पद्धति हो सकती है। मैंने USB पर अपनी सभी बातचीत को सुविधाजनक बनाने के लिए libusb (वास्तव में, rusb) का उपयोग किया। यह विधि आपको एक नया ड्राइवर लिखने के विपरीत, अपने USB डिवाइस के साथ बातचीत करने के लिए यूज़रलैंड कोड लिखने की अनुमति देती है।
जब Windows ME2 सॉफ्टवेयर इंटरनेट से गायब हो गया, तो ऐसा था जैसे इसकी भाषा का दूसरा-से-अंतिम वक्ता मर गया हो। ME2 हैंडहेल्ड डिवाइस, एक अर्थ में, एक टर्मिनल स्पीकर बन गया। थोड़े से प्रयोग और कभी-कभी सही डीकंपाइलेशन पढ़ने के साथ, मैं इसकी लगभग विलुप्त भाषा के शब्दों को सीखने के लिए इसके दिमाग को पढ़ रहा था। जब इसने वापस बात की, तो मुझे पता था कि मैं सही रास्ते पर हूं।
Č̶̯a̴̩͗n̵͉͆ ̴͍͠Ǐ̶̜ ̴͈͌h̷̙̔á̶͉v̸͈̽é̴̢ ̵͍͛a̵̞͝ ̴̤̉s̵̡͊ē̴̮c̸̭̅t̶̛͖o̸̡͠r̶̺̊ ̶̥̀ǫ̸̀f̸̦́ ̷̈́ͅỳ̷͎o̶̦̐u̵͙̚r̶͙͒ ̵̥̕f̸̡͝l̷͈̄a̶͍͋s̸̢̓h̸̗͝?̴̪̕
...नहीं? यह मेरा उच्चारण होना चाहिए। मुझे समायोजित करने दें और फिर से पूछें: क्या मैं आपके फ्लैश का एक सेक्टर ले सकता हूं? अगले सेक्टर के बारे में क्या? क्या आप उस सेक्टर में किसी भी बिट को प्रोग्राम करने को तैयार हैं? क्या मैं आपका फ्लैश फिर से ले सकता हूं यह देखने के लिए कि क्या यह अब अलग है? क्या मैं आपसे एक सेक्टर को मिटाने के लिए कहने की हिम्मत करूं... और उम्मीद है कि समझूं कि मैं आपको किसे नष्ट करने के लिए कह रहा हूं?
एक-एक करके, मैंने उन संदेशों को संरचित करने, भरने और प्रसारित करने के लिए कोड लिखा जिन्हें ME2 को सुनने की आवश्यकता थी। एक बार जब हम एक ही पृष्ठ पर थे, तो मैंने इसे अंकों की अलग-अलग मात्रा रखते हुए कुछ फ्लैश डंप भेजने के लिए कहा। उनकी तुलना करने के बाद, मैं यह पहचानने में सक्षम था कि फ्लैश में अंक कहां संग्रहीत हैं और अंत में उन्हें संशोधित करने के लिए अपने कंप्यूटर का उपयोग किया!

वास्तव में, मैं इन कमांड का उपयोग करके डिवाइस के साथ जो चाहे कर सकता था, जब तक कि इसमें सक्रिय रूप से उपयोग किए जा रहे कोड को मिटाना शामिल न हो। ME2 मेरे उन उपकरणों के संग्रह में शामिल हो गया जो उन जगहों पर Miuchiz Reborn प्रतीक प्रदर्शित करते हैं जहां इसे नहीं होना चाहिए, जिसमें डिजिटल माइक्रोस्कोप भी शामिल है जिसने डाई शॉट लिया था।

स्वीकार करते हुए, पहली बार जब मैंने फ्लैश पढ़ने/लिखने का प्रयास किया, तो मैं थोड़ा लापरवाह था, क्योंकि मैं वह सारा कोड नहीं देख सकता था जो निष्पादित हो रहा था। उदाहरण के लिए, कुछ कोड माइक्रोकंट्रोलर के आंतरिक ROM में कॉल करता है, या वहाँ कॉपी किए गए RAM रूटीन में कॉल करता है। अन्य फ़ंक्शनों के लिए मेरे कुछ अनुमान इस बात से प्रभावित थे कि डायरेक्ट मेमोरी एक्सेस (DMA) रजिस्टर कैसे सेट अप किए गए थे। उदाहरण के लिए, यदि DMA को USB बफर से कॉपी करने के लिए सेट अप किया गया है, तो यह संभवतः फ्लैश को प्रोग्राम करने के लिए उस डेटा का उपयोग कर रहा है, न कि फ्लैश से पढ़ने के लिए।

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

128 किलोवर्ड का विशेष रूप से "embadded" ROM है जिस तक मेरी अभी तक पहुंच नहीं थी, जो मुझे सिस्टम को पूरी तरह से समझने से रोक रहा था।
सौभाग्य से, कस्टम फ्लैश रीड कमांड के लिए फ़ंक्शन बाउंड्स चेकिंग नहीं करता है। इसका मतलब है कि एक विशेष रूप से तैयार किए गए संदेश के साथ जो बहुत अधिक फ्लैश पते से पढ़ने का प्रयास करता है, आप माइक्रोकंट्रोलर के पूरे एड्रेस स्पेस के चारों ओर लपेट सकते हैं, अंत में शुरुआत में वापस आ सकते हैं। चूंकि यह एक मनमाना पढ़ने की क्षमता के बराबर है, इस बार मुझे कोई ऑन-डिवाइस डंपिंग कोड लिखने की आवश्यकता नहीं थी! इस बग के साथ सारी मेमोरी पढ़ने योग्य है, इसलिए मैंने इसका उपयोग Embadded ROM को पढ़ने के लिए किया, जिसे मैंने बाद में रिवर्स इंजीनियरिंग के लिए सहेज लिया।
सारी मेमोरी के साथ, मैं RAM में डिवाइस का फ्रेमबफर देख पाया, जो उस समय डिवाइस की स्क्रीन पर मौजूद छवि को प्रदर्शित कर रहा था:

मैं डेटाशीट से यह संदर्भ लेकर डिवाइस के एड्रेस स्पेस से सामान्य प्रयोजन I/O (GPIO) रजिस्टरों को भी पढ़ने में सक्षम था कि वे कहां होने चाहिए। प्रति सेकंड दर्जनों बार बग को ट्रिगर करके, मैं प्रभावी रूप से बटन दबाने के लिए पोल कर सकता था और यदि मैं चाहता तो इसे USB नियंत्रक में बदल सकता था: (वीडियो)

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

0x00AA (याद रखें, इस सिस्टम का शब्द आकार 16 बिट है) फ्लैश में एक ऐसी जगह लिखा गया है जिसके लिए मैंने नहीं कहा था। Embadded ROM के साथ, हम अंत में वह कोड देख सकते हैं जो इसे समझाता है।

ये फ्लैश चिप विशिष्ट ऑफसेट पर लिखकर कमांड लेते हैं। RAM के विपरीत, जो तुरंत लिखे गए डेटा को प्रतिबद्ध करता है, फ्लैश चिप केवल एक कमांड के भाग के रूप में लेखन की व्याख्या करने का प्रयास करेगी, इसलिए फ्लैश के एड्रेस स्पेस में एक एकल लेखन वास्तव में किसी भी डेटा को बदलने के लिए पर्याप्त नहीं है। जब कोई कोड फ्लैश को प्रोग्राम करना चाहता है, तो वह एक बहु-चरणीय कमांड अनुक्रम जारी करता है जो 0x5555 पर 0xAA लिखने से शुरू होता है और वांछित पते पर वांछित डेटा लिखने के साथ समाप्त होता है।यदि कोई उपयोगकर्ता, जिसके पास बहुत अधिक खाली समय है (और शायद एक हीट गन और एक चाकू भी), यह पता लगाने की कोशिश करने का विचार लेकर आता है कि डिवाइस कैसे काम करता है, तो वह डिवाइस को उस सेक्टर पर प्रोग्राम करने का अनुरोध कर सकता है जो उसके फ्लैश चिप की क्षमता से परे है। प्रोसेसर हर कदम से अवगत है, लेकिन फ्लैश चिप अवगत नहीं है। इसके बजाय, वह अंतिम कमांड साइकिल फ्लैश चिप के एड्रेस स्पेस से पूरी तरह चूक जाती है, इसलिए फ्लैश उत्सुकता से प्रतीक्षा करता है कि किस वैल्यू को कहाँ प्रोग्राम किया जाना चाहिए।
प्रोसेसर: अरे फ्लैश! मैं एक और वर्ड प्रोग्राम करना शुरू करना चाहता हूँ!
फ्लैश: जोर से और स्पष्ट! 0xAA को 0x5555 पर प्रोग्राम कर रहा हूँ!
प्रोसेसर: ...हुह?
डिसिंक्रोनाइज़्ड कमांड साइकिल के कारण, फ्लैश अगले कमांड के पहले साइकिल को पिछले कमांड के अंतिम साइकिल के साथ भ्रमित कर देता है, और 0xAA 0x5555 पर प्रोग्राम हो जाता है। सामान्य 8-बिट बाइट्स के लिए समतुल्य एड्रेस 0xAAAA है, जो उस स्थान से मेल खाता है जहाँ मेरे फ्लैश डंप में 0x00AA लिखा गया था।
यह संभावित रूप से एक आर्बिट्ररी राइट के लिए उपयोग किया जा सकता है, जब तक आप फ्लैश में उस विशिष्ट वर्ड को दूषित करने से सहमत हैं, लेकिन डिवाइस पहले से ही पर्याप्त रूप से पॉन किया जा चुका है कि मैं और अधिक यूनिट्स को ब्रिक करने में रुचि नहीं रखता। इन डिवाइसों को बचाना संभव हो सकता है, क्योंकि एम्बेडेड ROM के रिवर्स इंजीनियरिंग से यह भी पता चला कि इसमें अपना स्वयं का USB हैंडलर और फ्लैश रीड/प्रोग्राम/इरेज़ कार्यान्वयन शामिल है। हालाँकि, मैंने केवल एक बार ROM को उस स्थिति में प्रवेश करते देखा है (फ्लैश कोड में बूट करने के बजाय), और फिर कभी नहीं। ROM के डीकंपाइलेशन के आधार पर, मुझे संदेह है कि यह एक GPIO पोर्ट पर निर्भर हो सकता है जो फ्लोटिंग छोड़ दिया गया है, लेकिन मुझे यकीन नहीं है। किसी भी मामले में, यहाँ मेरा मिशन पहले ही पूरा हो चुका था।
इस शरारत का अंतिम परिणाम एक कमांड-लाइन उपयोगिता है जो निम्नलिखित कर सकती है:
यह, गेम सर्वर कोड और अन्य शोध के साथ, ME2-Restoration रिपॉजिटरी में उपलब्ध है। चूंकि कार्यान्वयन विवरण वहाँ उपलब्ध हैं और सामान्य पाठक के लिए संभवतः दिलचस्प नहीं हैं, इसलिए यहाँ प्रक्रियाओं और तकनीकों का वर्णन करने के पक्ष में विशिष्ट तकनीकी विवरण छोड़ दिए गए हैं।
अधिक महत्वपूर्ण बात यह है कि यह प्रदर्शित करता है कि मूल PC-साइड सॉफ़्टवेयर इसकी कार्यक्षमता को समझने या संरक्षित करने के लिए सख्ती से आवश्यक नहीं है। यहां तक कि आधिकारिक सॉफ़्टवेयर समय के साथ खो जाने पर भी, ME2 नामक ब्लैक बॉक्स को खोलना और इसके हार्डवेयर और फ़र्मवेयर से इसके प्रोटोकॉल का पुनर्निर्माण करना, अन्यथा मृत इंटरफ़ेस को किसी ऐसी चीज़ में पुनर्स्थापित करना संभव था जो फिर से उपयोग करने योग्य हो। यह केवल USB जैसे इंटरफ़ेस तक सीमित नहीं है। पढ़ें कि कैसे मैंने एक दशक पुराने वेक्टर एडिटर को पुनर्जीवित करने के लिए एक लंबे समय से मृत लाइसेंस सर्वर को फिर से बनाया।
यह एक एकीकृत सर्किट को डीकैप्सुलेट करने का मेरा पहला मौका भी है, इसलिए इसे उचित सम्मान देने के लिए, मैंने एक बेहतर माइक्रोस्कोप खरीदा और तब से GPL162002A/B की उच्चतम गुणवत्ता वाली फोटो siliconprawn में योगदान दी है, जिसे वेब-मित्रता के लिए कम रिज़ॉल्यूशन पर यहाँ पूर्वावलोकन किया गया है:
