Hex Editing, quando i cheat li facevamo a casa

2l9ljrp

“Andiamo avanti”, disse Arthur con un cenno della testa, sfilando le due spade. William ne seguì l’esempio, scrutando nell’oscurità davanti a loro.

Ahmed diede una rapida occhiata al suo libro di incantesimi, accertandosi di avere tutto chiaro in mente, e Cu Chulain pregò gli dei di garantirgli il loro favore. Il corridoio era buio, la visibilità molto limitata.

L’ambiente era molto umido, e si sentiva un lieve suono, come di chiodi battuti sul pavimento. Ad un certo punto, si trovarono ad un bivio; pronti al tutto fecero un passo avanti e…

cover

…andò via la corrente elettrica!

 

 

Preambolo

Correvano gli anni ’90, gli anni in cui andavo alle superiori e studiavo informatica (“studiavo” per modo di dire, in realtà con quel poco che sapevo ero comunque avanti rispetto ai docenti).

Di videogiochi ne avevo tanti, ai tempi li si comprava piratati direttamente nei negozi, e ce li si scambiava con gli amici.

A volte capitava di trovarsi davanti ad alcuni giochi particolarmente difficili, oppure ci si trovava a vivere (come il sottoscritto) in un buco di merda della Terronia orientale una ridente e piccola comunità della Puglia, in cui lo “sbalzo di tensione” ed il black-out sono realtà quotidiane, soprattutto quando piove (con la pioggia ancora oggi, con il bel tempo almeno ora è stabile), distruggendo ore di progressi (a volte anche lo stesso PC) in una frazione di secondo.

In queste condizioni “energetiche”, uno deve fare una scelta importante tra le seguenti opzioni:

Un VeroNerd™ i cheat se li faceva in casa, non li andava a cercare in giro!
  • Mando tutto a fanculo, e niente più giochi!
  • Con tanta pazienza ricomincio dall’ultimo salvataggio (o dall’inizio) e salvo più spesso.
  • Mi rimbocco le maniche, e trovo un modo di risolvere il problema.

Un VeroNerd™ è geneticamente incapace di scegliere la prima opzione, quindi la scartiamo a priori.

La seconda opzione, pur essendo più che valida in termini di nerdismo, a volte deve essere scartata per questioni di tempo (troppi giochi da giocare!) o praticità (troppi giochi da giocare!).

Resta la terza opzione, che aprirà anche altre strade, di cui parleremo però in seguito.

 

Nei Favolosi Anni 90™, i cheat li si leggeva sulle riviste (come il mitico Zzap!), ce li si scambiava a voce (o sulle BBS, per chi ci bazzicava), oppure si era costretti a farseli in casa. In genere, io cercavo di farmeli in casa, in un certo modo.

 

 

 

Gli studi di informatica

Alla fine delle scuole medie, quando mi intestardii sul voler andare all’istituto biologico agrario, per continuare gli studi insieme al mio migliore amico, mio padre mi rispose con un caldo: “Scordatelo, è troppo lontano e ci metti troppo tempo ad andare e tornare. Piuttosto, dato che sei bravo con i computer, vai a studiare informatica.”

Non ho mai voluto studiare informatica (al di là che non ho mai voluto studiare in generale)

Innanzitutto, qualche tempo dopo scoprii che mi ci sarebbero voluti solo 15 minuti in più per arrivare all’istituto biologico agrario (ma ormai il danno era fatto), e poi mi resi anche conto che quelli che dovevano insegnarmi l’informatica, di informatica non ne sapevano una beata minchia erano molto esperti.

Al di là del professore di Sistemi, che comunque stuzzicava la nostra mente ed il nostro ingegno spingendoci alla mentalità del troubleshooting & brainstorming, molto importante in qualunque campo, non solo nella programmazione, degli studi di informatica delle superiori, fondamentalmente mi rimase in testa solo una cosa:

I numeri, nel computer, vengono memorizzati a partire dalla cifra meno significativa, o più semplicemente “al contrario”

Nel caso di un numero decimale, teoricamente significherebbe che “365” lo scriviamo “563”. Nel nostro caso la storia si fa un po’ più complessa, ma procediamo per gradi.

 

 

Cosa serve per iniziare?

Per prima cosa, una copia di backup del file di salvataggio su cui lavoreremo! Non si sa mai, si potrebbero far danni!

Come scritto nella premessa, teoricamente ho studiato informatica alle superiori, ma di tutto il percorso di studi, l’unica cosa che abbia mai messo in pratica è stata la nozione su come i numeri vengano memorizzati. Quello che qui ci serve è seguire la regola del potere.

Come nel Grande Mondo Reale™, infatti, anche nella nostra piccola realtà ludica regna una legge non scritta:

Chi ha le informazioni, ha il potere

Ma quali sono queste informazioni, e come possono essere utilizzate?

Le informazioni dipendono dal gioco specifico, ovviamente.

colonize

Nello screenshot qui sopra, da Sid Meier’s Colonization, ho evidenziato in rosso tre sezioni, due in cima (nome della città e soldi), ed una sul fondo (risorse della città). In altri giochi ci saranno altre informazioni; ad esempio, nei GdR le informazioni utili saranno i nomi dei personaggi, e le loro caratteristiche.

Se non conoscete Colonization, conoscetelo!

 

 

Cosa facciamo ora con questi numeri?

Per prima cosa li convertiamo in esadecimale (Hex), con l’aiuto di una calcolatrice (quella di Windows va bene), apriamo il savegame con un editor ASCII/Hex (Notepad non va bene, in questo caso), che ci dia i numeri in esadecimale, ed andiamo a cercarci questi dati.

Riprendiamo l’esempio di Colonization di cui sopra. I nostri 906,151 gold diventeranno, in esadecimale, 0D D3 A7. Come detto prima, le cifre vanno scritte in ordine inverso, diventando quindi A7 D3 0D. Questa è la stringa che dobbiamo cercare nel nostro savegame. Una volta individuata, possiamo modificarla per alterare i soldi a nostra disposizione, ma in che modo?

save-money

Come vediamo nello screenshot del salvataggio, la stringa è seguita da un byte di valore 00, poi uno di valore 37.

Ora, il 37 sicuramente “appartiene” a qualcos’altro, ma non siamo certi dello 00. La cosa più semplice è andare per tentativi (tutto il sistema si è sempre basato su questo, dopotutto!).

Proviamo a “massimizzare” il valore dei 4 byte, portiamolo su FF FF FF FF (4.294.967.295, tantissimo!), poi ricarichiamo il gioco:

after-max

Qualcosa non è andata proprio come ci aspettavamo, ma siamo comunque vicini al risultato ottenuto.

Questo -1 è per noi indicativo, in quanto ci spiega che il gioco gestisce i soldi come numeri interi relativi (quindi gli interi positivi e negativi).

Ne consegue, applicando una regola fissa dell’informatica nella gestione dei numeri interi relativi, la prima metà dei valori possibili con quei byte rappresenta i numeri positivi, mentre la seconda rappresenta i numeri negativi.

Andiamo quindi a posizionarci a metà valore, cambiando quel precedente FF FF FF FF in FF FF FF 7F (2.147.483.647, cioé tanto comunque!):

after-half

Questa volta ha funzionato! Quindi ora sappiamo con certezza come e dove andare a cambiare i valori per avere più soldi, vai con la flotta di galeoni e con le schiere di coloni!

Ma aspetta, non è finita!

Noi, però, non ci accontentiamo solo dei soldi, vero? Vogliamo anche che le nostre colonie abbiano tutte le risorse di cui necessitano, in modo da focalizzare la nostra flotta di galeoni (vedi su) nel trasporto delle schiere di coloni (vedi su di nuovo).

A questo punto, riprendiamo l’editor esadecimale, ed andiamo a cercare le nostre città. Prendiamo ad esempio Isabella, di cui allo screenshot più sopra.

Scorrendo scorrendo nel savegame, arriviamo al punto che ci interessa (i due byte che precedono il nome sono le coordinate sulla mappa, non mettete le città in mare, per favore):

colony

Ora, grazie allo screenshot di prima (ora è tutto molto più facile, lanciando i giochi sotto DOSBox, dato che possiamo avere più finestre aperte e non dobbiamo prendere gli appunti su carta come un tempo), vediamo le risorse di Isabella:

resources

La nostra Isabella ha Food(1), Sugar(50), Tobacco(0), Cotton(o), Furs(18), non abbiamo bisogno per ora di elencarle tutte. Partiamo dall’idea che il savegame utilizzi due byte per ogni risorsa (dato che con i magazzini la città può avere più di 300 pezzi per risorsa, sappiamo che il valore supera i 255 di un byte).

Dobbiamo, quindi, cercare una sequenza che sia (HEX) 01 00 32 00 00 00 00 00 12 00, che prontamente troviamo:

string

Se, infatti, controlliamo le due coppie di byte successive (HEX 24 00 9E 00) e le convertiamo in decimale, otteniamo 36 (Wood) e 158 (Ore).

La verifica finale la abbiamo con quel 2C 01, che corrisponde a 300 (Muskets). Ora che sappiamo dove sono conservate le risorse delle singole città, possiamo giostrarne i magazzini a nostro piacimento.

[spoiler]Ovviamente, un caotico malvagio come me andrebbe anche a cambiare, in peggio, le risorse nemiche, per prepararsi a conquistare le città affamate.[/spoiler]

Con un po’ di lavoro, ora che siamo a conoscenza della “dimensione” in byte della città, e della posizione delle risorse nella stessa, possiamo giostrare un po’ con i dati, e scoprire anche le altre informazioni.

Perché, dopotutto, spendere tempo e risorse per far crescere la città, quando possiamo semplicemente portarla al massimo con un rapido Hex-Editing?

Un suggerimento, alla cella 403 dello screenshot del savegame c’è una cella di valore 0C (12), e Isabella è una città da 12 abitanti. Ci sarà un collegamento tra i due?

[spoiler]Non cambiatelo, il gioco va in crash per il conflitto tra il numero di abitanti e gli effettivi abitanti all’interno, prima cercate di scoprire dove sono salvati gli abitanti all’interno…[/spoiler]

 

 

Posso fare altro con l’Hex-Editing?

Le possibilità sono limitate solo dalla pazienza, e dalla competenza.

Alcuni Hex-Editors vanno a volte a cambiare parti del codice stesso, ma le mie competenze in questo campo sono nulle, quindi non affronto l’argomento, posso dire che recuperai da qualche parte un file dati di X-Wing, da sovrascrivere all’originale, che consentiva ai caccia ribelli di avere la stessa armatura e potenza di fuoco (e volume di fuoco) di uno Star Destroyer classe Imperial!

Una modifica che ero solito fare ai tempi delle superiori, per evitare pagine di fotocopie, era di cercarmi nell’eseguibile o nei file dati le parole usate come protezione del gioco, e cambiarle con una parola standard.

Lo feci per X-Wing e per TIE-Fighter, per rivendere il file modificato ai compagni di scuola (loro sceglievano la “password universale”, io gli portavo il floppino, loro mi davano le mie 1.500 lire per il servizio).

Questo però non è sempre fattibile, in alcuni giochi non sono riuscito a trovare questi dati, e quindi ho mantenuto le fotocopie.

 

 

Un esempio completo (o quasi)

Veniamo alla parte che preferisco dell’Hex Editing, modificare i savegame dei videogiochi di ruolo.

La mia esperienza di Hex Editing in questo campo è focalizzata principalmente su Eye of the Beholder (di cui nell’intro e nella cover), ma ebbi una fase di interesse anche per altri giochi, tra i quali Wizardry 7 – Crusaders of the Dark Savant, del quale però, purtroppo, non riesco a trovare gli appunti (ma prima o poi me ne andrò in vacanza dai miei, e cercherò di ritrovare tutti i miei vecchi appunti, anche per altri giochi).

In EOB ho decifrato quasi interamente il blocco dati corrispondente ad un personaggio all’interno di un savegame.

Alcuni byte ancora mi sfuggono, dato che sono un po’ pigro nello sperimentare, visto che ciò che mi serve l’ho trovato che non trovo alcun “impatto” in gioco, e non li ho visti cambiare nel corso delle partite, ma voglio condividere quello che ho scoperto, anche perché EOB merita sempre di essere rigiocato, imho.

Il salvataggio di EOB si presenta così (per comodità mostro solo il blocco che ci interessa per il singolo personaggio):

eob-character

Questo è il primo personaggio del party (Arthur), ed andremo a studiare il savegame partendo da lui (i dati si ripetono con uno schema statico, quindi non c’è bisogno di analizzare tutto il party, basta fare attenzione alla posizione del personaggio).

Nel blocco-personaggio, avremo (in ordine):

  • 1 byte per lo “slot” del personaggio: questo byte serve solo a dire al programma “qui inizia il personaggio #”, il valore va da 00 a 05 (sei personaggi in tutto)
  • 1 byte di attivazione del personaggio: se 00 lo slot non viene popolato, se 01 lo slot viene popolato ed i dati successivi vengono letti, lasciate un solo slot a 01 per giocare in hard mode
  • 10 byte per il nome del personaggio: accetta alcuni caratteri speciali (.-?*, per esempio), ma non distingue tra maiuscole e minuscole, tutte le lettere diverranno maiuscole
  • 1 byte “sconosciuto”: non ho capito a cosa serva
  • 14 byte per le caratteristiche: allocati a coppie, indicano nell’ordine Forza (STR), percentuale della forza (per personaggi con 18), Intelligenza (INT), Saggezza (WIS), Destrezza (DEX), Costituzione (CON), Carisma (CHA). Il minimo è 1, il massimo è 25 (Hex 19). La coppia indica attuale/effettivo (in caso di effetti che alterino i punteggi)
  • 2 byte per i Punti Ferita: il valore massimo è 127 (Hex 7F), dopodiché va in negativo. Due valori per attuali/massimi
  • 1 byte per la Classe Armatura: al momento in cui indossate un’armatura o uno scudo verrà ricalcolata in automatico, il “top” è -127 (Hex 80)
  • 1 byte “sconosciuto”: non ho capito a cosa serva
  • 1 byte per razza e sesso: valori nella tabella seguente

race-sex-table

  • 1 byte per la classe: valori nella tabella seguente, non mi spiego l’esistenza di un Chierico/Mago/Mago, forse usata internamente al gioco per qualche funzione

class-table

  • 1 byte per l’allineamento: valori nella tabella seguente; si può avere finalmente un Paladino Caotico Malvagio! L’allineamento serve solo alle classi con incantesimi clericali per definire se possano avere i causa ferite (personaggi malvagi)

alignment-table

 

  • 1 byte per il ritratto: non ho fatto una tabella di conversione valore-ritratto, sperimentate direttamente voi
  • 1 byte per la fame: il valore va da 00 (affamato) a 64 (100% pieno)
  • 3 byte per i livelli: classe 1, classe 2, classe 3, potete lasciare a 00 quelli delle classi non attive
  • 12 byte per gli XP: 4 byte per ogni classe, potete lasciare a 00 00 00 00 quelli delle classi non attive. Il valore massimo è 7F FF FF FF (salvato come FF FF FF 7F), pari a 2,147,483,647 XP, più che sufficienti per il massimo livello. conviene fermarsi più in basso, per non andare in negativo quando si ammazzano mostri
  • 4 byte “sconosciuti”: non ho capito a cosa servano
  • 30 byte per gli incantesimi da mago memorizzati: 6 byte per ogni livello di potere, con l’Hex editing si possono memorizzare le palle di fuoco come incantesimi di primo livello, ma poi quando si riposa si torna alla normale divisione. Gli incantesimi Read MagicKnock mandano il gioco in crash quando vengono lanciati (divide error), mentre gli incantesimi Stinking CloudCloudkill non hanno alcun effetto. Valori nella tabella seguente

memorized-spells-list

  • 30 byte per gli incantesimi da chierico memorizzati: 6 byte per ogni livello di potere, con l’Hex editing si possono memorizzare le palle di fuoco come incantesimi di primo livello, ma poi quando si riposa si torna alla normale divisione. L’incantesimo Protection From Lightning non ha alcun effetto in gioco. Valori nella tabella seguente

memorized-cleric-spells

  • 4 byte per gli incantesimi da mago conosciuti: qui la cosa si fa un po’ più “scomoda” per chi non è pratico. Questi byte sono cumulativi, nel senso che sono la somma dei valori dei vari bit, e ad ogni valore del byte corrisponde una specifica lista di incantesimi. Avere, ad esempio, il byte numero 1 con valore 255 (Hex FF) significherà conoscere tutti gli incantesimi di primo livello, più l’incantesimo invisibility (secondo livello). I valori sono come nella tabella seguente (divisa per byte)

known-wizard-spells

  •  54 byte per l’inventario: ogni slot di inventario utilizza due byte. L’ordine degli slot è indicato dall’immagine seguente, e a questo link una tabella con la lista degli oggetti. Curiosità: sembrerebbe che mettere come valore della faretra (slot 17) E4 00 (Dec 228) corrisponda all’avere 26 frecce, e non sembra se ne possano avere di più (credo, ma non ho verificato, che sia la somma degli Hex delle varie frecce); non usando mai le frecce (la mia seconda fila è fatta di caster), francamente non mi interessa più di tanto
inventory-slots
  • 60 byte “sconosciuti”: ancora oggi non ho capito a cosa servano (fail per me? Forse si)

 

Ora che avete questa “miniguida” al savegame di EOB, potete iniziare il gioco con i vostri Guerrieri/Chierici in prima fila, e Ladri/Chierici/Maghi in seconda fila (per massimizzare le cure, avere l’artiglieria in seconda fila, ed anche gli scassinatori, che non fa mai male), con tutte le stat a 25, e l’equipaggiamento migliore. Pochi mostri saranno una sfida, in queste condizioni.

[spoiler]Probabilmente solo Xanathar alla fine, con le sue disintegrazioni e raggi della morte. Ma il sidestep aiuta a batterlo.[/spoiler]

 

 

Quali altri orizzonti?

Come già detto, le possibilità sono ampie. Tutto sta a raccogliere più informazioni possibili sui dati di gioco, e farsi il culo a trovarli ed impegnarsi ad individuarli nel file di salvataggio.

Vorrei giusto fare una nota “di merito” per X-Com (capitoli 1 e 2, gli altri non ho testato). Nella splendida saga degli alieni, infatti, esiste un folder per ogni savegame (GAME_##), al cui interno sono presenti diversi file .DAT, relativi ai diversi elementi di gioco. Qui c’è da divertirsi, alla ricerca delle locazioni dei diversi dati.

Un indizio: nel file delle basi, oltre alla struttura presente nella base, è indicato anche il tempo di costruzione rimanente…

 

 

Conclusioni

L’Hex Editing è stato per me un modo per “sentirmi nerd”, dato che tra amici, parenti, e compagni di classe/scuola nessun’altro riuscì a dimenarsi in questo ambito.

Si è trattata di una parentesi divertente, di “ricerca e sviluppo”, oserei dire, e mi fece anche guadagnare facilmente qualche spicciolo (che da adolescenti non fa mai male).

Se qualcuno è interessato all’argomento, sono sempre a disposizione per scambio informazioni.

P.S.: in tempi relativamente più recenti (parliamo comunque già di giochi di dieci o quindici anni fa), purtroppo, i programmatori hanno iniziato a salvare i dati in modo diverso (numeri cifrati e roba varia), e la mia pigrizia mi ha portato a non sfruttare più questa via, ma a cercarmeli sul web…

Gli hacker che hanno preso il controllo di Twitter erano dei ragazzini, ci è andata di lusso
Gli hacker che hanno preso il controllo di Twitter erano dei ragazzini, ci è andata di lusso
E se il mondo degli hacker di Watch Dogs Legion fosse il nostro?
E se il mondo degli hacker di Watch Dogs Legion fosse il nostro?
Ripple, Youtube, le truffe e le responsabilità delle piattaforme
Ripple, Youtube, le truffe e le responsabilità delle piattaforme
SurfingAttack, l'attacco informatico che sfrutta ultrasuoni e assistenti vocali
SurfingAttack, l'attacco informatico che sfrutta ultrasuoni e assistenti vocali
C'è un ransomware che prende di mira i giocatori di Fortnite
C'è un ransomware che prende di mira i giocatori di Fortnite
Les Hackers 1834
Les Hackers 1834
Malware Trends: dal Ransomware al Cryptomining
Malware Trends: dal Ransomware al Cryptomining