I. Introduction▲
En 2016, la r2con a accueilli un ensemble de conférences autour de l'outil de rétro-ingénierie radare2. Dans cette conférence, Pau Oliva Fora (pof), consultant en sécurité, explique le fonctionnement du chiffrement présent sur les jeux d'arcade Capcom.
II. Vidéo▲
R2con 2016 - Hacker Street Fighter 2X : Chiffrement du CPS2 dans Radare2
III. Résumé▲
III-A. Capcom Play System 2▲
Le Capcom Play System 2 (CPS-2) est un système inventé par Capcom, composé de deux cartes (une pour la partie calcul, l'autre pour le jeu) pour les bornes d'arcade.
Le CPS-2 embarque un Motorola 68000 cadencé à 16 MHz et un Z80 à 8 MHz pour le son. La sortie vidéo permet l'affichage de 384 pixels sur 224 à 60 images par seconde.
Le CPS-2 est la deuxième version développée par Capcom. En plus d'avoir un processeur plus rapide que la première version, les jeux sont chiffrés pour empêcher les copies non officielles (bootlegs).
Pour le chiffrement, Capcom a placé une mémoire RAM soutenue par une batterie. La mémoire contient les clés pour déchiffrer le jeu. Par contre, lorsque la batterie est vide (5 à 10 ans), les clés sont perdues et le jeu ne peut plus démarrer (écran bleu fixe).
III-A-1. Historique▲
En janvier 2001, un groupe de hacker (CPS-2 Shock Group) a pu obtenir les données du jeu en bidouillant le matériel. Ensuite, grâce à une table XOR différentielle (de 8 Go), il a été possible de reproduire ces données à partir d'une ROM originale et donc, de faire de l'émulation.
En janvier 2007, le chiffrement a été complètement décortiqué par Andreas Naive et Nicola Samoria (auteur de M.A.M.E.). Le chiffrement n'affecte que les opcodes (les 16 bits de l'opcode et les 16 premiers bits de l'adresse). Celui-ci repose sur deux réseaux de Feistel de quatre tours et d'une clé sur 64 bits.
En avril 2016, Artemio Urbina, Ian Court et Eduardo Cruz ont complètement rétro-ingénieré la sécurité du CPS-2 rendant ainsi possible une récupération et restauration du jeu sans modification matérielle.
III-A-2. Restauration d'un jeu (avant 2016)▲
Pour récupérer un jeu mort suite à la décharge de la batterie, vous devez :
- déchiffrer toutes les données chiffrées ;
- détourner les lectures et écritures réalisées en 0x400000-0x40000A vers la région 0xFFFFF0-0xFFFFFA ;
- corriger les routines d'effacement pour nettoyer cette région lors des activités de nettoyage de la mémoire ;
- corriger toutes les sections du code du jeu qui utilisent la région afin d'utiliser une autre région ;
- reprogrammer l'EPROM avec la ROM déchiffrée ;
- dessouder la batterie ;
- court-circuiter les deux pattes du condensateur à côté de la borne + de la batterie pendant quelques secondes ;
- démarrer le jeu.
III-B. Super Street Fighter 2X▲
III-B-1. Débogage▲
Vous pouvez lancer l'émulateur avec le débogage actif grâce à la commande suivante :
mame -debug ssf2xj
Puis ouvrir la fenêtre mémoire et aller à l'adresse 0xFF844E (décalage 0x400 pour radare2). Cette partie de la mémoire contient les informations liées au premier joueur.
Ensuite, grâce à LUA, vous pouvez manipuler l'émulateur à l'aide des fonctions suivantes :
- memory.readbyte(), memory.readword(), memory.writebyte(), memory.writeword(), gui.text(), emu.frameadvance().
III-B-2. Triche (RAM)▲
Grâce à l'émulateur, vous pouvez tricher dans le jeu en modifiant les valeurs en mémoire. Pour le chronomètre, vous pouvez analyser le comportement de la mémoire. Si vous trouvez une valeur qui diminue (et qui correspond à ce qui est actuellement à l'écran), vous n'avez plus qu'à la fixer.
Un fichier de triche dans M.A.M.E. s'écrit en XML :
<cheat
desc
=
"Infinite Time"
>
<script
state
=
"run"
>
<action>
maincpu.pb@FF8DCE=99</action>
</script>
</cheat>
Dans la ligne d'action, on indique le CPU concerné par l'opération, avec p, l'espace mémoire impliqué et avec b (byte), la taille mémoire.
Une triche en RAM ne sera présente qu'au cours de l'exécution du jeu et ne modifie pas le jeu en lui-même, mais le comportement du jeu retranscrit par l'émulateur.
III-B-3. Triche (ROM)▲
Une fois que vous savez où sont stockées les variables intéressantes en mémoire, vous pouvez modifier la ROM afin d'appliquer la triche définitivement (ou de faire une ROM spéciale avec une triche fonctionnelle sur le matériel original). Pour cela, vous allez observer toutes les fonctions pouvant modifier la zone mémoire préalablement identifiée. Ensuite, il faudra modifier le code assembleur pour appliquer votre nouvelle logique au code.
III-B-3-a. Chiffrement/Déchiffrement du CPS-2▲
Le seul programme capable de chiffrer/déchiffrer une ROM CPS-2 est X.C.O.P.Y., mais il est difficilement retrouvable.
Vous pouvez toutefois reproduire ce comportement en portant le code de déchiffrement de M.A.M.E. dans radare2. Ce dernier vous permettra de déchiffrer la ROM, de la patcher et de la chiffrer.
IV. Ressource▲
Vous pouvez télécharger le diaporama de la conférence.
V. Commenter▲
Vous pouvez commenter et donner vos avis dans la discussion associée sur le forum.