मॉडर ने GBA क्रैश साउंड से गेम ROM बहाल किया
(arstechnica.com)- TheZZAZZGlitch ने Game Boy Advance क्रैश साउंड रिकॉर्ड करके कार्ट्रिज के अंदर मौजूद गेम डेटा की पहचान की, और अंततः उसी ROM को फिर से बहाल किया जा सकता है, यह दिखाया
- मुख्य विचार यह है कि क्रैश के बाद निकलने वाले ऑडियो को ROM डेटा के रूप में समझा जाए, लेकिन अलग-अलग सोर्स फ़ॉर्मैट के हिसाब से काफी एडजस्टमेंट चाहिए, इसलिए इसे सामान्य डम्प टूल की तरह इस्तेमाल करना मुश्किल है
- 4 घंटे से ज़्यादा की रिकॉर्डिंग में लगभग 1 घंटा 50 मिनट के आसपास एक विशिष्ट waveform दिखाई दिया, और उसके बाद गेम के instrument sounds और audio samples क्रम से सुनाई दिए
- Python script और alignment correction की मदद से 99.76% accuracy तक पहुँचा गया, लेकिन बूटिंग विफल रही; फिर 3 रिकॉर्डिंग को majority-vote algorithm से मिलाने पर यह 99.979% तक सुधर गया
- 7 रिकॉर्डिंग को मिलाने और खाली हिस्सों को फ़िल्टर करने के बाद 100% match हासिल हुआ, जिससे सिर्फ क्रैश साउंड के आधार पर GBA ROM बहाल करने की प्रायोगिक संभावना की पुष्टि हुई
क्रैश साउंड से ROM डेटा पढ़ने का प्रयोग
- TheZZAZZGlitch ने दिखाया कि software crash के बाद GBA जो आवाज़ निकालता है, उसमें गेम डेटा शामिल हो सकता है
- क्रैश हुआ GBA कार्ट्रिज के अंदर मौजूद डेटा के आधार पर आवाज़ निकालता रह सकता है, और विशेष hardware तथा code से इस audio का विश्लेषण करके यह पहचाना जा सकता है कि वह कौन-सा गेम है
- हालांकि, यह तरीका कार्ट्रिज डेटा को आसानी से dump करने का साधन नहीं है, और तुरंत इस्तेमाल करने लायक समाधान भी नहीं है
- अलग-अलग source format के मुताबिक काफी tuning की ज़रूरत पड़ती है
लंबी रिकॉर्डिंग में उभरा waveform
- GBA को क्रैश कराने के बाद 4 घंटे से अधिक रिकॉर्डिंग करने पर लगभग 1 घंटा 50 मिनट के आसपास एक खास waveform दिखाई दिया
- इसके बाद के हिस्से में गेम में शामिल असली instrument sounds और audio samples क्रम से सुनाई दिए
- बाकी डेटा 13,100Hz के 8-bit data जैसा सुनाई देता है, और कुछ हिस्से बेहद अजीब लगते हैं
Python script और पहली बहाली की कोशिश
- TheZZAZZGlitch ने “2 दिन तक bugs ठीक करने के बाद” साफ़ GBA crash dump recording को पढ़ने वाली Python script तैयार की
- ROM डेटा में 0-byte वाले बड़े हिस्से मौजूद थे, और ये भाग मौन जैसे दिखाई देते हैं, इसलिए audio से इन्हें parse करना कठिन था
- मूल ROM में उनकी स्थिति के आधार पर sections को फिर से arrange करने वाली अलग script चलाने के बाद, बहाल किया गया ROM 99.76% accuracy तक पहुँचा
- यह ROM फिर भी बूट नहीं हुआ, और क्योंकि इसमें ज्ञात ROM डेटा का उपयोग करके अज्ञात डेटा को उजागर किया गया था, तकनीकी रूप से इसे “cheating” माना गया
- पूरी तरह blind तरीके से करने पर भी कुछ धारणाएँ और अनुमान लागू किए जा सकते हैं
कई रिकॉर्डिंग मिलाकर accuracy बढ़ाना
- अगले चरण में recording quality सुधारने पर ध्यान दिया गया
- 3 बार रिकॉर्ड किए गए नतीजों को “majority vote” algorithm से मिलाने पर accuracy 99.979% तक पहुँच गई
- यह output ROM बूट तो हो गया, लेकिन text गड़बड़ा गया और title screen पर crash हो गया
- इसके बाद 7 रिकॉर्डिंग को जोड़कर और खाली हिस्सों को फ़िल्टर करके 100% match हासिल किया गया
फ़िजिकल हार्डवेयर और अतिरिक्त प्रयोग
- वीडियो के बाद के हिस्से में यह भी देखा गया कि यह तरीका physical hardware पर कैसे काम करता है
- दूसरे गेम्स पर भी प्रयोग किए गए, और clone cartridge के अंदर मौजूद ARM code से जुड़ी एक रहस्यमय बात का भी पीछा किया गया
- बेहतर रिकॉर्डिंग पाने के तरीकों को भी आज़माया गया
- उनमें से एक था एक चैनल में rough mixdown करने वाला “cursed adapter” इस्तेमाल करना
1 टिप्पणियां
Hacker News की रायें
0x00 के लंबे क्रम की समस्या clock recovery से जुड़ी है
कुछ digital data streams, खासकर disk drive magnetic head का raw data या Ethernet जैसी high-speed serial communication, अलग clock signal के बिना भेजी जाती हैं
receiver एक मोटे frequency reference के आधार पर clock बनाता है, और phase-locked loop (PLL) से data stream के transitions के साथ clock phase को मिलाता है
इस तरीके के काम करने के लिए data transitions इतने बार-बार आने चाहिए कि PLL oscillator के drift को ठीक किया जा सके, और बिना transition के कितनी देर तक टिक सकता है, इसे maximum consecutive identical digits (CID) specification कहा जाता है
https://en.wikipedia.org/wiki/Clock_recovery
बाद में 64/66b जैसे बड़े bit blocks में छोटा header जोड़कर clock transitions सुनिश्चित करने और पूरे data को pseudorandom scrambler से गुजारने वाले तरीके पर शिफ्ट हुआ
clock पूरी तरह synchronized हो तब भी, लंबे intervals में लगभग पूरी तरह 1 वाला signal और लगभग पूरी तरह 0 वाला signal आखिरकार एक जैसे हो जाते हैं
audio analog है, और bitstream के रूप में decode करने के लिए DAC चाहिए; यह किसी खास synchronization के बिना 44.1kHz या 48kHz जैसी fixed frequency पर transmit होता है
https://en.wikipedia.org/wiki/Wireless_Set_Number_10
लगभग 20 साल पहले 4th-generation iPod firmware को piezo speaker से dump करने वाला original iPodLinux hack याद आ गया
https://web.archive.org/web/20140810083116/http://www.newscientist.com/article/dn7085
संयोग से उसी की वजह से iPod पर GBA games भी चला सकते थे, लेकिन click wheel से Doom खेलना और black-and-white video देखना ही काफी satisfying था
मेरे पास अभी भी iPod Classic है, और battery upgrade करने के बाद उसमें 256GB MicroSD card की 4 cards लगाए हैं
हाल ही में Bluetooth जोड़ने वाला mod भी देखा, लेकिन उसके लिए back case बदलना पड़ता है, इसलिए शायद मैं वहाँ तक नहीं जाऊँगा
इसके design में भी, और अपनी music files की copies खुद own करने की बात में भी समय के साथ फीका न पड़ने वाला एहसास है
इसे यहाँ और attention मिलते देखकर अच्छा लगा
कुछ दिन पहले भी post हुआ था, लेकिन दब गया: https://news.ycombinator.com/item?id=39037104
original video में इस छोटे write-up में न होने वाली बहुत सारी बातें हैं, और इसमें DS से ठीक audio quality पाने के लिए hacker का खुद काट-छांट कर बनाया गया custom adapter भी शामिल है
https://www.youtube.com/watch?v=0-7PSmYYHF0
Zzazz हर साल April Fools' Day contest/event आयोजित करता है, और आम तौर पर उसमें कुछ न कुछ retro hacking या reverse engineering शामिल होती है
हिस्सा लेने की सलाह दूँगा
पिछले contests GitHub पर हैं
Nintendo का audio architecture हमेशा दिलचस्प रहा है
मूल NES में arbitrary waveforms बनाने वाला sample generator था और उसे दो तरीकों से drive किया जा सकता था
एक तरीका यह था कि memory address देने पर वह bits पढ़ता और उन्हें बहुत simple waveform की तरह process करता; 1 का मतलब “value को एक बढ़ाओ”, 0 का मतलब “value को एक घटाओ”, इसलिए flat waveform बनाने के लिए 10101010 जैसा repeat करना पड़ता था
दूसरा तरीका था CPU से “initial value” लगातार सीधे डालकर chip को direct drive करना, जो असल में audio driver द्वारा RAM से bits पढ़ने से तेज था
समस्या यह थी कि यह तरीका सारे CPU cycles खा जाता था, इसलिए इसे तभी इस्तेमाल किया जा सकता था जब कोई और काम न हो
Battletoads जैसे games ने इसका फायदा उठाकर action रुकने के दौरान higher-quality drum hits बजाए, और इसे title screen, दुश्मन को आखिरी hit देने पर पल भर के लिए सारी action रुकने वाले “crunchy” effect, और यादगार pause music में इस्तेमाल किया
यहाँ एक demo है जिसमें game direct drive mode और chip द्वारा samples पढ़ने वाले mode के बीच switch करता है। Retro Game Audio ने emulator से modified video upload किया है, जिसमें direct drive subroutine में प्रवेश करने का क्षण दिखता है: https://www.youtube.com/watch?v=JGT0FM3yh-w
सबसे पहले तो यही जिज्ञासा है कि ऐसा होता ही क्यों है
क्या ऐसे games का अपनी state को audio के रूप में dump करना आम बात है? क्या यह game developers के लिए जानबूझकर बनाया गया debugging tool है?
मूल रूप से GBA sound, RAM के buffer से audio stream करता है, और interrupt को hardware को बताना होता है कि buffer की शुरुआत से दोबारा पढ़े
लेकिन अगर interrupt नहीं आता, जैसे game crash होने पर, तो audio stream buffer से आगे निकलकर memory के दूसरे हिस्से पढ़ने लगता है
[1] https://www.youtube.com/watch?v=wSWNkpqjtQY&t=361s
सिद्धांत रूप में GBA, game crash होने पर architecture को “halt” कर सकता था, या नियमित रूप से चलने वाली state update को non-maskable interrupt से जोड़कर ऐसी watchdog व्यवस्था रख सकता था कि update रुकने पर reboot हो जाए
लेकिन ऐसी सुविधा महंगी पड़ती, इसलिए GBA में यह नहीं है
Nintendo ने पुराने game cartridge निर्माताओं वाला पारंपरिक तरीका अपनाया: “अगर हमारे game में bugs नहीं हैं, तो undefined hardware state में behavior की चिंता करने की जरूरत भी नहीं”
इसलिए जब कोई GBA game ऐसी crash state में फंसता है, जैसे interrupts disabled वाला infinite loop, तो audio chip को पता ही नहीं चलता कि system crash हो गया है और वह RAM के लगातार bits पढ़कर उन्हें sound में बदलने का अपना साधारण काम जारी रखता है
सामान्य operation में read operations को manage करने वाला cleanup routine गायब हो जाता है, इसलिए पढ़ना जारी रहता है और आखिरकार cartridge ROM के values दर्शाने वाले bits तक पहुंच जाता है
सच में अविश्वसनीय रूप से impressive है
यहां इस्तेमाल हुई majority-vote algorithm जैसी techniques शायद कई industries में पर्याप्त रूप से इस्तेमाल नहीं हो रही हैं
magnetic storage media मूल रूप से इसी hack जैसे सिद्धांत पर काम करता है
https://en.wikipedia.org/wiki/Partial-response_maximum-likelihood
यही विचार यहां भी लागू किया जा सकता है, क्योंकि GBA ROM content में मजबूत bias होगा
majority vote बहुत सारी जानकारी बर्बाद कर देता है
सारी photos को overlap कर दें और हर pixel के लिए सिर्फ median value छोड़ दें[1]
[1]: https://patdavid.net/2013/05/noise-removal-in-photos-with-median_6/
disk image को बार-बार पढ़ते रहना, quorum decision चलाना, और जब checksum pass करने वाला result मिले तो देखना कि वह सही से काम करता है या नहीं
file signature जैसे higher-level checksum हों तो extra verification के लिए और बेहतर है
कुछ aerospace applications में भी इस्तेमाल होता है
चूंकि वे pristine master नहीं बल्कि damaged हो सकने वाले theatrical prints से काम करते हैं, अगर कई copies का इस्तेमाल करके scratches आदि हटाए जा सकें, तो बाद की manual correction में लगने वाला समय बहुत कम हो सकता है
0xFF का 0x00 में बदलना DC blocking capacitor या high-pass filtering की वजह से हो सकता है
audio circuits inaudible content के लिए खास उपयुक्त नहीं होते
अगर किस्मत अच्छी हो, तो chip के audio output से digital oscilloscope सीधे जोड़ने पर capture accuracy बेहतर हो सकती है, फिर भी bootable image निकाल लेना काफी impressive है
इसलिए proper data-logging oscilloscope के बजाय कई बार repeat capture करके errors को average करने में कई घंटे लगाए गए
Manchester encoding जैसा simple तरीका भी काफी मदद करेगा
अगर उससे पर्याप्त न हो, तो NRZ या यहां तक कि convolutional encoding भी संभव है
साथ ही sine wave भेजनी चाहिए, या अगर ऐसा न हो सके तो कम से कम square wave frequency इतनी ऊंची रखनी चाहिए कि AC coupling capacitor उसे निगल न जाए
इस पूरी चीज में मेरे लिए सबसे impressive हिस्सा यह है कि pirates ने ROM+volatile storage memory के बजाय writable flash से game चलाने के लिए code में जो बदलाव किए
असल में ऐसे patches बनाना इतना मुश्किल भी नहीं है
pirates game code जहां save करता है उसे थोड़ा reverse-engineer करके, हर game के लिए patch लिखते हैं ताकि save content writable flash में flush हो जाए
हालांकि official GBA games save करने के लिए हमेशा Nintendo SDK के functions इस्तेमाल करते हैं, इसलिए उन functions को hook करने पर battery-less clone cartridges पर किसी भी GBA game को save करवा पाने वाला generic patch काफी simple हो जाता है
मैंने यह करने वाला patcher लिखा था, जो यहां देखा जा सकता है
https://github.com/metroid-maniac/gba-auto-batteryless-patcher
क्या किसी को पता है कि TheZZAZZGlitch का emulator जब report करता है कि game गलत address पर jump करने की कोशिश कर रहा है, तो अंदर क्या हो रहा होता है?
मैं GameBoy Advance में इस्तेमाल हुए ARM7 processor से परिचित नहीं हूं, लेकिन समझ नहीं पा रहा कि गलत value पर jump call कैसे बन सकती है
और यह भी उत्सुकता है कि TheZZAZZGlitch के गलत तरीके से restore किए गए ROM में से किसी एक को असली GameBoy पर चलाने से क्या होगा
bxinstruction का इस्तेमाल करके register में stored arbitrary address पर jump किया जा सकता हैऔर गलत restore किए गए ROM को असली GameBoy पर चलाने से crash होगा, और आखिरकार वह ROM को speaker पर बजाना शुरू कर देगा
video का मूल point यही है :)
असली hardware पर क्या होगा… कौन जाने :)