Ricerca puntatori

Aperto da addler, Settembre 25, 2008, 22:04:16

Discussione precedente - Discussione successiva

addler

Salve!
Ho un problema nel trovare i puntatori nelle rom gba.
In pratica in molte di esse i puntatori non sono standard, infatti usando il metodo
descritto in varie guida tra cui quella di Brisma non riesco a trovarli.
Vorrei sapere se esiste una procedura per trovare i puntatori e se qualcuno fosse
così gentile da spiegarmela.  

gufino2

Sinceramente non mi sono mai occupato di hacking GBA e non so nello specifico come funzionino i suoi puntatori, ma se hai un emulatore gba che ti permette di fare debug (breakpoint su scrittura in memoria, e backtracing del codice sarebbero l'ideale  :P  ) ti posso dire un metodo "generico". Se hai del testo non compresso in rom (anche non necessariamente ascii, ovvio, ma cmq non compresso, se è compresso la cosa diventa più incasinata), al momento di visualizzarlo nel gioco, il testo dovrebbe essere copiato in ram e usato insieme alle tile (le "mattonelle" di grafica) del font per generare il testo che tu vedi a schermo. Allora, fai partire il gioco, e non appena compare a schermo una delle frasi di cui cerchi i puntatori, "ferma" l'esecuzione e fai partire il debugger (non chiudere la rom, eh, devi solo brekkare ed entrare nel debugger). Cerca in RAM la frase incriminata, e se la trovi (si spera eheheh) segnati l'indirizzo ram del primo byte della frase: ora dal debugger imposta un breakpoint in scrittura su quell'indirizzo, poi  fai continuare l'esecuzione del gioco e fai in modo di far compare un'altra frase. Un attimo prima che ciò avvenga, il breakpoint dovrebbe automaticamente fare il suo sporco lavoro e fermare l'esecuzione esattamente sull'istruzione che copia la frase dalla rom alla ram. Bene, partendo da questa istruzione procedi "a ritroso" esaminando le istruzioni assembler eseguite prima per tentare di capire in che modo il gioco ha indicizzato quella esatta posizione in rom, e quindi puoi iniziare a capire con che meccanismo quel gioco punta le frasi.
Se il tuo debugger non ti permette di usare breakpoint e tracer, ma ti fa fare almeno un ram dump, puoi usare cmq questo stesso metodo, con qualche modifica:
1) quando compare a schermo la frase devi breakkare IMMEDIATAMENTE e fare un ram dump
2) trovare la frase eventualmente nel dump della ram, e vedere a che indirizzo sta (occhio che spesso l'indirizzo in memoria NON è semplicemente l'offset all'interno del file di dump, non so esattamente come funziona il gba)
3) ORRORE! Devi avere sotto mano un disasm dell'intera rom (credo ci siano buoni disassemblatori in giro) e cercarti "a mano" nell'intero codice, quale istruzione va a scrivere in quell'indirizzo ram. Premetto che questa cosa richiede una certa esperienza, e un pò di istinto zen, altrimenti ci si perde tra le migliaia di righe di codice assembler... La pratica rende perfetti!
4) Fare il backtracing delle istruzioni "a mano", sempre col nostro disasm della rom

Può sembrare un disastro, ma fidati, questo metodo (con queste 4 modifiche che lo complicano un po') lo sto usando attualmente su un gioco per SegaCD, e se impari ad usarlo bene ti permette di cavar fuori mooooolte cose da un gioco, non solo i puntatori  :lol:


PS: è un metodo generale che ovviamente non funziona sempre; spesso dipende dai giochi, ma in linea di massima è utile. A volte per alcuni giochi bisogna "cambiare" leggermente qualcosina ma l'idea di fondo di questo sistema resta cmq valida. Tutto ciò necessita di un pò di conoscenze generali di programmazione e di una certa conoscenza dell'assembler specifico della macchina su cui si sta lavorando (in questo caso il GBA), purtroppo non riesco a spiegartelo in maniera meno "tecnica", sorry.

Ciau e buon lavoro!
Punk nella testa, non nella cresta...
Nonperdono, HxC violence dalla puglia
http://www.nonperdonohc.tk

addler

Grazie dell'aiuto!
Cercherò di seguire le tue indicazioni e vedrò cose ci esce.

Morpher

Ma settare un break in lettura all'inidirizzo in cui si trova il testo, avviare il tracing del codice poco prima che la frase venga mandata in vram no eh?!  :P
In questo modo dovresti riuscire a limitare la ricerca a moooooooolte meno righe di codice...


gufino2

Morpher in effetti hai ragione, in questo caso potrebbe essere più semplice  :P
Io in realtà brekko alla scrittura in vram invece che alla lettura in rom perchè così taglio la testa al toro se c'è della grafica o testo compresso, e brekko direttamente nella routine di decompressione e capisco qual'è :D E qualora il testo non sia compresso, lo individuo direttamente. Poi sai, sono un pò maniaco e nell'asm ci sguazzo bene hihihi  :D  
Punk nella testa, non nella cresta...
Nonperdono, HxC violence dalla puglia
http://www.nonperdonohc.tk