2016-01-31 28 views
6

Un tempo, per curiosità, ho provato la modifica esadecimale del file eseguibile del gioco "Dangerous Dave". Ho cercato nel file tutte le stringhe che ho trovato e ho apportato alcune modifiche casuali per vedere se avrebbe effettivamente modificato il testo visualizzato all'interno del gioco.Riutilizzo dei caratteri nel file .exe compilato

Sono rimasto sorpreso di vedere il risultato, che ora ho ricreato utilizzando un editor esadecimale e DOSBox: enter image description here

Come si può vedere, la modifica dei due personaggi "RO" nella stringa "ROMERO" portato in 4 caratteri modificati, con il risultato che diventa "ZUMEZU". Sembra che il programma stia riutilizzando i due caratteri e li stampi all'inizio e alla fine di quella stringa.

Qual è la causa di questo? La mia prima ipotesi sarebbe cercare di rendere l'eseguibile più piccolo, ma solo il codice che riutilizza i caratteri probabilmente richiederebbe più spazio di quei 2 byte da salvare. E 'solo un trucco fatto dall'autore, o solo qualche compilatore voodoo?

risposta

5

Ingannevole da dire con certezza, senza reverse engineering, ma suppongo che molti dei dati costanti nel programma vengano compressi utilizzando un algoritmo dallo LZ family. Questi schemi di compressione funzionano essenzialmente nel modo in cui sono stati osservati: codificano sottostringhe ripetute come riferimenti a testo che è stato precedentemente decodificato.

Questi algoritmi di compressione sono stati probabilmente utilizzati per più di una sola stringa e non solo per il testo; è possibile che fossero anche usati per comprimere altri dati, come grafici o layout di livello. In breve, c'erano probabilmente risparmi significativi realizzati usando questo algoritmo!

L'utilizzo di questi algoritmi di compressione è comune nei vecchi giochi come un modo per risparmiare spazio su disco, ma non era automatico: l'implementazione di questo algoritmo sarebbe stata probabilmente l'aggiunta di Romero.

+0

Analogamente, ci sono due byte extra tra "SOFT" e "DISK, INC" - anche un'indicazione tipica della compressione bytewise. – usr2564301