Rispondi 
[ASM & HEX] Aula di waxtap - Prof Bonnox
Bonnox
Signore del Tempo un po' imbranato
*****
Offline

Messaggi: 1,742
Registrato: 06-07-2014
Reputazione: 6
Mi Piace Ricevuti: 357
PokéMoney: 1,860.50₱
Messaggio: #1
Aula di waxtap - Prof Bonnox
Ciao e benvenuto nella mia aula!

Questo corso si prefigge lo scopo di far comprendere i fondamenti del funzionamento più interno del nostro amato Game Boy Advance, per poter, con la pratica, diventare capaci di alterare i nostri giochi! ^^
Vi chiedo di non scoraggiarvi se all'inizio le cose non vi verranno subito. In tal caso bisogna andare a fare un giro per distrarsi, fare un respiro profondo, rileggere attentamente, e nel caso il problema persistesse, consultare il dottore me, che sono qui apposta.
Vi avviso subito che non sono argomenti facili, ma se non avete fretta riuscirete a dominarli.

LEZIONE 0
INTRO

Innanzitutto vi comunico il materiale essenziale:
  • Emulatore normale e ROM (facilmente reperibili in commercio). Sapete che preferisco rubino perciò farò più esempi con quella ROM, ma è indipendente quale scegliete, l'importante è essere comodi a lavorarci su.
  • Hex editor (spiegato sotto)
  • VBA SDL-H
  • Assemblatore
  • Referenza (quick guide)
Questo invece è Facoltativo:





ovviamente non è necessario che leggiate subito quei documenti, anzi, probabilmente non ci capirete niente le prime volte. Li vedremo insieme, a suo tempo.
cominciamo spiegando di cosa si tratta tutto quel materiale:
Il VBA-SDL-H è una versione modificata del VBA che permette di fare cose avanzate per gli hacker, ed è quello che useremo più spesso durante le ricerche, in quanto torna molto utile come debugger e disassemblatore. Funziona da linea di comando, ma come vedrete non è molto difficile da usare.
L'Asemblatore è un programma che permette di passare dal nostro linguaggio ASM al file binario effettivo (codice eseguibile dal GBA).
Entrambi i tool saranno spiegati in dettaglio più avanti.
Per quanto riguarda l'Hex editor c'è un piccolo discorso da fare. Come alcuni di voi forse già sapranno, è un programma che permette di visualizzare il contenuto a basso livello di un file. Esso sarà il nostro "migliore amico", perciò bisogna sceglierlo bene: quello che volete, su internet ce n'è una svalangata tra cui scegliere (actually sto pensando di farne uno anche io, ma le tempistiche saranno MOLTO lunghe), ergo usate quello con cui siete più comodi. I toolz servono per facilitare il lavoro, non per litigarci contro (e vi posso garantire che è infernale non andare d'accordo col programma in uso, mi è successo). Io attualmente uso questi 3 in accoppiata: XVI32, HxD, WindHex, ma non vuol dire che dobbiate farlo anche voi. Per gli utenti Linux invece di gratuito c'è Bless. Non possiedo mac dunque non posso consigliarvi in tal caso.
Più avanti vi illustrerò brevemente ciascuno di questi tre per permettervi di fare una scelta più oculata. Non serve ora.

Ora faccio un paio di considerazioni.
Innalzo il tempo di risposta dai 5 giorni canonici a 8/10 (ma potrebbero essere anche di più). Ovviamente questo vale solo per lo svolgimento di un compito, perché gli altri post non richiedono grandi capacità o applicazione, perchè si limitano ad esporre dei concetti che possono essere interiorizzati in un paio di giorni. Dunque non c'è neanche bisogno di fissare una scadenza per il resto dei messaggi. Questa modifica semplicemente per il fatto che questa è roba di una certa levatura, a volte anche difficile. Potrà sembrare strano, ma come il mapping, anche l'asm richiede tanto tempo... Per la creatività! Pacman Confused no ok magari non è la migliore scelta lessicale, fatto sta che ci può davvero volere del tempo perchè potrebbe essere impegnativo. Dunque avremo orari... flessibili.

A proposito, vi consiglio di sottoscrivere la discussione clickando sul link in fondo alla pagina, oppure la stella di SchifoTalk Wink così non dovremo più taggarci come dei matti ( anche perché immagino sarete incollati al pannello di controllo per vedere se ho risposto. ok fine autocelebrazione time ASD ) : avendo sottoscritto, voi vedrete che ci sono nuovi post dal pannello di controllo; io pure perchè sono l'autore.

Allora la mia idea, prescindendo dagli argomenti trattati, era di preferire un post grosso diviso in più parti, in modo da poter analizzare con calma ogni singolo aspetto. Non disdegno la tecnica "mordi e fuggi", ma in questo caso non potrebbe essere applicata per svariati motivi. Magari negli altri casi, come spiegare i comandi di XSE un po' per volta, può funzionare, ma non qui.

Se alcuni concetti esposti in questo messaggio non vi saranno subito chiari non preoccupatevi, li riprenderemo ~
Detto questo ci vediamo la prossima volta, rispondete quando siete pronti per continuare. Smile


nel malaugurato caso in cui, per qualche motivo, non possa rispondere, Siete autorizzati a mandarmi un (1) messaggio privato per ogni settimana passata.

Saluti

@Шахтар


Allegati
.zip  VBA-SDL-H-r070904a-win32.zip (Dimensione: 347.07 KB / Download: 2)
(Questo messaggio è stato modificato l'ultima volta il: 21-09-2017 09:55 AM da Bonnox.)
21-09-2017 09:50 AM
Cerca Cita
 Mi piace ricevuti da: Шахтар
Шахтар
Il mio nick si legge Shakhtar!
**
Offline

Messaggi: 115
Registrato: 12-05-2017
Reputazione: 3
Mi Piace Ricevuti: 59
PokéMoney: 222.00₱
Messaggio: #2
RE: Aula di waxtap - Prof Bonnox
Benissimo,ho tutto l'occorrente,tranne il VBA SDL-H(te lo chiedo in privato) Credo che possiamo iniziare la prima lezione Smile

Shakhtar Donetsk
[Immagine: DrPOxri.gif]
21-09-2017 01:57 PM
Cerca Cita
Bonnox
Signore del Tempo un po' imbranato
*****
Offline

Messaggi: 1,742
Registrato: 06-07-2014
Reputazione: 6
Mi Piace Ricevuti: 357
PokéMoney: 1,860.50₱
Messaggio: #3
RE: Aula di waxtap - Prof Bonnox
waxtap scusa se uso il plurale, so che sei uno solo

LEZIONE 1
I MATTONCINI DELLA ROM:
IL LINGUAGGIO BINARIO


Purtroppo, come ho già detto, questo corso deve coprire grandi quantità di informazioni. Prima di cominciare, dovrete quindi conoscere il significato di alcuni termini e concetti (ovviamente se li conoscete già potete saltare). Una volta chiedevo come prerequisito la conoscenza di una cosa chiamata "sistemi di numerazione", ma a scanso di equivoci, e per completezza, riporto comunque le nozioni basilari, alla "quick and dirty". Infatti, come tutte le cose che traggono origine dalla matematica, il discorso è molto complesso, ma io vi dirò solo quello che vi serve sapere.
Per la vostra gioia dunque partiamo con un po' di matematica.

Noi umani solitamente contiamo usando le mani, perciò arriviamo fino a 10. Stiamo dunque inconsapevolmente utilizzando la base decimale della notazione posizionale. Che significa? Semplicemente ogni posizione nel numero ha un significato diverso, ovvero, per esempio, tra 1, 10 e 100 c'è una bella differenza! Questa differenza è precisamente un'esponenziale di 10, ovvero, per ogni posizione che aggiungo, il numero aumenta di 10 volte. Inoltre, i numeri si possono esprimere, in forma completa, come somma dei contributi delle singole posizioni:
ad esempio il numero 619 si può vedere come 6*10^2 + 1*10^1 + 9*10^0.
Mentre invece gli antichi romani dovevano fare 500+100+10+10-1, dato che poverini avevano la notazione additiva.
Esistono poi, oltre alle notazioni, le basi. Tralasciando le complicazioni matematiche, a voi serve sapere che una base è il valore del peso di ciascuna cifra. Quando scriviamo numeri "normali" è 10. In informatica si usano molto anche il 2 e il 16. Il sistema che usa base 2 si chiama binario, mentre quello con la base 16 si chiama esadecimale. Come funzionano? Funzionano come il nostro, con l'unica differenza nel numero delle cifre. Noi contiamo da 0 fino a 9, e poi azzeriamo quella posizione per mettere un 1 a quella successiva. Lo stesso con il binario e l'esadecimale, ricordandoci però che le cifre sono rispettivamente {0, 1} e {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F}.

In generale, Per convertire da qualsiasi basa alla decimale si fa come il mio precedente esempio con 619, cambiando ovviamente il fattore moltiplicativo. Come esempio userò il famoso numero 80C, convertendolo da esadecimale a decimale:

8*16^2
+
0*16^1
+
12*10^0 (C vale 12)

= 2060.

Invece per convertire da decimale ad un altra base Dovete ripetere i passaggi:

- dividete il numero da convertire per la base (esempio 16)
- segnatevi il resto della divisione
- ora il numero da dividere diventa la parte intera della divisione precedente.
- e smettete quando arrivate per la prima volta ad avere resto 1 (altrimenti andate avanti all'infinito).
- per formare il numero mettete in sequenza i resti a partire dall'ultimo

http://www.pokemonhacking.it/attachment....mbnail=278

l'esempio mostra la conversione di 23 in base 2, ovvero 10111.


Una nota: precisate sempre in che sistema state scrivendo quando si parla di numeri in questa aula, altrimenti ci potrebbero essere disastrose incomprensioni!
è universale mettere un prefisso "0x" ai numeri esadecimali, poi ci sono comunque degli standard... Ecco quelli che io sicuramente "capisco" ("OCT"si riferisce alla base ottale, dove le cifre vanno da 0 a 7):
  • PREFISSE:
    • HEX:
      • 0x
      • #
    • OCT:
      • 0
  • SUFFISSE:
    • HEX:
      • h
    • DEC:
      • d
      • # (dipende dalla piattaforma usata, in quanto va in conflitto con un altro, io di solito lo uso per numeri a tre cifre)
    • BIN:
      • b


Per finire con i prerequisiti, diamo alcune semplici definizioni:
  • Bit
    Elemento che ha origini agli albori dell'informatica. E' un elemento che può assumere 2 stati diversi. Solitamente sono acceso e spento, nati dai valori della tensione in un circuito nei primi calcolatori elettronici, ma il significato non cambia a seconda della tecnologia utilizzata (magnetica, ottica, quantistica). Bit è la contrazione dell'inglese "BInary digiT", che significa "cifra binaria". Si rappresenta con le 2 cifre del sistema binario (0 e 1). È l'unità fisica minima nell'informatica.
  • Byte:
    È l'unità logica fondamentale (logica>fisica), composta da un gruppo di 8 bit su un qualunque supporto di memorizzazione (CD, chiavetta, radio...) Se facciamo la combinazione di tutti i suoi termini, vediamo che può assumere 2^8 = 256 stati diversi. Nel nostro sistema decimale per elencarli si parte da 0 e si arriva a 255. In binario si parte da 00000000b e si arriva a 11111111b. In esadecimale, la base che useremo più spesso, quei valori si scrivono 0x0 e 0xFF. Potreste anche verificarlo voi stessi con le formuline di prima.
    Perchè un byte si rappresenta in esadecimale? perchè è il modo più veloce, in quanto ha solo 2 cifre, e ciascuna rappresenta separatamente i primi o gli ultimi 4 degli 8 bit, cosa che non avviene in base 10. Se non ci credete, fate delle prove.
  • Offset:
    letteralmente "scostamento" in inglese, indica lo spostamento di un preciso byte relativamente a un'origine. Noi fortunatamente consideriamo sempre tale origine come il primo byte della ROM, dunque indirizzo 0 (ricordo che in informatica, e a volte in matematica, si inizia sempre a contare da 0), il che semplifica i conti; ma non è raro il caso di dover iniziare a contare a partire da un altro valore: ad esempio per hacking di altre console, principalmente nintendo e vecchie (il caso più vicino a noi è il GB) si divide la ROM in varie parti di uguale grandezza, e ognuna determina una diversa origine del valore dell'offset.
  • Puntatore:
    generalmente in informatica è un valore che indica, da cui l'usanza di dire "punta", un'area della memoria della macchina. Generalmente nei computer indica la RAM, ovvero la memoria temporanea che contiene i dati in attesa di essere elaborati; Mentre noi avremo quasi sempre a che fare con puntatori alla ROM, che è la memoria di sola lettura in cui risiede il gioco.



Come avrete capito in questa prima parte lavoreremo sui byte; nonostante ahimè sia un lavoro noioso secondo me è più facile da comprendere rispetto agli ultimi argomenti, più difficili ma divertenti, una volta compresi.

Ogni file sul nostro computer è composto da una serie più o meno lunga di bytes. Come avrete avuto modo di notare usando il PC durante il vostro hacking, la rom occupa esattamente 16 MB, il che è veramente poco al giorno d'oggi, ma dobbiamo considerare che risale al 2002 e per giunta è per una piattaforma mobile.

All'interno di ogni programma informatico (tra cui il gioco) ci sono, stipati insieme, due elementi: Istruzioni e Dati. La loro presenza dovrebbe far funzionare correttamente il tutto. Le istruzioni sono ciò che vedremo con l'Assembly, ovvero il "codice" che il GameBoy esegue una volta caricato il gioco, come ad esempio "fai questo suono", "memorizza tale valore", “visualizza l’immagine”, "muovi la pokeball", eccetera. I dati invece sono informazioni conservate nella ROM con un preciso formato, ma da soli non basterebbero a dar vita al gioco, nonostante siano proprio loro a caratterizzarlo come tale. Ad esempio, pokemon rosso fuoco e smeraldo condividono la maggior parte delle istruzioni, ma i dati sono completamente diversi. Servono tutti e due, ma se uno ha solo i dati non fa nulla, mentre se ha solo le istruzioni può avere qualcosa da mostrare con il minimo sforzo aggiuntivo - vedasi pokemon essentials, un progetto RPG con tutte le istruzioni di un gioco pokemon e 4 mappe in croce. Le prime versioni avevano pochissimi dati, però funzionava. Ad esempio sono dati le musiche, le mappe, i pokemon degli allenatori, i testi dei messaggi…
Tutto ciò che non rappresenta il comportamento del sistema è un dato. Coincidenza, quasi tutto quello che viene modificato dai programmi di hacking è un dato. Advance map modifica i dati. Ricordatevelo.
In questa sezione imparariamo a farlo anche senza programmi, non perchè io sia cattivo o cosa, ma in alcune occasioni può tornare utile. Comunque tranquilli, una volta imparato non dovreste averne quasi più bisogno, ma sempre meglio sapere come fare.
E' altresì importante chiarire il fatto che di per sè non esisterebbe la distinzione tra istruzioni e dati. Infatti, sia le istruzioni che i dati sono rappresentati sotto forma di bit e byte. Capiremo meglio il motivo quando faremo l'ASM, per ora prendetelo come un dogma di fede: i dati possono essere anche erroneamente interpretati come istruzioni, ma anche viceversa (vedasi i vari glitch di pokemon red). E se per noi è un fastidio in quanto tutto va male, per la macchina in realtà non cambia assolutamente nulla, semplicemente non gliene frega niente, è solo colpa nostra. Sta al creatore controllare che il suo gioco non si comporti in modo errato. Sul computer questo invece non succede quasi più da quando esistono sistemi operativi solidi, ma nel caso dovesse accadere probabilmente c'è un virus nel computer. Dal 3DS in avanti anche le console nintendo hanno un sistema operativo.



Bene, eccoci alla vera lezione. Mi scuso se sarà un po’ monotona, ma è importante. Come diceva un mio professore, “il brutto delle cose facili è che vanno sapute perfettamente”.

In questa lezione faremo una partenza soft con l'hex editor, giusto per prenderci la mano.

Aprite un hex editor. L'Hex editor è un software che ci permette di visionare e modificare i bytes di un file. Ecco come si presentano alcuni di essi una volta aperti (non spaventatevi, sono 3 programmi diversi, li ho affiancati per paragonarli):

http://www.pokemonhacking.it/attachment.php?aid=297

Iniziamo caricando un nuovo file. Consiglio un file che non vi serve più (ad esempio potete creare un nuovo documento di testo da usare come cavia), dato che andremo a pasticciare e a rovinare :D

Normalmente troveremo tre colonne: la prima, piccola, indica l’offset in cui ci troviamo, quella centrale visualizza tutti i byte, e l’ultima colonna ci indica gentilmente la loro rappresentazione testuale, cosa di cui non potrebbe fregarci di meno, dato che per noi è inutile.
Posizionate il cursore e clickate sulla colonna a destra, e iniziate a scrivere cose a caso sul file cavia. Notate che c’è una corrispondenza a sinistra con ciò che scrivete?
Ora vorrei che vi prendeste un attimo di tempo per fare una cosa. Iniziate a scrivete tutte le lettere dell'alfabeto, dalla a alla z, minuscole e maiuscole, e poi anche i numeri. Cosa notate? I byte a destra assumono precisi valori. Signori, questo è l’ASCII. Questo è uno standard americano di comunicazione nei primi computer. In pratica assegna ad ognuno dei valori ottenibili da 7 bit a un carattere o simbolo. La tabella attualmente diffusa è quella di MS-DOS, mentre tanto tempo fa c'erano discrepanze a seconda del sistema operativo.

Ora prendiamo confidenza con le funzionalità del'H.E.. Non so il percorso del mouse da seguire con il vostro, ma esiste una scorciatoia praticamente universale che tutti implementano: CTRL+F. Si aprirà una finestra chiamata ricerca. Qua ci mettete del testo che volete venga cercato all'interno di un file. Se state usando una rom di pokemon non avrete fortuna, perciò cambiate subito file. Potete ad esempio scegliere un documento di testo (txt, non word). Dopo aver avviato la ricerca il cursore si posizionerà sulla prima occorrenza del testo; per cercare ancora premete F3. Oppure create una lista di risultati, che è più comoda:

http://www.pokemonhacking.it/attachment.php?aid=298

Ricordate che anche se in generale sono simili, ogni hex editor ha proprie funzioni aggiuntive che vale la pena provare e sfruttare
Ad esempio poco fa, con la lista dei risultati, avete visto in azione una delle caratteristiche che più mi piacciono di windhex. Peccato che lui sia un po’ scomodo da usare “quotidianamente”.

http://www.pokemonhacking.it/attachment.php?aid=415
http://www.pokemonhacking.it/attachment.php?aid=416

Ora vorrei concentrarmi su una cosa molto importante che tornerà sempre utile, ovvero la ricerca dei puntatori. Come accennato prima, sono dei valori che indicano una posizione all'interno della memoria del GBA, che vedremo in dettaglio in futuro. Ipoteticamente, ogni byte potrebbe avere il suo puntatore, basta costruirlo. Nella realtà però non è così perché si indica soltanto il primo byte di qualcosa, la cosiddetta "risorsa" del gioco, come un'immagine, un testo, ecc..., mentre quelli seguenti sono referenziati tramite un indice di scostamento rispetto al puntatore (l’origine di cui parlavo prima).

Considerate questo esempio:

“Quel fez sghembo copre davanti”

Analizziamo ora la frase:

[ Q ][ U ][ E ][ L ][ ][ F ][ E ][ Z ][ ][ S ][ G ][ H ][ E ][ M ][ B ][ O ][ ][ C ][ O ][ P ][ R ][ E ][ ][ D ][ A ][ V ][ A ][ N ][ T ][ I ]

Abbiamo un indice che identifica ogni lettera:

[00][01][02][03][04][05][06][07][08][09][10][11][12][13][14][15][16][17][18][19][20][21][22][23][24][25][26][27][28][29]

Se contate, le due righe hanno lo stesso numero di caratteri.
Se volessimo accedere ad una lettera, non dovremmo fare altro che sommare l’indice all’offset del primo carattere.

capiamo meglio con un’immagine:

http://www.pokemonhacking.it/attachment.php?aid=300

In questo esempio possiamo vedere che l’offset del primo carattere è 9D3CE4h, e se voglio l’indice del carattere z devo sommare l’indice di z, ovvero 7.
Spero sia chiaro, altrimenti non fatevi scrupoli a chiedere.

Ora vediamo quali sono i passaggi per ottenere un puntatore. Per il momento ci saranno dei punti poco chiari, ma nelle prossime lezioni saranno rivelati.

Dato un offset lungo 3 byte, il suo puntatore è:
  • scrivere XX XX XX 08;
  • invertire l’ordine dei 3 byte (quello in mezzo ovviamente resta in mezzo)
  • sostituire i nuovi byte alle X, in ordine.

Ecco l’esempio per 9D3CE4:
  • scrivo XX XX XX 08;
  • ribalto i bytes: E4, 3C, 9D.
  • sostituisco: E43C9D08.

Questo è il puntatore come se fosse stato inserito nella ROM originale. Ora basta metterlo nel posto giusto e il gioco potrà usare il nuovo testo, e nessuno si accorgerà della modifica! Questo è ciò che fa, a volte sbagliando perchè è buggato come l'inferno, advance text.
Avete voglia di ricavare qualche puntatore, così giusto per esercizio? è proprio una sciocchezza, si fa in meno di 2 minuti, ma serve a molto.

Ricavate i puntatori dei seguenti offset:
  • 3E6E50
  • FB328
  • E00000

Spero lo abbiate fatto, perché alla fine della lezione vi servirà.

Bene, eccoci finalmente alla vera pratica. Recatevi all’offset 3E6E50 di ruby. Come fare? Non so quale sia il vostro menu a tendina, ma sicuramente potete fare CTRL+G, tutti gli hex editor hanno questa scorciatoia.
Inserite l’offset come faccio io e dovreste avere il seguente risultato;

http://www.pokemonhacking.it/attachment.php?aid=301

Questo è un dato binario. Significa che è un dato rappresentato nel suo tipo (formato) naturale. ne consegue che solo chi sa leggere quel tipo di dato potrà comprenderne il significato. Fate una prova: aprite un’immagine con il blocco note. Cosa esce? Caratteri incomprensibili, perché il blocco note non sa leggere le immagini, lui poverino cerca solo il suo formato di dati (il testo) nell'immagine. Se provate ad aprire file prodotti da un'altra applicazione con un programma totalmente diverso, sarete fermati da un errore di incompatibilità. I programmi si aspettano certe cose nel file che aprono, e se non le trovano prevengono potenziali (anzi, sicuri) catastrofici errori dicendo di non poter aprire il file.
Dunque dicevo, ciò che troviamo sulla rom deve essere interpretato come il tipo di dati giusto per produrre un output coerente per l’utente. Altrimenti si verifica la stessa cosa di missingno: Secondo pokemon rosso laggiù ci doveva essere il verso di un pokemon, mentre invece c’erano altri dati… ecco da dove nasce l’inquietante verso di ♀ (“female”). Ed ecco perché sembra non finire mai: interpretando tali dati come suono, i byte che indicano la fine del suono non vengono raggiunti in tempi ragionevoli. A noi invece il massimo che possa capitare è vedere qualche carattere giapponese in un messaggio (mai capitato durante il corso di XSE?), perché magari sbagliamo a mettere l’offset, confondendolo con il puntatore o il testo; questo perché una ROM del GBA è dannatamente più stabile e comoda da modificare rispetto al GB.

Come modificare tali dati binari allora? Dobbiamo innanzitutto scoprire cosa rappresentano. Io lo so già perché riciclo gli esempi

Nota:
Non è questo il caso, ma se vi capitasse che i dati non siano word-aligned, ovvero allineati ogni 4 byte, ovvero ad un offet non terminante per 0,4,8,C (visto che belli i criteri di divisibilità in base 16??), è necessario copiare i byte in un nuovo file per poterli analizzare meglio.
Dovete, con il vostro hex editor di fiducia, selezionare il pezzo che vi interessa, copiarlo e incollarlo in un nuovo file. Il procedimento cambia da programma a programma, se non riuscite sono qui apposta.
Tuttavia anche se stavolta non serve è utile sapere come si fa, perciò ricordatevelo.

riprendendo il discorso, ecco cosa dovreste vedere nell'immagine, come i test che fa lo spicologo:
http://www.pokemonhacking.it/attachment.php?aid=237

Sicuramente ve lo aspettavate, conoscendomi :D chiedo nuovamente scusa a fiammy per aver dimenticato di colorare il suo posticino di meditazione quotidiana :D

Bene, ora che sappiamo cosa è analizziamo il formato: sembra che ogni valore del byte corrisponda a una città (A GINIUS!). è importante però notare una cosa: il valore 57h indica il vuoto. Anzi, empiricamente possiamo notare che qualunque valore al di sopra di 57h indica vuoto.

Il vostro compito è di modificare (tramite hex editor, ovviamente) la worldmap e farmi vedere il risultato.

Una volta gli alunni passati mi hanno posto due domande argute, vi lascio qualche riga vuota per farvi provare a formularle anche a voi.
-
-
-
-
-

La prima domanda era se è possibile mettere più di 56h città. La risposta, mio caro ragazzo, è che sì, è possibile, ma non con l'hex editor. Noi con l'hex editor abbiamo modificato i dati, ma le istruzioni impongono un numero massimo di città. Capite bene che la vera potenza sta nell'ASM, l'hex editor è solo il canale di sfogo di questa.
La seconda domanda è come io sia arrivato a trovare l'offset contenente la mappa. Ci sono due modi: il primo, da non fare, è aprire advance map, andare su editor mappa del mondo, vedere che ciascun quadratino corrisponde a una città e ha un numero, prendere una riga qualunque della mappa, e cercare nell'hex editor la sequenza di numeri ottenuta scorrendo il cursore. Il secondo modo invece, quello giusto, purtroppo mentre stavo scrivendo in realtà non posso dirvelo perchè mi sono accorto che prevede conoscenze di lezioni future. ricordatemi di dirlo nella prossima lezione verde.


Vi do un cosniglio: anche se la tentazione di non farlo è forte, conviene sempre spostare il vostro dato in un nuovo file. Infatti potete vedere subito se per sbaglio aggiungete dei byte. Controllate sempre di essere in modalità OVERWRITE! Inserendo bytes spostate altra roba che viene dopo, che dunque non è più al suo posto, e non verrà letta correttamente. Finchè si tratta di dati si può soprassedere (immagini, testi e suoni glitchati senza sapere da dove vengano), ma se sono istruzioni, la cosa si fa grave: non va mai bene, e alla peggio ci crasha la ROM...
Inoltre, fate spesso backup. vi torneranno MOLTO utili, soprattutto le prime volte che sperimentate qualcosa di nuovo, dato che sono più alte le probabilità che qualcosa vada storto.

Per compito i 4 angoli della tabella devono contenere una città a vostra scelta, in più invertite albanova e solarosa. Chi lavora su fire red può fare il compito su fire red, per questa volta. L’offset è 3F2500h. Anche lì, con l'hex editor invertite le prime 2 città.
Questo è un compito per farvi imparare a contare. Come?, direte. Si, perché avrete notato che i dati sono tutti immagazzinati in fila indiana, non ci sono righe o colonne. La presenza di righe e colonne è dedotta dal software, mediante un semplice procedimento:
  • So le coordinate X e Y del dato della tabella che devo leggere.
  • Moltiplico la Y per il numero di elementi di una riga
  • Sommo X al precedente risultato
  • Sommo l’offset del primo elemento della tabella al precedente risultato.

Come funzionano questi passaggi? Facciamo un esempio passo-passo.

Supponiamo di avere all’inizio di un file una talebba di 9 elementi, così:

A B C
D E F
G H I

Ma ovviamente nella memoria essa è contenuta in linea retta: [ [ ( A ), ( B ), ( C ) ], [ ( D ), ( E ), ( F ) ], [ ( G ), ( H ), ( I ) ] ] . Come facciamo ad accedere ad un elemento? Dobbiamo indicizzarla.
Mettiamo di voler accedere alla posizione centrale E, di indice 1,1 (si parte a contare da 0).

- Moltiplico y*la larghezza: 1*3=3
- Sommo la x: 3+1=4
- Sommo l’offset di inizio della tabella: 4+0=4


Dunque prendiamo il valore alla posizione 4. Contiamo insieme (scusate se vi sembro Dora l'esploratrice >.< :asd: ):
0-A,
1-B,
2-C,
3-D,
4-E.

Tutto questo casino per cosa? Per sapere cosa state modificando. Se siete sulla ROM vi perderete in fretta, per cui bisogna sempre contare prima di scrivere qualcosa.

Ma tanto già so che voi avrete ridimensionato la finestra del programma per avere esattamente 28 colonne, vero? Sempre che il vostro hex editor permetta ciò. A questo punto il compito diventa una bazzecola.

Ora proviamo a fare una cosa più complicata. Vi giuro che è l’ultima per oggi.

Spostiamo la worldmap.
Ecco il procedimento passo per passo. Vorrei lo faceste per compito.

Per poter proseguire, dovete aver fatto il mini esercizio sui puntatori. Se proprio non riuscite chiedete.

Prendete l'offset della worldmap. Aprite la ROM con l'hex editor e cercate una stringa esadecimale. Scrivete il puntatore che avete ricavato prima (quello dell'esercizio è lo stesso di questo). Se tutto è corretto dovreste averlo trovato una sola volta. Se di più o avete usato rosso fuoco e allora non so, oppure c’è qualcosa di sbagliato, nel caso chiedete pure. Si trova a FB328h per ruby.
Sostituitelo. Con cosa? Ma con quello che volete voi. Ad esempio provate un offset a caso. Scrivete davvero 3 (TRE!) byte a caso, anche se vi sembra assurdo, è un procedimento istruttivo. Poi aprite la mappa città nel gioco e vedete che succede. Il gioco interpreta come mappa città dati che mappa città non sono. Complimenti, avete buggato la ROM! Tranquilli, è riparabilissimo, basta fare l'operazione inversa! Ora torniamo indietro. Mettete il puntatore di questo valore: 720000h. se la rom è vergine, dovrebbe esserci spazio laggiù. Ora, copiate la vostra wolrdmap in tale punto. Modificate valori della worldmap che vi ho chiesto. Se tutto va bene, cancellate quella originale, scrivendo 420d volte 00h o FFh. O qualsiasi cosa, ma questi due valori sono molto più "convenzionali".

Per concludere, vi lascio un piccolo esempio che riassume al meglio cosa significhi l'hex editing.
- Aprite advance map, una ROM qualsiasi e una mappa qualsiasi.
- prendete un tile qualsiasi e mettetelo nella prima casella della mappa, in alto a sinistra, e ricordatevene il numero, che compare nella barra di stato in basso.
- salvate
- aprite windhex, e usate la funzione compare files.
- mettete la rom che avete appena usato come cavia e una pulita.
- se fate compare, vi dirà 2 byte sono cambiati.
- andate a vedere tali byte, ad esempio io che ho usato albanova ho "2913B4" e noterete che i numeri che troverete lì coincidono, più o meno, con il vostro tile. Più o meno perchè innanzitutto sono "girati", e poi perchè il secondo non è identico, ma ha un 4 o un 3 aggiuntivi. Il 4 o il 3 io stesso non so cosa siano, suppongo sarà qualche ottimizzazione fatta da game freak. Il perchè è girato lo vedremo un'altra volta. Però sono loro. Per fare una prova, tornate in advance map, e selezionate la scheda "vista header", e premete CTRL+H, per aprire la vista "professionale". Se tutto è andato bene, dovreste vedere il vostro offset sotto il riquadro "dati mappa" e "offset mappa".

Cosa è successo?

Abbiamo visto cosa succede nella realtà quando usiamo un programma automagico. Ora io non voglio dirvi di buttare advance map e usare per sempre l'hex editor, ma farvi capire la mole di lavoro fanno questi programmi per voi. E pensate che se si aumentano le dimensioni il programma deve anche trovare dello spazio libero per inserire la nuova mappa più grande. Vi ho fatto fare questo perchè prima o poi si rivelerà necessario: ad esempio talvolta si "bruciano" le mappe, e con un po' di fortuna potete recuperarle. Ovviamente con ciò non dovrete scordare di fare i backup.
Inoltre è sempre importante almeno sapere nella teoria cosa fanno a basso livello i programmi di automazione che si usano, questo vale in ogni campo dell'informatica.




Se avete qualsiasi cosa da dire, non abbiate paura!
Bye!

NOTA PER ME: METTERE SECONDO MODO MAPPA HOENN

Se ti sono stato d'aiuto, clicca il tasto "mi piace" qua sotto! Grazie! : )

Il mio nuovo motto: don't ask for ETAs!

[Immagine: yKWdaxi.gif]

[Immagine: firma.png]
"L'uomo è ancora il più straordinario dei computer"


Guida di cui vado più fiero: Mega-Huge Bonnox' guide (to be expanded)


[Immagine: toothbrush_girl_by_timewyrm-d6i5ezm.jpg]

Ho un T.A.R.D.I.S. modello 40 ma non so usarlo. Pacman
08-10-2017 04:26 PM
Cerca Cita
 Mi piace ricevuti da: Шахтар
Шахтар
Il mio nick si legge Shakhtar!
**
Offline

Messaggi: 115
Registrato: 12-05-2017
Reputazione: 3
Mi Piace Ricevuti: 59
PokéMoney: 222.00₱
Messaggio: #4
RE: Aula di waxtap - Prof Bonnox
Ottimo, ho letto bene questa lezione e come credo ti aspettavi ho capito tutto Smile
Essendo adesso stanco e domani mattina a scuola, posterò il pomeriggio tutti gli esercizi da fare, ad ogni modo per ora scrivo i puntatori dei seguenti offset (come c'era scritto sopra)
3E6E50---506E3E08 (08 sai benissimo perché, è un pointer XD)
FB328---8032FB08
E00000---0000E008
Poi, editando questo post aggiungerò anche la mappa città modificata come richiesto
E anche ll resto, ovvero come il repointare l'intera mappa su uno spazio vuoto
Per quanto riguarda quest'ultimo, per ora ti spiego solo come farei

Prendo un offset a caso, 800000 perchè in ROM vergini c'è sempre spazio
Vado sull'offset della worldmap,prendo i byte che la rappresentano, li copio, e sostituisco tutti gli spazi vuoti (FF) con i quei byte, incollandoli precisamente a partire dall'offset 800000, poi torno al pointer che avevo modificato per vedere cosa accadeva se sostituivo i byte di base con.. I byte (a puntatore) dell'offset dello script iniziale del prof oak(uso fire red, e ho scelto un offset casualissimo) e infine ci metto questi tre byte 00 00 80.

La battuta sulla worldmap hahah, una lezione davvero carina :3 e anche lunga Tongue
09-10-2017 10:17 PM
Cerca Cita
Bonnox
Signore del Tempo un po' imbranato
*****
Offline

Messaggi: 1,742
Registrato: 06-07-2014
Reputazione: 6
Mi Piace Ricevuti: 357
PokéMoney: 1,860.50₱
Messaggio: #5
RE: Aula di waxtap - Prof Bonnox
ok bene, ti consiglio solo di rivedere il secondo puntatore. paradossalmente ha fatto giusto il terzo che è più difficile secondo me

non preoccuparti, scrivi un nuovo messaggio invece di editare, così evitiamo incomprensioni sui rapporti temporali Wink

sembra lunga? abituati, è la norma ahah E grazie per il carina, non me l'aveva mai detto nessuno ^^"
10-10-2017 03:44 PM
Cerca Cita
Rispondi 




Utente(i) che stanno guardando questa discussione: 1 Ospite(i)
Powered by MyBB, © 2002-2017 MyBB Group. Copyright © | 2015 Pokémon Hacking