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)