Translated by Markus Aurala (KYBS2004 course assignment at JYU.FI) rC3-intromusiikkia Herald: Seuraavasta puhujastamme... Hän on tietoturvatutkija, joka on erikoistunut sulautettuihin järjestelmiin, viesti- liikenteeseen ja matkapuhelimiin. Forbes nimesi hänet alle 30-vuotiaiden teknologiavaikuttajien listalleen ja hän on voittanut OWASP Appsec CTF:n. Hän on myös löytänyt ja raportoinut vastuullisesti haavoittuvaisuuksia. Ja erityisesti toivon teidän Nintendo- intoilijoiden katsovan seuraavan videon, joka on todella uskomaton ja jota tulette rakastamaan. Kiitos paljon. näyttää Nintendo-pelikasettia laittaa sen sisään konsoliin Nintendo päästää ääniä Thomas: Voi himpskatti. ottaa pelikasetin puhaltaa siihen laittaa sisään uudelleen Nintendo päästää ääniä musiikki soi Thomas Roth: Voi, mikä matka. Tervetuloa esitykseeeni "Uuden Nintendo Game & Watch Super Mario Brothersin hakkerointi". Nimeni on Thomas Roth. Olen tietoturvatutkija ja -kouluttaja Saksasta. Löydät minut Twitteristä nimellä @ghidraninja ja YouTubesta nimellä stacksmashing. Tämä vuosi on suosikkiputkimiehemme, Super Marion, 35-vuotisjuhlavuosi. Juhlan kunniaksi Nintendo julkaisi uuden pelikonsolin, Nintendo Game & Watch Super Mario Brothersin. Konsoli on höyhenen- kevyt ja näyttää kivalta. Ja siinä on valmiiksi asennettuna kolme peliä ja myös tämä animoitu kello. Kolme peliä ovat Super Mario Brothers (alkuperäinen NES- peli), Super Mario Brothers 2 The Lost Levels, ja myös uudelleensovitus vanhasta Game & Watch -pelistä, Ballista. Tiedätkin varmasti ettei tämä ole Nintendon ensimmäinen retrokonsoli. Vuonna 2016 he julkaisivat NES Classicin ja vuonna 2017 SNES Classicin. Nyt nuo laitteet ovat todella suosittuja harrastelijakehittäjien keskuudessa, koska niihin on todella helppo lisätä ROM:eja. Niiden laiteohjelmistoja on helppo muokata jne. Voit vain pistää piuhat kiinni koneeseesi, asentaa yksinkertaisen ohjelmiston ja tehdä mitä haluat sillä. Syy on se, että ne ne ajavat Linuxia ja niissä on melkoisen tehokas ARM-prosessori. Niillä on kiva puuhastella. Ja kun Nintendo julkaisi tämän uuden konsolin, monet ihmiset toivoivat siitä mobiilia laitetta harrastelijaohjelmoijille. Jos tekisimme nyt Venn-kaavion minun suurimmista kiinnostuksistani, siinä olisi takaisinmallinnus, laite- hakkerointi ja retrokoneilu. Tämä uusi Game & Watch olisi näitä kaikkia. Kun se julkistettiin 3. syyskuuta, tiesin, että minun oli pakko saada sellainen. Ja tietäen miten hankala NES- ja SNES-retrokonsoleita oli aluksi ostaa, ennakkotilasin sen 4-5 eri sivustolta. Pari niistä peruttiin. Mutta olin melko innoissani, koska minulla oli kolme ennakkotilausta, joiden piti lähteä 13. marraskuuta. Ja minä niin odotin sitä. Söin aamiaista 12. marraskuuta kun ovikello soi ja DHL:n kuriiri toimitti minulle uuden Game & Watchin päivää ennen virallista julkaisua. Siinä vaiheessa laitteesta ei ollut mitään teknistä tietoa saatavilla. Ei kerrassaan mitään. Jos etsit "Game & Watch" Twitteristä, et löytänyt muuta kuin julkaisun tai ehkä kuvan, jonka joku toinen ennakkotilaaja oli ottanut. Ei ollut mitään purkamisesta, ei kuvia sisuskaluista. Ja mikä tärkeintä, kukaan ei ollut vielä murtanut sitä. Ja tämä antoi minulle, laitehakkerille, ainutlaatuisen tilaisuuden olla ehkäpä ensimmäinen joka murtaa uuden konsolin. Ja minä kirjaimellisesti jätin kaiken muun kesken ja aloin tutkimaan laitetta. Nyt minun täytyy sanoa, että normaalisti pysyn kaukana uusien konsolien murtamisesta. Pääasiassa piratismin takia. En halua olla tekemässä siitä mahdollista. En halua olla osallinen. Enkä halua rakentaa työkaluja, joilla toiset piratisoivat. Mutta koska tähän laitteeseen ei voinut ostaa pelejä ja kaikki siinä olevat pelit olivat julkaistu jo yli 30 vuotta sitten, en ollut huolissani piratismista eikä minulla ollut ongelmaa jakaa kaikkea tutkimusteni tietoa eikä myöskään niitä ongelmia, joiden avulla pystyimme muokkaamaan laitetta. Tässä esityksessä kerron teille miten me mursimme laitteen ja miten sinä voit tehdä sen kotona suhteellisen halvoilla laitteilla. Toivottavasti nautit siitä. Katsotaan alkuun sitä laitetta. Laite on höyhenenkevyt ja kotelo on mukavan kokoinen. Joten se todella... Se todella istuu hyvin käteeni. Siinä on 320 x 240 pikselin LCD-näyttö, ristiohjain, A- ja B-napit ja lisäksi vielä kolme nappia, joilla vaihdetaan pelimoodien välillä. Oikealla sivulla on virtanäppäin ja USB-C -portti. Mutta ennen kuin innostut USB-portista, voin kertoa, että valitettavasti Nintendo on päättänyt olla kytkemättä USB-portin datalinjoja. Joten sitä voi käyttää vain lataamiseen. Ja koska on kyse Nintendosta, he käyttävät omia Tri-Point -ruuvejaan. Avataksesi laitteen, tarvitset meisseliin tuon erikoiskärjen. Onneksi tuo löytyy nykyisin useimmista seteistä. Mutta se on silti ikävää kun tilaat laitteen ja sitten et voikaan avata sitä työkalun puuttuessa. Kun olet avannut laitteen, huomaat ensimmäisenä varmastikin akun. Ja jos olet koskaan avannut Nintendo Switchin peliohjaimen, saatat tunnistaa akun, koska se on täsmälleen sama kuin peliohjaimessa. Tämä on siistiä, koska jos joskus, sanotaan kahden-kolmen vuoden päästä Game & Watchin akku kuolee, voit korvata sen peliohjaimen akulla, joita voit ostaa halvalla melkein mistä vain. Akun vieressä, oikealla puolella, on pieni kaiutin, joka ei ole kovinkaan hyvä. Ja sen alla on pääpiirilevy prosessorilla, kaikilla muisteilla ja niin edelleen. Katsotaanpa niitä. Laitteen pääprosessori on STM32H7B0. Tämä on Cortex M7 STMicroelectronicsilta, 1.3 megatavulla keskusmuistia ja 128 kilo- tavulla flash-muistia. Se toimii 280 MHz:n kellotaajuudella ja on aika tehokas mikro- kontrolleri, mutta se häviää prosessori- tehossa NES- ja SNES-retrokonsoleille. Tämä prosessori on todellakin vain mikro- kontrolleri, eikä se voi ajaa Linuxia tai erityisen monimutkaisia ohjelmistoja. Koodia kirjoitetaan suoraan raudan päälle. Laitteessa on raudalle koodattu laiteohjelmisto. Siitä oikealle näette 1 megatavun SPI flash -muistin. Yhteensä tässä laitteessa on n. 1,1 megatavua tallennustilaa. Useimmissa - tai oikeastaan kaikissa - mikrokontrollereissa on debuggausportti. Jos katsot piirilevyä, voit nähdä viisi liitintä, jotka eivät ole käytössä. Ja pari niistä käyttämättömistä liittimistä on sijoitettu lähelle prosessoria. Se on todennäköistä, että siinä on debuggausportti. Ja onneksi STM32:n tuotetietolomake on julkisesti saatavilla. Ja voimme tarkistaa kytkennät ja tarkistaa yleismittarilla onko nämä pinnit todellakin debuggausliittymä. Ja niinhän se oli. Sitten löysimme SWD-debuggausliittymän, kuten myös VCC:n ja maan näistä pinneistä. Tämä tarkoitti, että voimme käyttää debuggeria. Pystyimme kytkeytymään laitteeseen esimerkiksi J-Linkillä tai ST-Linkillä. Ja koska nämä liitännät ovat hyvin esillä, sinun ei tarvitse edes juottaa. Voit vain liittää pari testipinniä ja kytkeä ne debuggeriisi. Seuraava ongelma on, että useimmissa laitteissa debuggausliittymä lukitaan valmistus- prosessin aikana. Tämä tehdään, jotta ihmiset kuten me emme voisi tehdä laitteella mitä haluamme ja estääkseen meitä näkemästä laiteohjelmistoa, ehkä uudelleenohjelmoimasta sitä jne. Joten minä olin utelias näkemään jos voisin ottaa yhteyttä debuggausporttiin. Kun käynnistin J-Linkin ja yritin ottaa yhteyttä, voimme nähdä sen onnistuvan. Mutta kun tutkit asiaa tarkemmin, huomaat viestin jonka mukaan laite aktiivisesti lukusuojattu. Tämä siksi, että STM32-sirussa on ominaisuus nimeltään RDP-suojaustaso, readout protection level. Tämä on periaatteessa tietoturva-asetus debuggausliittymälle ja siinä on kolme tasoa. Taso 0 tarkoittaa, että suojaus on pois päältä. Tasolla 1 flash-muisti on suojattu ja me emme pysty kopioimaan sen sisältöä. Kuitenkin, me voimme kopioida keskusmuistin sisällön ja myös ajaa koodia keskusmuistissa. Ja sitten on myös taso 2, joka estää kaikki debuggaustoiminnallisuudet. Vaikka siru olisi tasolla 2, meidän ei pidä antaa periksi. Esimerkiksi esityksessämme "wallet.fail" parin vuoden takaa, näytimme miten generoimalla virheitä ohitimme tason 2 suojauksen ja tiputimme sirun tasolle 1. Kuitenkin, Game & Watchin tapauksessa, olimme onnekkaita ja liittymää ei oltu täysin estetty. Se oli tasolla 1 eli me pystyimme kopioimaan keskusmuistin, mikä on hyvä aloituspiste, vaikka emme vielä pystykään kopiomaan laiteohjelmistoa. Nyt kun saimme keskusmuistin laitteelta, olin kiinnostunut sen sisällöstä. Yksi epäilyistäni oli, että se oli ehkä emulaattori, joka toimii laitteella, lataa alkuperäisen Super Mario Brothersin ROM:in keskusmuistiin. Ja minä ihmettelin jos voisin löytää ROM:in keskusmuistin kopiosta. Ja minä avasin heksaeditoriin sen keskusmuistin kopion ja alkuperäisen Super Mario Brothersin ROMin. Yritin etsiä sen ROM:in osia keskusmuistin kopiosta. Ja kävi ilmi, että kyllä, se NES-ROM ladataan keskusmuistiin ja aina samaan osoitteeseen. Luultavasti se kopioidaan keskusmuistiin käynnistyksen yhteydessä tai jotain. Ja tämä on kiva tietää, koska se kertoo meille parikin asiaa. Ensiksikin tiedämme nyt, että debuggausportti on toiminnassa, mutta valitettavasti vain RDP-tasolla 1 ja voimme kopioida vain keskusmuistin. Ja me tiedämme myös, että NES:in ROM ladataan keskusmuistiin. Siellä täytyy olla oikea NES-emulaattori. Ja jos me olemme onnekkaita, voimme esimerkiksi korvata ROM:in laitteella toisella ROM:illa ja pelata siten vaikka omaa NES-peliämme. pieni tauko Seuraavaksi oli aika kopioida laitteen flash-muistisiru. Käytän tähän laitetta nimeltä Mini Pro ja yhtä näistä hyödyllisistä SOIC-8 -siruista. Voit kiinnittää nämä flash-muistisiruun ja kopioida sen sisällön. Varoitus: laitteen flash-muistisiru toimii 1,8 voltin jännitteellä. Haluat varmasti varmistaa, että ohjelmointilaitteesi tukee 1,8 V:n jännitettä. Jos vahingossa yrität lukea muistia 3,3 V:n jännitteellä, hajotat sen muistin. Usko pois - se tapahtui yhdelle minun laitteistani. Nyt kun meillä on tämä kopio flash-muistista, voimme analysoida sitä. Ensimmäiseksi tykkään katsoa kopion entropiaa tai satunnaisuutta. Käyttämällä binwalkia optiolla "-E", saamme hienon entropiakuvaajan. Tässä tapauksessa voitte nähdä, että entropia on hyvin korkealla melkein koko sisällön osalta. Yleensä tämä indikoi sitä, että muistin sisältö on kryptattu. Se voisi myös tarkoittaa pakkausta, mutta jos se olisi pakattu, näkisimme siinä enemmän tiputuksia. Tässä tapauksessa se on yhtä korkean entropian virtaa. Huomasimme myös, että siinä ei ole minkäänlaisia toistoja, mikä kertoo meille, että todennäköisesti kyseessä ei ole yksinkertainen XOR-salaus vaan pikemminkin AES tai vastaava. Se, että flash-muisti on salakirjoitettu ei tarkoita, että meidän pitäisi antaa periksi. Päinvastoin. Nyt tästä vasta tuleekin mielenkiintoista, koska tässä on haaste joka ei ole ihan itsestään selvä. Yksi suurimmista kysymyksistäni oli: onko flash-muistin sisältö varmistettu? Eli käynnistyykö tämä laite jos flash- muistin sisältöä on muutettu? Jos se käynnistyisi, se avaisi useita hyökkäysvektoreita, kuten pian näette. Varmistaakseni asian, kirjoitan nollia satunnaisiin paikkoin muistissa. Niinpä laitoin niitä osoitteeseen 0, vähän osoitteeseen 0x2000 jne. Ja sitten kokeilin käynnistyykö laite vielä. Useimmilla flash-muistin muutoksilla se käynnistyi ihan OK. Tämä kertoo meille, että vaikka flash-muistin sisältö on salattu, sitä ei ole varmistettu, ei tarkistussummilla eikä muutenkaan. Joten me voimme ehkä huijata laitteen hyväksymään muunnellun kopion flash-muistista. Tämä on tosi tärkeä tieto, kuten pian huomaat. Seuraava epäilykseni oli, että ehkä se NES-ROM, jonka näimme keskusmuistissa oli ladattu ulkoiselta flash-muistilta. Ja selvitääkseni tämän, otin sen flash-muistin kopion ja lisäsin siihen nollia eri kohtiin. Kirjoitin sen laitteelle, käynnistin sen, kopioin keskusmuistin ja vertasin sitä NES-ROM:iin, jonka löysin keskus- muistin kopiosta. Vertasin, ovatko ne identtisiä. Koska epäilykseni oli, että voisin ehkä ylikirjoittaa muutaman tavun salatussa flash-muistissa ja sitten muokata NES-ROM:ia. Sen jälkeen kun olin tehnyt sen, ehkä puoli tuntia myöhemmin, minua onnisti ja sain muutettua neljä tavua flash-nuistissa ja keskusmuistissa... Sori... ROM:issa, jonka latasin keskusmuistiin. Ja tämä kertoo meille melkoisesti. Se tarkoittaa, että ROM ladataan keskusmuistiin flash- muistilta, eikä sen sisältöä validoida. Ja mikä on myös tärkeää on se, että muutimme neljä tavua flash-muistissa ja neljä tavua muuttui puretussa ROM:issa. Tämä on tärkeää tietää, koska jos me katsomme mitä odotimme tapahtuvan flash- muistin sisältöä muutettaessa, se olisi voinut päättyä eri lopputuloksiin. Ja tässä meillä on SPI flash -muistin sisäsltö vasemmalla ja keskusmuistin sisältö oikealla. Ja keskusmuistin on purettu versio SPI flash -muistin sisällöstä. Sanotaan, että muutamme neljä tavua salatusta flash-kopiosta nolliksi. Kuinka odottaisimme keskus- muistin sisällön muuttuvan jos, esimerkiksi, 16 tavua keskusmuistista muuttuisi. Tämä tarkoittaisi, että käytössä on ehkä salausalgoritmi kuten AES ECB-moodissa (Electronic Codebook). Koska jos se on lohko- pohjainen salaus ja me muutamme 4 salattua tavua, koko puretun lohkon eli 16 tavun pitäisi muuttua. Toinen mahdollisuus on, että muutamme 4 tavua flash-muistissa ja kaikki niitä seuraava data muuttuisi. Tässä tapauksessa käytössä olisi ehkä AES CBC-moodissa (Chaining Cipher). Kuitenkin jos muutamme 4 tavua flash- muistissa ja vain 4 tavua muuttuu keskusmuistissa, käytössä on ehkä AES CTR-moodissa (Counter). Ja ymmärtääksesi tämän, otetaan parempi näkymä siihen miten AES toimii CTR-moodissa. Se ottaa salaamattoman tiedon ja XOR:aa sen AES-salausvirran kanssa, joka on generoitu avaimella, noncella ja Counter-algoritmilla. Se AES-virta, jolla tietosi XOR:ataan, on aina sama jos avain ja nonce ovat samat. Tämän takia on huipputärkeää, että käyttäessäsi AES-CTR:ää, valitset aina uniikin noncen jokaiseen salaukseen. Jos käytät samaa noncea kahdesti samankaltaisen datan salaamiseen, lopputulos näyttää samalta. Salaamaton data XOR:ataan AES-CTR -virralla ja niin saamme salatun datan. Jos tiedämme mitä salaamaton data oli, eli keskusmuistiin ladattu ROM-tiedosto, ja meillä on se salattu koodi, eli flash-muistin kopio, voimme suorittaa käänteisen operaation. Lopputuloksena meillä on AES-CTR -virta, jolla flash-muisti salakirjoitettiin. Ja tämä tarkoittaa, että voimme ottaa ROM-tiedoston, XOR:ata sen juuri selvittämällämme AES-CTR -virralla ja generoida oman salatun flash-kopiomme, esimerkiksi muunnellun ROM:in. Joten kirjoitin muutamia Python-skriptejä kokeillakseni tätä. Ja jonkun ajan kuluttua minulla oli hakkeroitu Super Mario Brothers alkuperäisen sijasta. Jeejee, hakkeroimme Nintendo Game & Watchin päivää ennen virallista julkistusta. Ja voimme asentaa muokattuja Super Mario Brothers ROM:eja. Löydät käyttämäni skriptit GitHubistani. Ne ovat tallennustilassa nimeltään "Game & Watch Hacking". Olin todella innoissani, koska olin onnistunut ja olin murtanut Nintendon konsolin päivää ennen virallista julkistusta. Valitettavasti läpäistyäni kentän, Toad ei ollut yhtä innostunut. Hän kertoi minulle, että valitettavasti laiteohjelmisto oli yhä toisessa linnassa. Niinpä heti maanantaina yhdistin voimani Konrad Beckmannin kanssa. Hän on hakkeri Ruotsista. Tutustuimme tapahtumassa. Me aloimme keskustelemaan ja heittelemään ideoita puolin ja toisin. Lopulta me huomasimme, että keskusmuistissa on erikoisalue nimeltään ITCM-RAM. Se on kiinteässä yhteydessä keskusmuistiin, jota käytetään normaalisti korkean suoritus- kyvyn rutiineihin, kuten keskeytysten käsittelijöihin. Se on hyvin nopea alue. Me käsitimme ettemme ole koskaan tarkastelleet ITCM-muistialueen sisältöä. Joten me otimme siitä kopion käyttäen debuggausporttia. Ja kävi ilmi, että tämä ITCM-muistialue pitää sisällään ARM-koodia. Joten edelleen kysymys on: mistä tämä ARM-koodi tulee? Tuleeko se ulkoisesta flash-muistista, kuten NES-ROM? Minä toistin toimenpiteen, jonka teimme NES-ROM:ille. Laitoin nollia salatun flash-muistin alkuun, käynnistin laitteen ja otin kopion ITCM-muistialueesta. Olin onnekas heti ensimmäisellä yrittämällä, koska ITCM:n sisältö muuttui. Koska ITCM:ssä on koodia, ei dataa. Aiemmin meillä oli ollut vain NES ROM, joka oli vain dataa, mutta nyt meillä koodia. Se tarkoitti, että samalla XOR- kikalla, jota käytimme aiemmin, voisimme laittaa ulkoiseen flash-muistiin koodia, joka sitten ladattaisiin keskusmuistiin laitteen käynnistyessä. Ja koska se on pysyvä menetelmä, voimme buutata laitteen ja ajaa sitä ilman debuggeria. Mikä tahansa koodi, jonka me latasimme tälle ITCM-alueelle pystyi lukemaan flash-muistia. Ja me ehkä voisimme kirjoittaa koodia jota laite- ohjelmisto jotenkin kutsuisi ja kopioisi sen keskusmuistiin, josta me voisimme hakea sen debuggerilla. Ongelma vain oli, että jos meillä on oma pätkä koodia tällä ITCM-alueella, me emme tiedä mistä osoiteesta ITCM:ssä ajetaan koodia. Emme tiedä hyppääkö laiteohjelmisto muistipaikkaan 0 vai 200 vai mihin. Mutta on olemassa yksinkertainen kikka oman koodinpätkän rakentamiseen, Se on nimeltään NOP-liuku. NOP, eli No OPeration, on prosssorille annettava käsky joka ei tee mitään. Ja jos me täytämme suurimman osan ITCM-muistista NOP-käskyillä ja sijoitamme oman koodimme niiden perään, me saamme aikaan NOP-liu'un. Ja kun prosessori, jota kuvaa Mario, hyppää satunnaiseen osoitteeseen tuossa liu'ussa, se ryhtyy suorittamaan NOP-käskyjä kunnes kohtaa koodimme ja suorittaa sen. Näin vaikka Mario hyppää keskelle NOP-liukua, hän päätyy aina meidän koodiimme. Konrad kirjoitti tämän todella yksinkertaisen koodin, jossa on ainoastaan noin 10 käskyä, jotka ainoastaan kopioivat sisäisen flash-muistin keskusmuistiin, josta me voimme hakea sen debuggerilla. Jeejee, todella yksinkertainen häkkäys. Nyt meillä on kopio laiteohjelmistosta ja koko flash-muistista. Nyt voimmekin ronkkia koko laitetta. Olemme julkaisseet työkalut, joilla sinä voit tehdä saman. Jos haluat varmuuskopoida Nintendo Game & Watchin, voit mennä GitHubiini ja ladata "Game & Watch backup" -säilön, jossa on paljon tietoa varmuuskopion tekemisestä. Se tekee tarkistuksen ja varmistaa tekemättä laitteestasi tiiliskiveä, että voit helposti tehdä varmuuskopion laiteohjelmistosta, asentaa harrastelijaohjelmoijien koodia, ja kuitenkin palauttamaan alkuperäisen. Meillä on mahtava tukiyhteisö Discordissa. Jos ikinä tarvitse apua, luulen että sitä löytyy sieltä. Toistaiseksi meillä ei ole vielä yhtään tiiliskiveksi muuttunutta Game & Watchia, joten koodi näyttää vakaalta. Olin hyvin innoissani, että tämä haaste oli nyt ohi. Vai oliko se? Jos joskus väität netissä murtaneesi onnistuneesti sulautetun laitteen, siihen on tasan yksi vastaus: mutta voiko sillä ajaa Doomia? Kirjaimellisesti saamani Twitter-viestit, YouTube-kommentit, jopa ystäväni spämmäsivät minua haasteella saada Doom toimimaan laitteessa. Mutta sitä varten meidän pitäisi selvittää koko laitteen salat. Meidän pitäisi luoda tapa kehittää omia ohjelmistoja ja ladata niitä laitteeseen. Onneksi useimmat komponentit olivat hyvin dokumentoituja ja siellä ei ollut mitään vaitiolovelvollisuuden alaisia komponentteja. Esimerkiksi prosessorista on avoin käsikirja ja kirjasto. Flash-muistisiru on hyvin tunnettu. Ja niin pois päin. Siellä on vain pari tarkoitukseen suunniteltua komponenttia. Esimerkiksi laitteen LCD on tarkoitukseen suunniteltu ja jouduimme tutkimaan SPI-väylässä näytölle menevää liikennettä saadaksemme selville mm. miten näyttö alustetaan. Jonkin ajan kuluttua meillä oli täysi laitteisto käytössä. Oli tuki LCD:lle, audiolle, unitilalle, napeille ja vieläpä työkalut, joilla pystyit SWD- debuggeria käyttäen kopioimaan ja uudelleenkirjoittamaan ulkoisen flash- muistin. Kaikki löytyy GitHubistamme. Jos haluat nyt muokata omaa Game & Watchiasi, kaikki mitä tarvitset on debuggaussovitin, kuten 3 dollaria maksava ST-link tai J-Link. Tai oikea ST-Link. Ja sitten voitkin aloittaa. Olemme julkaisseet projektipohjan, jolla kuka tahansa haluava voi aloittaa kehittämään omia pelejään Game & Watchille. Se on yksinkertaista. On kuvapuskuri, johon voit kirjoittaa. Kontrollit ovat yksinkertaisia jne. Ja kuten sanoin, meillä on todella avulias yhteisö. Nyt kun meillä oli koko laitteisto hallussa, voin viimein työstää Doomia. Aloitin tutkimalla muita Doomin sovituksia STM32:lle. Ja löysin nimimerkin floppes kirjoittaman stm3doomin. Ongelma oli, että stm32doom on suunniteltu laitteelle, jossa on 8 megatavua keskusmuistia ja Doomin vaatimat tiedostot ulkoisella USB- asemalla. Tässä oli vain 1,3 MB keskus- muistia, 128 kB flash-muistia ja 1 MB ulkoista flash-muistia. Meidän pitäisi mahduttaa siihen kaikki kentät, koodi ja niin edelleen. Doomin kenttätieto on tallennettu nk. WAD-tiedostoihin (WAD = Where's All my Data). Näissä tiedostoissa on spritet, tekstuurit, kentät jne. WAD Doom 1:lle on noin 4 megatavua kooltaan ja WAD Doom 2:lle on 40 megatavua kooltaan. Mutta meillä on vain 1,1 megatavua tilaa. Lisäksi meidän on mahdutettava koodikin sinne. Joten ilmeisesti meidän on löydettävä joku tosi pieni Doom-sovitus. Ja kuten selvisi, on olemassa Mini-WAD. Se on minimaalinen Doom, jonka WAD- tiedostosta on riisuttu kaikki hilavitkuttimet ja kaikki on korvattu yksinkertaisilla ääriviivoilla jne. Ja vaikka se ei olekaan nätti, olin aika varma, että saisin sen toimimaan, koska se tarvitsee vain 250 kilotavua 40 megatavun sijasta. Lisäksi aika monta asiaa Chocolate Doom -sovituksesta piti muuttaa. Esimerkiksi minun piti poistaa kaikki tiedostoja käsittelevä koodi ja korvata se omallani. Minun piti myös lisätä tuki Game & Watchin LCD:lle ja napeille. Minun piti hankkiutua eroon monesta asiasta saadakseni sen toimimaan suht' sujuvasti. Esimerkiksi pahamainen pyyhkimisefekti oli pakko tiputtaa, kuten myös äänet. Seuraava ongelma oli, että kun sitä käännettiin, se ei mahtunut keskusmuistiin ja kaatuili kaiken aikaa. Laitteella on noin 1,3 megatavua keskusmuistia eri alueilla. Ja esimerkiksi kuvapuskuri, jota selvästi tarvitsemme, vie siitä 154 kilotavua. Sitten meillä on 160 kilotavua alustettua dataa, 320 kilotavua alustamatonta dataa ja tonneittain dynaamisia varauksia, joita Chocolate Doom tekee. Ja nämä dynaamiset varaukset olivat iso ongelma, koska Chocolate Doomin lähdekoodi tekee paljon pieniä varauksia, joita käytetään väliaikaiseen tiedonvarastointiin kunnes ne vapautetaan. Dynaaminen muisti fragmentoituu pahasti äkkiä. Lopulta siellä ei ole yhtään tilaa jäljellä esimerkiksi kentän alustamiseen. Ja korjatakseni tämän otin Chocolate Doomin lähdekoodin ja muutin paljon dynaamisia varauksia staattisiksi varauksiksi, josta seurasi se iso etu, että kääntäjän virheilmoitukset tekivät enemmän järkeä. Koska se kertoi sinulle: "hei, tämä ja tämä data ei mahdu keskusmuistiin". Lopulta useiden yritysten ja erehdysten sekä kopioituani mahdollisimman monta alkuperäistä resurssia Mini-WAD:iin, sain se toimimaan. Minulla oli Doom, joka toimi tässä Game & Watch -laitteessa ja toivottavasti rauhoitti Internetin jumalat, jotka pakottivat minut tekemään sen. Valitettavasti USB-portti ei ole fyysisesti kytketty prosessoriin ja siten ei ole mahdollista hakkeroida laitetta liittämällä se tietokoneeseen. Kuitenkin on aika helppo tehdä tämä käyttäen jotain näistä USB-debuggereista. Eniten toivottu ohjelmistotyyppi oli selkeästi emulaattorit. Ja olen ylpeä sanoessani, että tällä hetkellä meillä on suurehko kokoelma emulaattoreita, jotka toimivat Nintendo Game & Watchilla. Ja se alkoi Konrad Beckmannin aloittamasta Retro Go -projektista, joka on kokoelma emulaattoreita laitteelle nimeltä Odroid Go. Odroid Go on pieni kannettava laite, jossa on samanlaiset kontrollit ja kokorajoitukset kuin Game & Watchissa. Se oli aika siistiä sovittaa tätä koodia, koska se raskas työ oli jo tehty. Retro Go sisältää emulaattorit NES:ille, Gameboylle, Gameboy Colorille, jopa Sega Master Systemille ja Sega Game Gearille. Pari päivää myöhemmin Konrad pystyi esittelemään NES-emulaattoriaan ajamassa Zeldaa ja muita pelejä, kuten Contraa, Nintendo Game & Watchilla. Tämä on superhauskaa. Aluksi meillä oli vain perusemulaattori, jolla pystyi hädintuskin pelaamaan ja se tiputti frameja. Meillä ei ollut nättiä skaalausta, VSynciä jne. Mutta nyt useamman viikon jälkeen se on aika kiva laite käyttää ja pelata. Meillä on myös Gameboy-emulaattori, jolla voit pelata Gameboy-suosikkejasi, kuten Pokémonia, Super Mario Landia jne. Nintendo Game & Watchilla jos sinulla vain sattui ROM:ien varmuuskopiot. Me kokeilimme erilaisia skaalaus- algoritmeja hyödyntääkseemme näyttöä. Sinä voit vaihtaa käytettyä skaalausalgoritmia omien mieltymystesi mukaan. Voit vaihtaa jopa väripalettia peleille. Meillä on kiva peli- valikko, joka antaa sinun pitää laitteella useampia ROM:eja ja vaihtaa niiden välillä. Meillä on tuki tilan tallentamiselle, joten laite tallentaa edistymisesi vaikka sammuttaisit lalitteen ja voit jatkaa peliäsi vaikka akku tyhjenisi. Löydät lähdekoodin kaikkeen tämän Konradin Retro Go -GitHub-säilöstä. Ja se todella mahtavaa. Muut ihmiset kehittävät esimerkiksi emulaattorin CHIP-8:lle ja siinä on kiva kokoelma pieniä arcade-pelejä ja se on todella kivaa ja helppoa kehittää lisää sitä käyttäen. Joten kokeile sitä jos sinulla on Game & Watch ja omatekoiset ohjelmat kiinnostavat. Tim Schuerwegen jopa työstää emulaattoria alkuperäisille Game & Watch -peleille. Tämä on todella siistiä, koska se tekee Nintendo Game & Watchista emulaattorin kaikille koskaan julkaistuille Game & Watch -peleille. Ja mikä on todella mahtavaa minusta on se miten yhteisö syntyi. Me olemme aika avoimia kehityksestämme Twitterissä ja Konrad striimaa Twitchissä edistymisestään. Me avasimme Discord- kanavan, jolle laitteen hakkeroinnista kiinnostuneet ihmiset voivat liittyä. Ja oli mahtavaa nähdä mitä yhteisö sai aikaan. Esimerkiksi nyt meillä on toimivat tallennuspäivitys, joka toimii sekä omatekoisten ohjelmien että virallisen laiteohjelmiston kanssa. Yhden megatavun tallennustilan sijaan voit saada 60 megatavua flash-muistia. Sitä varten sinun on korvattava vain yksi ainoa siru. Se on aika helppo tehdä. Raudan täydellistä ymmärtämistä varten Daniel Cuthbert ja Daniel Padilla ovat toimittaneet korkean resoluution röntgen- kuvat, joista näkyy jokainen kytkentä, jopa PGA-osien. Mitään ei tarvitse juottaa irti. Sitten Jake Little Upcycle Electronicsista jäljitti kuvista ja yleismittarilla piirilevyn kaavion. Hän jopa loi piirrustukset, joista selviää kaikki yksityiskohdat, joita tarvitset kun haluat ohjelmoida jotain. Se oli todella hauskaa. Sander van der Wel esimerkiksi on luonut oman piirilevynsä ja nyt on jopa projekteja, joissa pyritään korvaamaan alkuperäinen piirilevy piirilevyllä, jossa on FPGA ja ESP32. Joten on todella jännä nähdä mitä ihmiset saavat aikaan. Toivottavasti nautit tästä esityksestä ja minä toivon, että näen sinut Discordissa jos haluat liittyä hauskanpitoon. Ja kiitos kun olit mukana. Herald: Hei. Vau, se oli todella uskomaton esitys. Kiitos paljon, Thomas. Kuten ilmoitimme alussa, otamme vastaan kysymyksiä teiltä ja meillä onkin niitä jo muutama. Katsotaan saammeko käytyä ne kaikki läpi. Ensimmäinen on: luitko artikkeleita Nintendosta tarkkailemassa hakkereita? Yksityis- etsiviä ja sellaista. Oletko mitenkään huolissasi tälläisesta? Thomas: Voi, mitä minun kameralleni tapahtuu? Näyttää siltä kuin Luigi olisi sekoillut asetusteni kanssa. Joo, olen lukenut nuo artikkelit, mutta tässä tapauksessa ei ole piratismi- ongelmaa, eihän? En anna kenenkään pelata uusia pelejä. Jos haluaisit kopioida Super Mario ROM:in, sinun olisi pitänyt tehdä se 30 vuotta sitten, NES Classicilla tai Switchillä tai jollain niistä sadoista Nintendon siinä välissä julkaisemista konsoleista. Joten en ole erityisen huolissani asiasta. H: Luulen myös, että kohdeyleisön näkökulma näkyy täällä. Seuraavaan kysymykseen, joka on: luuletko, että on olemassa syy siihen miksi ulkoista flash-sirua käytetään? Thomas: Jep. STM32H7B0:n sisäinen flash-muisti on suht' pieni. Se on vain 128 kilotavua. Ja he eivät olisi mahduttaneet kaikkea sille, ei edes kuvapuskuria. Jopa kuvapuskurin kuva on suurempi kuin sisäinen flash-muisti. Luulen, että se on syy ja olen tyytyväinen, että he tekivät niin. H: Aivan. Onko salauksen purku tehty koodilla vai onko se mikrokontrollerin ominaisuus? T: Mikrokontrollerissa on integroitu ominaisuus nimeltään OFT-DEC. Flash-muisti on suoraan mapattu muistiin ja sirussa on tämä OTF DEC -esitäyttö, joka tarjoaa automaattisesti salakirjoituksen purun. Se tehdään kaikki raudalla ja voit jopa hakea salausavaimet sieltä raudasta. Herald: OK, näppärää. Ja myös seuraava kysymys liittyy siihen: onko mielestäsi Nintendon käyttämä salaus siihen käytetyn vaivan arvoinen? Ikään kuin se olisi siellä antaakseen valheellista turvallisuudentunnetta. Mitä sinä ajattelet siitä? T: Ajattelen omasta näkökulmastani, että he valitsivat oikean salauksen, koska sitä oli hauskaa takaisinmallintaa ja yrittää ohittaa. Se oli mahtava haaste ja ajattelen, että he tekivät kaiken oikein. Mutta ajattelen myös, että loppupeleissä se on yksinkertainen laite ja jos katsot mitä ihmiset rakentavat sen päälle - pelejä ja kaikkea muuta - ajattelen, että he tekivät kaiken oikein. Luultavasti se oli vain rutiinijuttu heille. "OK, me lukittiin JTAG." Jep, mutta luulen että se on hauskaa, koska e ei avaa piratismiongelmaa. H: Jep. Yksi juttu liittyy NOP- liukuun, jonka havainnollistit todella hyvin. Eikö aliohjelmien alut olisivat olleet sopivia myös tämän tavoitteen saavuttamiseen? Kysyjä sanoo, että rekisterien tallettamiseen liittyvät komennot ovat aika tunnistettavia. Kuinka... Jep. T: Joo, todellakin. Datan löytämiseen ITCM-muistista ja sen hyväksikäyttöön meni alle tunti aikaa. Joten jos me olisimme yrittäneet takaisinmallintaa koodia, se olisi ollut enemmän työtä. Täysin mahdollista eikä edes vaikeaa, mutta keskusmuistin täyttäminen NOP-käskyillä vei vain pari minuuttia ja oli sekä helpoin että nopein tapa edetä ilman Ghidraa. H: OK, siistiä, kiitos. Ja tämä on enemmän kommentti kuin kysymys. Hän sanoo, että on outoa ettei ST:n AN5281 mainitse kertaakaan, että dataa ei verifioida salauksen aikana. Minusta se on enemmän virhe ST:n kuin Nintendon puolelta. Mitä ajattelet tästä? Thomas: Joo, minä olen jokseeenkin samaa mieltä tästä. Vaikka sinulla ei olisi JTAG:ia, ARM:n Thumb-käsky on 2-4 tavua ja olisi aika pieni tila bruteforcettaa mahdollisesti mielenkiintoinen haarautumiskomento. Joten luulen, että se ei ole täydellistä, mutta verifiointi on aika kallista laskentamielessä ja minusta laiteohjelmiston pitäisi verifioida ulkoisen flash-muistin sisältö. H: OK, luulen, että kysymme vielä kaksi kysymystä ennen kuin palaamme studioon. Kysymys AES- salausavaimista... Saitteko niitä haltuunne? Thomas: Kyllä saimme. Mutta se on ST:n sovellus, ja he tekevät jotain hullua shiftausta avaimille, mutta luulen, että juuri tänään, vain tunti ennen tätä esitystä yksi äijä... Sori, en tiedä, onko kyseessä äijä... Henkilö Discordissa rakensi uudelleen salauksen. Mutta me, minä henkilökohtaisesti en ollut ikinä kiinnostunut siitä, koska kun olet laskenut laitteen RTP-tasolle 0, voit lukea mapatun flash-muistin ja saada salaamattoman sisällön haltuusi. H: Aivan, kiitos. Ja viimeinen kysymys LCD-kontrollerista. Käytetäänkö sitä kirjoittamalla pikseleitä SPI:n yli vai onko siinä jotain ominaisuuksia, ehkä jopa tausta tai spritejä tai jotain sellaista? T: LCD:ssä itsessään ei ole mitään erikoisominaisuuksia. Siinä on SPI-väylä konfigurointiin ja sitten siinä on rinnakaisliitäntä - joten se tarvitsee paljon pinnejä. Mutta siru itsessään sisältää LTDC:n, joka on LCD-kontrolleri, joka tarjoaa kaksi tasoa alfasekoituksella ja jotain perusikkunointia yms. H: OK, siistiä ja kiitos todella, todella paljon hienosta esityksestä ja hienosta introsta. Ja nyt palaamme päästudioomme kiertoradalle. Kiitos todella paljon. Takaisin kiertoradalle. rC3-loppumusiikkia Subtitles created by c3subtitles.de in the year 2020. Join, and help us! Translated by Markus Aurala (KYBS2004 course assignment at JYU.FI)