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 :
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 :
Chaque password est une combinaison de 6 personnages du jeu :
- Aladdin
- Jafar
- Sultan
- Apu (singe)
- Génie
- Jasmine
J'étaits en mesure de pouvoir tracer le programme avec cette outil :
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é.
C'est à l'adresse 0xA6 que nos choix de password sont stockés, on voit meme à quelle valeur correspond tel personnage :
- Jafar : 5
- Sultant : 4
- Apu : 3
- Génie : 2
- Jasmine : 1
- Aladdin : 0
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 :
Attention ils se lisent à l'envers ;) :
- Génie, Apu, Aladdin, Sultan
- Jafar, Apu, Jasmine, Génie
- Génie, Jafar, Aladdin, Apu
- Apu, Aladdin, Génie, Jasmine
- Jafar, Jasmine, Aladdin, Jafar
- Jasmine, Jafar, Sultan, Jasmine
- Aladdin, Jasmine, Apu, Sultan
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 :]