1. A breve aggiorneremo la piattaforma di Reboot per risolvere alcuni problemi con i plug-in, quindi chiediamo ancora un po' di pazienza, Lo staff di Reboot

LE PROTEZIONI NELLE CONSOLES - NINTENDO GB/SuperGB/GBC

Discussione in 'Gameboy / Gameboy color' iniziata da student, 11 Ago 2017.

  1. student

    student Staff Livello 43 Staff

    Iscritto:
    30 Ago 2015
    Messaggi:
    4.464
    Like ricevuti:
    4.570
    [​IMG]

    Chi non sa cosa sia un Game Boy alzi la mano ! Nessuno ? Bene, ne ero sicuro ! Cosi come sono sicuro che anche il Game Boy Color sia nella memoria di tutti !!

    Non tutti però sanno che il suo nome in codice era DMG-01 (1989-1990), mentre quello del Game Boy Color (1998) era CGB-01 :smile:

    In ogni caso le prime "piccole" e portatili di casa Nintendo sono di sicuro tra le più famose perle mai uscite nel mondo delle consoles ed anche loro non sono da meno rispetto alle "sorellone" riguardo i sistemi di protezione !

    Il Game Boy è infatti dotato di una BootROM che ritroviamo anche nel Game Boy Color (GBC) e nel Super Game Boy (cartuccia-adattatore per giocare ai giochi GB su Super Nintendo).
    [​IMG]


    LA PROTEZIONE DELLE PRIME PORTATILI NINTENDO

    La BootROM di cui è dotato l'hardware di GB, GBC e SGB è di 256bytes ed ha 3 particolari caratteristiche di "protezione":

    1 - viene esclusa dalla lettura con l'ultima istruzione del suo codice (questo "lock out" forse non è stato voluto ma si è probabilmente reso necessario per motivi legati alle (scarse) risorse di sistema; riassumendo la BootROM viene mappata in memoria dall'offest 0x0000 all'offset 0x00FF (256bytes) e gli ultimi 2 bytes rappresentano una istruzione che scrive in un registro speciale () bloccando tale indirizzo di memoria dalla lettura cosicchè tutte le istruzioni successive (che sono, a partire dall'offset 0x0100, quelle contenute nella cartuccia) non possano leggerla;

    2 - al suo interno contiene del codice che prima legge i 48 bytes del logo NINTENDO presenti nella cartuccia (offsets che vanno da 0x104 a 0x133 di ogni cartuccia):
    [​IMG]
    e li mostra a schermo facendo scorrere la scritta:
    [​IMG]
    dopodichè li confronta con quelli memorizzati nella BootROM: se sono diversi la console si blocca.
    Il fatto di leggere il logo direttamente dalla cartuccia spiega il perchè, se accendete un Game Boy senza inserire alcun gioco, appare questo rettangolo nero (i bytes del logo sono tutti ad FF):

    Per una full description di come funzionano i bytes del logo vi rimando a questo meraviglioso articolo.

    3 - un secondo controllo effettuato dopo quello del logo è quello di sommare i valori che vanno dall'offset 0x0134 a 0x014C ed aggiungere poi il valore presente in 0x014D: se la somma è zero il programma continua altrimenti la console si blocca !

    Ecco uno screenshot di una ROM GB a caso dove potete verificare gli offsets menzionati:
    [​IMG]

    Questa protezione si rese necessaria per evitare che altri sviluppatori producessero software non licenziato da Nintendo; come nota a margine c'è da dire che la SEGA successivamente tento'lo stesso approccio con il Genesis ma la sua causa contro la Accolade non andò come previsto.


    COME BYPASSARE LA PROTEZIONE

    Il contenuto di questo mini-sistema operativo rimase un mistero fino al 2003 quando il coder Neviksti effettuo'un suo decapping (leggi QUESTO ARTICOLO per capire di cosa si tratti) e lesse "a mano" il suo contenuto bit per bit (256x8 = 2048 bits totali) dopo averli fotografati tramite un microscopio; eccoli qui sotto in tutto il loro micro-splendore:
    [​IMG]
    ogni "pallino" rappresenta un bit 1, l'assenza del pallino rappresenta un bit 0 ! I pallini non sono altro che le cariche elettriche memorizzate nelle celle di memoria !!!
    Eccovene un esempio ancora più zoomato ottenuto dal decap di un altro chip "visto" al microscopio elettronico (non ha nulla a che fare con le consoles):
    [​IMG]
    Ecco un esempio di come vengono lette manualmente le cariche elettriche:
    [​IMG]
    Incredibile vero ?!?!?!

    Una volta convertiti in bytes e successivamente in ASM il codice (commentato) della BootROM appare essere il seguente:
    Codice:
    LD SP,$fffe ; $0000 Setup Stack
    
    XOR A ; $0003 Zero the memory from $8000-$9FFF (VRAM)
    LD HL,$9fff ; $0004
    Addr_0007:
    LD (HL-),A ; $0007
    BIT 7,H ; $0008
    JR NZ, Addr_0007 ; $000a
    
    LD HL,$ff26 ; $000c Setup Audio
    LD C,$11 ; $000f
    LD A,$80 ; $0011
    LD (HL-),A ; $0013
    LD ($FF00+C),A ; $0014
    INC C ; $0015
    LD A,$f3 ; $0016
    LD ($FF00+C),A ; $0018
    LD (HL-),A ; $0019
    LD A,$77 ; $001a
    LD (HL),A ; $001c
    
    LD A,$fc ; $001d Setup BG palette
    LD ($FF00+$47),A ; $001f
    
    LD DE,$0104 ; $0021 Convert and load logo data from cart into Video RAM
    LD HL,$8010 ; $0024
    Addr_0027:
    LD A,(DE) ; $0027
    CALL $0095 ; $0028
    CALL $0096 ; $002b
    INC DE ; $002e
    LD A,E ; $002f
    CP $34 ; $0030
    JR NZ, Addr_0027 ; $0032
    
    LD DE,$00d8 ; $0034 Load 8 additional bytes into Video RAM
    LD B,$08 ; $0037
    Addr_0039:
    LD A,(DE) ; $0039
    INC DE ; $003a
    LD (HL+),A ; $003b
    INC HL ; $003c
    DEC B ; $003d
    JR NZ, Addr_0039 ; $003e
    
    LD A,$19 ; $0040 Setup background tilemap
    LD ($9910),A ; $0042
    LD HL,$992f ; $0045
    Addr_0048:
    LD C,$0c ; $0048
    Addr_004A:
    DEC A ; $004a
    JR Z, Addr_0055 ; $004b
    LD (HL-),A ; $004d
    DEC C ; $004e
    JR NZ, Addr_004A ; $004f
    LD L,$0f ; $0051
    JR Addr_0048 ; $0053
    
    ; === Scroll logo on screen, and play logo sound===
    
    Addr_0055:
    LD H,A ; $0055 Initialize scroll count, H=0
    LD A,$64 ; $0056
    LD D,A ; $0058 set loop count, D=$64
    LD ($FF00+$42),A ; $0059 Set vertical scroll register
    LD A,$91 ; $005b
    LD ($FF00+$40),A ; $005d Turn on LCD, showing Background
    INC B ; $005f Set B=1
    Addr_0060:
    LD E,$02 ; $0060
    Addr_0062:
    LD C,$0c ; $0062
    Addr_0064:
    LD A,($FF00+$44) ; $0064 wait for screen frame
    CP $90 ; $0066
    JR NZ, Addr_0064 ; $0068
    DEC C ; $006a
    JR NZ, Addr_0064 ; $006b
    DEC E ; $006d
    JR NZ, Addr_0062 ; $006e
    
    LD C,$13 ; $0070
    INC H ; $0072 increment scroll count
    LD A,H ; $0073
    LD E,$83 ; $0074
    CP $62 ; $0076 $62 counts in, play sound #1
    JR Z, Addr_0080 ; $0078
    LD E,$c1 ; $007a
    CP $64 ; $007c
    JR NZ, Addr_0086 ; $007e $64 counts in, play sound #2
    Addr_0080:
    LD A,E ; $0080 play sound
    LD ($FF00+C),A ; $0081
    INC C ; $0082
    LD A,$87 ; $0083
    LD ($FF00+C),A ; $0085
    Addr_0086:
    LD A,($FF00+$42) ; $0086
    SUB B ; $0088
    LD ($FF00+$42),A ; $0089 scroll logo up if B=1
    DEC D ; $008b
    JR NZ, Addr_0060 ; $008c
    
    DEC B ; $008e set B=0 first time
    JR NZ, Addr_00E0 ; $008f … next time, cause jump to "Nintendo Logo check"
    
    LD D,$20 ; $0091 use scrolling loop to pause
    JR Addr_0060 ; $0093
    
    ; ==== Graphic routine ====
    
    LD C,A ; $0095 "Double up" all the bits of the graphics data
    LD B,$04 ; $0096 and store in Video RAM
    Addr_0098:
    PUSH BC ; $0098
    RL C ; $0099
    RLA ; $009b
    POP BC ; $009c
    RL C ; $009d
    RLA ; $009f
    DEC B ; $00a0
    JR NZ, Addr_0098 ; $00a1
    LD (HL+),A ; $00a3
    INC HL ; $00a4
    LD (HL+),A ; $00a5
    INC HL ; $00a6
    RET ; $00a7
    
    Addr_00A8:
    ;Nintendo Logo
    .DB $CE,$ED,$66,$66,$CC,$0D,$00,$0B,$03,$73,$00,$83,$00,$0C,$00,$0D
    .DB $00,$08,$11,$1F,$88,$89,$00,$0E,$DC,$CC,$6E,$E6,$DD,$DD,$D9,$99
    .DB $BB,$BB,$67,$63,$6E,$0E,$EC,$CC,$DD,$DC,$99,$9F,$BB,$B9,$33,$3E
    
    Addr_00D8:
    ;More video data
    .DB $3C,$42,$B9,$A5,$B9,$A5,$42,$3C
    
    ; ===== Nintendo logo comparison routine =====
    
    Addr_00E0:
    LD HL,$0104 ; $00e0 ; point HL to Nintendo logo in cart
    LD DE,$00a8 ; $00e3 ; point DE to Nintendo logo in DMG rom
    
    Addr_00E6:
    LD A,(DE) ; $00e6
    INC DE ; $00e7
    CP (HL) ; $00e8 ;compare logo data in cart to DMG rom
    JR NZ,$fe ; $00e9 ;if not a match, lock up here
    INC HL ; $00eb
    LD A,L ; $00ec
    CP $34 ; $00ed ;do this for $30 bytes
    JR NZ, Addr_00E6 ; $00ef
    
    LD B,$19 ; $00f1
    LD A,B ; $00f3
    Addr_00F4:
    ADD (HL) ; $00f4
    INC HL ; $00f5
    DEC B ; $00f6
    JR NZ, Addr_00F4 ; $00f7
    ADD (HL) ; $00f9
    JR NZ,$fe ; $00fa ; if $19 + bytes from $0134-$014D don't add to $00
    ; … lock up
    
    LD A,$01 ; $00fc
    LD ($FF00+$50),A ; $00fe ;turn off DMG rom
    

    Nel 2009 un altro reverser (Costis Sideris) riuscì a dumpare la BootROMdel Super Game Boy utilizzando, tramite un FPGA, un glitch hardware che disabilitava l'ultima istruzione di disabilitazione della memoria dove era salvata la copia della BootROM grazie all'invio di impulsi overclockati riuscendo così a dumpare il codice dall'offset 0x0000 all'offset 0x00FF con dello specifico codice inserito dall'offset 0x0100 in poi. Ecco una foto del "semplice" sistema utilizzato:
    [​IMG]
    Esaminando il codice di questa BootROM si è scoperto che, se il secondo checksum della sommatoria che deve essere uguale a 0 è diverso da 0, la cartuccia-adattatore non disabilita la cartuccia di gioco ma lo fa il Super Nintendo vero e proprio.
    Sempre Costis Sideris e sempre nel 2009 riuscì a dumpare anche la BootROM del Game Boy Color utilizzando una combinazione di glitch questa volta sia di clock che di alimentazione con un FPGA. In questo dump si è accorto che il check del logo avveniva solamente per la prima metà dei bytes e non di tutti e 48. Assieme ad essa riuscì a dumpare il contenuto di una seconda ROM di 1792 bytes presente in questa console. Dr. Decapitator (alias Christopher Tarnovsky) tentò un parziale decapping identificando addirittura 3 ROMs (256, 1792 e 512 bytes) ma di quella da 512 non è stato ottenuto alcun dump (è possibile che contenga il microcodice della CPU oppure qualcosa legato al LCD).

    Segreti violati dopo più di un decennio; inoltre nel 2012 è scaduto anche il brevetto che descrive le funzioni della BootROM a confermare quanto scoperto dai reverse engineers :wink:

    Una volta scoperto il funzionamento della BootROM alcuni sviluppatori si sono ingegnati per far si che il Game Boy leggesse un logo custom dalla cartuccia al solito offset (prima fase che permette la visualizzazione del logo) ma poi verificasse un secondo logo (quello ufficiale) memorizzato ad un altro offset della cartuccia.
    I risultati sono i seguenti:

    Il sistema utilizzato per visualizzare un logo personalizzato è certamente possibile utilizzando delle cartucce con processori dedicati (es. le flash cartiridges), non credo sia possibile visualizzarli su un Game Boy reale proprio a causa del sistema di protezione che risiede in una ROM.

    Potete trovare una bella descrizione delle varie tipologie di loghi custom prodotti da alcuni sviluppatori QUI ed ulteriori informazioni sulle BootROM (compresa quella trovata in una cartuccia prototipo di Pokemon Stadium per Nintendo 64 mancante nella release ufficiale della stessa) qui.

    Altre informazioni sulla BootROM del GBC le potete leggere qui.

    Potrebbe inoltre interessarvi QUESTO ARTICOLO che spiega anche come venivano dumpate cartucce e dischi :smile:



    Next time we will go "advance" :smile:
     
    #1
    Ultima modifica: 27 Ago 2017
    A lokiu.ox, Kenny~, nastys e 8 altri utenti piace questo elemento.
  2. iostream

    iostream Phoenix Wright

    Iscritto:
    13 Ago 2016
    Messaggi:
    4.900
    Like ricevuti:
    1.623
    Grande! Una domandina, non capito bene come funziona il sistema Lockout. La bootrom da game boy come veniva letto se c'era questo blocco? Non poteva essere bypassato capendo cosa faceva il gbc all'avvio e poi mettendo codice per lo z80 (mi pare che il game boy usasse questa cpu)?
     
    #2
  3. marcyvee

    marcyvee Intellettuanale

    Iscritto:
    24 Dic 2015
    Messaggi:
    1.972
    Like ricevuti:
    542
    Io avrei delle domande anche parecchio banali, di cui mi vergogno anche un po.… Per esempio, cos'è un offset? Che ultimamente l'ho visto scritto parecchie volte.
    E poi, cos'è il decapping? Da quello che ho capito io è la copia fatta a mano di una ROM???? Cioè, qualcuno ha davvero fatto una roba simile per il gameboy? Quanto tempo ci sarà voluto?! Se quindi non ho capito male, non si potrebbe fare la stessa cosa su una console di ultima generazione come 3ds o switch? Che per avere il dump della bootrom, per la prima si sono dovuti fare un attrezzatura della madonna!! (mi pare eh)

    Ultima cosa, ma è più una pignoleria, ne sono consapevole: scrollare, probabilmente è l'italianizzazione del verbo to scroll, però in italiano ha un significato totalmente diverso... Non era meglio usare un pervio più appropriato -tipo calare - visto che il nostro dizionario ce lo permette?
     
    #3
  4. NoWar

    NoWar Livello 9

    Iscritto:
    12 Nov 2015
    Messaggi:
    239
    Like ricevuti:
    73
    Rispondo in modo del tutto intuitivo senza alcuna base... quindi Student poi darà la versione ufficiale

    Credo che per una questione di limitazione hardware e di spazio di indirizzazione in una prima fase gli indirizzi acedessero al bootrom, poi una volta eseguito venivano mappati in indirizzi su cartuccia o altro?

    Offset è l'indirizzo a cui si trova una instruzione/informazione all'interno del bytecode.
    Il decalpping consiste nell'aprire il package del chip, esporre l'interno (ad esempio la rom). Poi tramite microscopio elettronico sono state fotografate le celle di memoria e ricostruito bit per bit il contenuto...
    Ma non so quanto questa tecnica possa essere fattibile per console moderne e quanto il contenuto del bootrom sia utile (credo sia criptato sulle moderne console, ma parlo senza sapere ovvio)
     
    #4
    A marcyvee piace questo elemento.
  5. nodaorphen

    nodaorphen Livello 13

    Iscritto:
    23 Gen 2015
    Messaggi:
    499
    Like ricevuti:
    215
    mappare col microscopio??? Neviksti pazzo furioso:tearsofjoy::tearsofjoy::tearsofjoy:
    compimenti ancora una mascella caduta per student
     
    #5
  6. student

    student Staff Livello 43 Staff

    Iscritto:
    30 Ago 2015
    Messaggi:
    4.464
    Like ricevuti:
    4.570
    II "blocco" della BootROM non è reversibile in maniera ufficiale, sono riusciti a renderla ancora leggibile utilizzando degli exploit hardware via glitches (sono spiegati successivamente anche se non in perfetto dettaglio); ho comunque riformulato la parte del post cercando di spiegare meglio la questione. Sul perchè abbiano scelto di disabilitarlo non c'è una versione ufficiale, si sa che è cosi ma non è certo se questa funzione sia stata implementata proprio per scopi di protezione.

    Per quanto riguarda il decapping ho linkato un articolo proprio dove introduco la parola e... si, si puo'fare sia con il microscopio ottico sia con quello elettronico (SEM) ma sono tecniche estremamente dispendiose in termini di tempo/energia e richiedono strumenti potenzialmente molto costosi :smile:
    Il team fail0verflow ne ha uno di SEM :wink:
    Inoltre decappare mette in serio pericolo l'integrità del chip con buon rischio di renderlo inutilizzabile perchè va "aperto" e le tecniche per farlo sono piuttosto invasive ed alcune anche pericolose per l'uomo (utilizzo di acidi estremamente tossici).

    Sostituito il termine "scrollare" con un vocabolo italiano :smile:

    Gli offsets sono gli "indirizzi" di memoria e cioè le posizioni (in un file, in memoria, ecc) dove sono memorizzati i valori dei bytes.


    GRAZIE DEI FEEDBACK !
     
    #6
    Ultima modifica: 11 Ago 2017
    A marcyvee e iostream piace questo messaggio.
  7. iostream

    iostream Phoenix Wright

    Iscritto:
    13 Ago 2016
    Messaggi:
    4.900
    Like ricevuti:
    1.623
    Ora mi è più chiaro, viene prima copiato il contenuto della bootrom nella RAM e dopo viene bloccato il chip tramite un istruzione che va scrivere in un registro. Il sistema era molto semplice, ma grazie a questo dettaglio è stato molto difficile da hackerare
     
    #7
  8. student

    student Staff Livello 43 Staff

    Iscritto:
    30 Ago 2015
    Messaggi:
    4.464
    Like ricevuti:
    4.570
    Non viene bloccato il chip ma la sua copia in memoria dall'offset 0x0000 all'offset 0x00FF tramite la scrittura di un registro. Glitchando si evita la scrittura di questo registro quindi si puo'infilare del codice dall'offset 0x0100 in poi che sia in grado di dumparlo dalla memoria; ho riscritto questa parte più in basso nell'articolo, grazie ancora per gli spunti per migliorarlo :smile:
     
    #8
    A iostream piace questo elemento.
  9. MODD3R

    MODD3R Ospite

    Grande Student :smile:
     
    #9
    A student piace questo elemento.
  10. marcyvee

    marcyvee Intellettuanale

    Iscritto:
    24 Dic 2015
    Messaggi:
    1.972
    Like ricevuti:
    542
    Curiosità: il gameboy color quando veniva avviato senza cartuccia, mostrava il logo "gameboy" e poi non faceva più nulla. Questo significa che non aveva lo stesso sistema del gameboy originale oppure le protezioni erano le stesse ma soltanto il logo era caricato nella console e non nella cartuccia?
     
    #10
  11. student

    student Staff Livello 43 Staff

    Iscritto:
    30 Ago 2015
    Messaggi:
    4.464
    Like ricevuti:
    4.570
    Non posso verificare cio'che dici perchè non ho più un GBC ma il codice delle 2 BootROM è parzialmente diverso e quella del GBC è di 2304 bytes contro i 256 di quella GB quindi di sicuro è come dici tu, il logo è in quei bytes aggiuntivi.
     
    #11
    A marcyvee piace questo elemento.
  12. IlVampirelloXY

    IlVampirelloXY Livello 17

    Iscritto:
    3 Feb 2016
    Messaggi:
    754
    Like ricevuti:
    327
    Ancora uno splendito balzo nel passato.….
    Grazie Student...
    Perando di non andare troppo ot incollo quà la mia personale versione di hacking realizzata qualche anno fa per i miei GB seguendo le guide in calce compreso ovviamente il programmatore.…..( in questo momento non e' con me).

    20170811_183345[1].jpg
    20170811_183556[1].jpg
    http://www.reinerziegler.de/readplus.htm#MBC5_64
    Ciao Vamp.
     
    #12
    Ultima modifica: 11 Ago 2017
    A student piace questo elemento.
  13. student

    student Staff Livello 43 Staff

    Iscritto:
    30 Ago 2015
    Messaggi:
    4.464
    Like ricevuti:
    4.570
    Grande! Anche io avevo seguito quella guida anni fa :wink:
     
    #13
Sto caricando...

Condividi questa Pagina