18/07/2011

Retour en enfance

Introduction

C'est en voyant des vidéos du site le joueur du grenier où le mec délire à finir un paquet de jeux old-school, ou encore voir des speed run sur speeddemosarchive, qu'une envie de ressortir les vieilles consoles prend le dessus.
C'est pour ça que je décide de m'amuser avec une vieille rom d'un jeu que j'ai pas mal apprécié, Aladdin :

aladdin_front.jpg

C'est l'occasion aussi de tester ce que vaut un tracer/debugger pour SNES.

Passwords

Dans le jeu Aladdin, tous les 2 - 3 levels, on nous donne un password à rentrer pour pouvoir revenir là où on en était la dernièere fois :

aladdin_password

Chaque password est une combinaison de 6 personnages du jeu :

J'étaits en mesure de pouvoir tracer le programme avec cette outil :

aladdin_snes

A partir de là le logiciel me crée des fichiers de logs : Aladdin0000.log, et en sortant les couteaux suisses : sort, uniq, cut en loguant quand le password est valide ou non, je fus en mesure de trouver la routine de vérification des password :

$84/ADE4 A0 00       LDY #$00
$84/ADE6 B6 A6       LDX $A6,y  [$00:00A6]
$84/ADE8 8A          TXA
$84/ADE9 D1 AA       CMP ($AA),y[$00:5555]
$84/ADEB F0 18       BEQ $18    [$AE05]
$84/ADED C2 21       REP #$21
$84/ADEF A5 AA       LDA $AA    [$00:00AA]
$84/ADF1 69 04 00    ADC #$0004
$84/ADF4 85 AA       STA $AA    [$00:00AA]
$84/ADF6 E2 20       SEP #$20
$84/ADF8 EE 0C 00    INC $000C  [$00:000C]
$84/ADFB AD 0C 00    LDA $000C  [$00:000C]
$84/ADFE C9 08       CMP #$08
$84/AE00 D0 E2       BNE $E2    [$ADE4]
$84/AE02 4C 7B AE    JMP $AE7B  [$00:AE7B]
$84/AE05 C8          INY
$84/AE06 C0 04       CPY #$04
$84/AE08 D0 DC       BNE $DC    [$ADE6]
$84/AE0A AD 0C 00    LDA $000C  [$00:000C]
$84/AE0D AA          TAX
$84/AE0E BD D6 FD    LDA $FDD6,x[$00:FDD6]
$84/AE11 8D 05 00    STA $0005  [$00:0005]
$84/AE14 8D 5C 03    STA $035C  [$00:035C]
$84/AE17 9C 5D 03    STZ $035D  [$00:035D]
$84/AE1A 22 0A 81 80 JSL $80810A[$80:810A]
$84/AE1E 4C 71 AE    JMP $AE71  [$00:AE71]
$84/AE21 89 08       BIT #$08
$84/AE23 F0 0E       BEQ $0E    [$AE33]
$84/AE25 A6 A5       LDX $A5    [$00:00A5]

Bon j'ai du apprendre vite fait l'assembleur du cpu de la SNES : 65c816, afin de comprendre comment retrouver tous les passwords sans trop de difficulté.

aladdin_val_pass

C'est à l'adresse 0xA6 que nos choix de password sont stockés, on voit meme à quelle valeur correspond tel personnage :

Revenons sur le code précédent, je vais le réecrire en pseudo-code pour ce qui ont du mal :

int	*pass_valid = 0xFD75;
cpt = 0;
begin:
y = 0;
test:
a = input[y]; /* (0xA6) */
if (a == *(pass_valid + y))
	y++;
	if (y != 4)
		goto test;
	else
		goto pass_valid;
pass_valid += 4;
cpt += 1;
if (cpt != 8)
	goto begin;
else
	/* Password failed : Restart du jeu */

En fait il y a 7 passwords possible qu'on va gentiment dumper :

aladdin_dump

Attention ils se lisent à l'envers ;) :

Voilà on a tous les passwords, bon on s'est quand meme bien fait chier car suffisait de google : "Password Aladdin SNES".
Mais bon le but c'était de s'amuser :]

aladdin_completed