[WIP] Décryptage de Wonderboy in Monsterland

Exposez vos projets et créations (sticks, superguns...)

[WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 20 Novembre 2013, 18:07

Lors de mon dernier déplacement chez mpatou en pays ruthénois, ce dernier venait juste de recevoir sa plaque originale de Wonderboy in Monsterland, équipée de son fameux processeur suicide MC8123 (en fait un Z80 modifié).
Même si le jeu fonctionnait parfaitement, Mathieu était quand même inquiet vis à vis de la possibilité de suicide de sa plaque.
De plus, les textes in game étaient en japonais, ce qui empêchait la compréhension de certaines questions cruciales présentes vers la fin du jeu.

Il existe déjà un set décrypté chez retroclinic, disponible en version anglaise d'ailleurs, mais ce dernier emploie des eproms de taille doublée par rapport à l'original (64Kb au lieu de 32Kb), et il nécessite de faire des modifications physiques sur la carte pour être utilisé.

La raison du doublage de capacité des eproms est simple, et c'est d'ailleurs le même principe qui est utilisé dans les versions bootlegs du jeu : en gros, les roms programmes sont cryptées, mais de façon différente selon que ce soit des opcodes ou des données.

<aparté technique>

Avant d'aller plus loin, faisons un petit peu de théorie : les opcodes sont les instructions de bas niveau permettant de programmer un processeur en utilisant un langage qui s'appelle l'assembleur. C'est le langage de plus bas niveau (appelé aussi langage machine).
Chaque processeur a ses propres opcodes (et donc son propre assembleur), ce qui oblige à réapprendre le fonctionnement à chaque fois.

Par exemple, dans le cas du Z80, l'instruction ADD HL,BC ajoute le contenu du registre BC au registre HL. L'opcode correspondant à cette instruction est 09 (en hexa). C'est une intruction simple : un seul octet, et pas d'opérandes/données.
L'instruction JP nn permet de faire un saut dans le code afin d'exécuter l'instruction dont l'adresse est spécifiée par nn. L'opcode correspondant à cette instruction est C3 XX XX. Elle se compose de l'opcode (C3), puis de 2 octets variables spécifiant l'adresse de destination du saut. Ces deux octets correspondent aux données de l'instruction.

Chaque instruction du Z80 fait entre 1 et 4 octets en taille, celle de l'opcode varie entre 1 et 3 octets, et celle des données entre 0 et 2 octets.

</aparté technique>

(j'ai comme l'impression d'avoir perdu 99% de mon lectorat :runik: )

Si nous revenons à nos données décryptées évoquées plus haut, et au fait qu'elles fassent le double de la taille des données encryptées, l'explication est simple : le code original a été décrypté complètement une première fois comme si c'était des opcodes (la partie basse de l'eprom doublée), puis une deuxième fois comme si c'était des données (la partie haute de l'eprom doublée).
Ainsi toutes les données décryptées sont présentes dans l'eprom doublée, et la modif physique de la pcb permet de sélectionner soit les opcodes soit les données correctes dans la rom à l'exécution.

Le Z80 d'origine lui décrypte les opcodes/données à la volée.

Je pense qu'il est possible de tout faire rentrer dans une eprom de 32Kb, un peu de la même façon que ce que j'ai fait pour les FD1094.
Le principe serait de remplacer directement dans la rom d'origine les opcodes cryptées par leur version décryptée, et de faire la même chose pour les opérandes/données, la difficulté étant de faire la distinction correcte opcode/données pour chaque instruction.

Liste des choses à faire :
1) Développer un petit programme reprenant les routines de décryptage du MC8123 contenues dans Mame
2) Ajouter à ce programme la détection du format des opcodes
3) Décrypter ensuite les données encryptées en utilisant la détection du point 2
4) Générer automatiquement les fichiers binaires à partir des données décryptées
5) Compiler une version spécifique de Mame pour tester les fichiers générés
6) Tester sur le vrai hardware
7) Rendre le programme générique afin de pouvoir décrypter les autres sets encryptés à base de MC8123

Bon, ben y a plus qu'à :D
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par crebou » 20 Novembre 2013, 19:21

pfiou, en effet, y'a plus qu'à :popco:
J'ai légèrement décroché au milieu ^^

J'aurai bien aimé servir de beta testeur, mais c'est la seule pcb Sega que j'ai en bootleg il me semble :(
D'ailleurs, je ne devais pas tester quelques uns de tes sets decryptés Runik ?
Si oui, j'ai récupéré une bonne partie de mes pcb si tu veux...
Avatar de l’utilisateur
crebou
 
Message(s) : 151
Inscription : 23 Juillet 2013, 18:53

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Ryuga » 20 Novembre 2013, 19:44

Et bien il s'agit d'un projet ambitieux et de grande envergure!
Je suis totalement impuissant et dépassé par un tel travail, durant mes études j'ai passé pas mal de temps à fouiner dans le langage C et compiler le tout (d'où la taille au moins doublée comparativement à de l'assembleur pur).
Je garde un très mauvais souvenir de cette partie de ma scolarité de plus quand tu sais que tu ne peux pas vraiment travailler de manière universelle...

En somme: je reste admiratif devant ce projet vu mon impossibilité et ma connaissance (ça fait pas loin de 10ans que je promets à mon père de me lancer dans la programmation ^^).

Donc, pour ma part, je reste avec mon fer à souder dans mon domaine: la réparation.

N'hésite pas à alimenter ce topic en détaillant, si possible, tout ton travail vu que je suis über intéressé!

Merci à toi de nous faire partager tes connaissances.

Tu programmes directement en assembleur?
Avatar de l’utilisateur
Ryuga
 
Message(s) : 657
Inscription : 13 Janvier 2013, 03:46

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 20 Novembre 2013, 20:20

@Runik: Ce topic tombe à point nommé :) , je vais le suivre avec la plus grande attention. Merci encore pour tout

@Crebou: envoie moi une photo de ta PCB, je te dirai si c'est un boot ou pas (c'est quel jeu au fait?)
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 20 Novembre 2013, 22:42

@crebou : t'inquiète pas pour les sets CPS1, Dlfrsilver a décrypté tous ceux qui manquaient, je n'ai pas eu à bosser plus en avant dessus ;)
Ils sont d'ailleurs tous dispos sur The Dead Battery Society.

@Ryuga : pas de souci pour détailler, Mathieu m'avait aussi demandé de le faire car ça l'intéresse autant que toi ;)
Pour répondre à ta question, je ne programme pas directement en assembleur, mais il m'arrive de rajouter certaines routines en assembleur au milieu de code en C ou en C++ afin d'optimiser certaines parties bien spécifiques ...
Je te rassure, j'ai étudié un peu l'assembleur 68000 pendant mon DUT (ça fait plus de 15 ans déjà :| ), et j'avais eu des résultats catastrophiques (je me souviens d'un 4/20 à un examen :P ), je n'y trouvais aucun intérêt à l'époque ... mais ça fait quelques années que j'ai changé d'opinion :O:
Je suis loin d'être un gourou de l'assembleur, mais j'arrive à me débrouiller sur les architectures Hitachi SH1/2/3/4, Intel x86 et Motorola 68000. Le Zilog Z80 en revanche, je découvre ... mais on retrouve quand même de grands principes identiques entre les différentes architectures, ce qui permet de ne pas être totalement perdu non plus.
Et puis c'est quand même sympa de pouvoir lancer un jeu dans Mame en mode débug, de suivre le code 68000 et de voir ce qu'il fait ... on a parfois des surprises ;)
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 21 Novembre 2013, 13:44

Sur le site de Retroclinic, il dit qu'il faut mettre un z80a à la place du NEC MC-8123. Tout ce que j'ai sous la main c'est un Z80 (tout court). Apparemment le z80a tourne à 4MHz contre 2.5MHz pour le z80 de base. Ça risque de poser un problème à terme non?

Au cas où c'est pas bon, j'ai trouvé des z80b (à 6Mhz) pas chers, plus rapide, est-ce que je peux utiliser ça?
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 21 Novembre 2013, 14:38

Bon, étape 1 terminée :)

Faisons un peu d'analyse de données : j'ai sorti les 16 premiers octets des 3 cas possibles :
C762F87CF54E5616492AF8A2584DF916 -> encrypted
F33101A4C3E207A25F16011919C969A2 -> decrypted (opcodes)
ECAE00C8A74F03FF9BAA0050EC35FFFF -> decrypted (data)

Si on regarde le premier octet de la séquence (C7), il se décrypte en F3 pour les opcodes, et en EC pour les données. Une rapide recherche dans la liste des instructions du Z80 me permet de voir que F3 correspond à l'instruction DI (Disable Interrupts), qui a une taille de 1 octet et pas d'opérande. La partie données ne sert donc a rien.
On passe à l'instruction suivante : 31, qui correspond à LD SP,NN, qui fait 3 octets de long et a 2 octets d'opérandes. Il faut donc récupérer les deux octets suivants dans la partie données décryptées, ce qui correspond à 00 C8.

Voici un récapitulatif du décodage des 16 premiers octets, avec en vert la partie à garder, et en rouge la partie incorrecte :
F33101A4C3E207A25F16011919C969A2 -> decrypted (opcodes)
ECAE00C8A74F03FF9BAA0050EC35FFFF -> decrypted (data)

Ce qui donne, une fois tout remis dans le bon ordre, le code décrypté :
F33100C8C34F03A25F16001919C969A2

On enchaine avec le point 2 :)

@mpatou : comme on dit, qui peut le plus peut le moins ;) En gros tu pourras toujours mettre un processeur plus rapide, il adaptera sa vitesse, par contre l'inverse est plus délicate : ton processeur peut ne pas fonctionner, et s'il fonctionne malgré tout il chauffera beaucoup plus car il n'est pas prévu de fonctionner à cette fréquence, et ça réduira d'autant sa durée de vie ...
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 21 Novembre 2013, 19:58

J'ai commandé 3 z80b pour être sûr :D
Ça peut toujours servir...
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 22 Novembre 2013, 16:39

Je viens de relire ton post avec le décryptage des 16 premiers octect de la rom EP11031a. Si j'ai bien compris, non seulement tu as déjà crée le programme pour appliquer la clé de décryptage, mais tu as trouvé comment faire la différence entre les opcodes et les data? Où c'est juste pour les 16 premiers octets? Et comment tu as réussi à faire la différence entre data et opcodes (si c'est pas trop compliqué à expliquer)?

J'ai (ré)installé un éditeur hexadécimale pour suivre et essayer de comprendre ce que tu fais
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par crebou » 22 Novembre 2013, 19:07

@mpatou: pas besoin de chercher ma pcb, c'est bien un boot :(

@Runik: ok, j'ignorais d'ailleurs l'existence du site jammarcade.net pour les sets décryptés Sega
Avatar de l’utilisateur
crebou
 
Message(s) : 151
Inscription : 23 Juillet 2013, 18:53

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 24 Novembre 2013, 00:21

@mpatou : en fait le MC8123 est bien plus simple que le FD1094 à décrypter, car le fichier encrypté contient les opcodes encodées d'une certaine manière et aussi les données encodées d'une autre manière.
Donc pour faire le décryptage, il suffit de faire une première passe en décryptant comme si c'était des opcodes -> tu te retrouves avec un fichier qui contient les opcodes décryptées correctement, et des opérandes incorrectes car pas décryptées dans le bon mode.
Une fois que tu as les opcodes, tu sais pour chacune quel est le nombre d'opérande, et ça te permet de les récupérer correctement décryptées en mode données ...
Pour trouver les opcodes, il suffit de prendre la liste des instructions du Z80, par ex. http://www.z80.info regorge d'information.
Tu me dis si c'est suffisamment clair, ou si je dois faire une approche différente :runik:

@crebou : porchy (le webmaster de Jammarcade) m'avait proposé de mettre en ligne les sets FD1094 que je décryptais en début d'année, d'autres se sont rajoutés à la liste, et maintenant ça fait une alternative viable (et gratuite !) à segaresurrection ;)
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Braintrash » 24 Novembre 2013, 21:43

Sujet génial !
Braintrash
 
Message(s) : 681
Inscription : 17 Mars 2013, 11:54

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 25 Novembre 2013, 10:23

Merci pour toutes ces précieuses information. En fait tu repères les instructions du z80 et par défaut tu déduis le reste. Tu vas automatiser le processus ou tu fais tout à la main?
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 25 Novembre 2013, 10:53

C'est ça.
Je vais automatiser oui, parceque si je dois me cogner 3 fichiers de 16Ko à la main, j'en ai jusqu'à fin 2014 :clown:
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 25 Novembre 2013, 13:28

Et concrètement, comment avec une clé de décryptage on décrypte une rom?
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 25 Novembre 2013, 14:29

Je peux te filer le lien des routines qui font ce que tu demandes (http://mamedev.org/source/src/mame/machine/mc8123.c.html), par contre ne compte pas sur moi pour te l'expliquer :P
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 25 Novembre 2013, 14:34

Bon, j'ai regardé, je ne comprends rien. On en discutera de vive voix
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par Runik » 29 Novembre 2013, 17:11

Bon, petit update : après avoir corrigé quelques petits bugs dans la génération des fichiers décryptés, j'ai fait quelques comparaisons entre le fichier doublé fourni par retroclinic, et ceux créés par mon appli dans la même configuration.
Wonderboy se compose de 3 fichiers programmes :
- ep11031a.90 : 80 octets différents sur 65536 (pas trop mal)
- epr11032.91 : 64687 octets différents sur 65536 ( :bobo: pas bien du tout)
- epr11033.92 : 32547 octets différents sur 32768 ( :bobo: pas bien du tout)

Je me suis souvenu qu'il y avait une version décryptée de la rom sonore de Ninja Kid 2 (utilisant le même processeur que Wonderboy) dispo sur ce site.
Je l'ai comparée avec la version que j'ai générée avec mon programme, et le résultat n'est pas terrible : environ 22% des données est décodée correctement avec mon programme.
Ce qui signifie que la méthode utilisée n'est pas suffisante pour fonctionner telle quelle, il lui manque des morceaux.

Je vais devoir repartir sur une méthode ressemblant un peu à celle utilisée pour le FD1094 : je vais d'abord faire un premier passage pour remplir le fichier décodé avec les valeurs décryptées comme opérandes, puis un deuxième passage avec les données décryptées comme opcodes sur lequel je vais suivre tous les chemins possibles empruntés par le programme à l'exécution ... chaque opcode sera ainsi copiée dans le fichier décrypté, et les endroits où le programme ne sera pas passé seront de fait considérés comme des données.
Il y aura sûrement des cas particuliers en plus, mais ça reste une bonne base de travail :)
AGAR v1.2.2 est sorti !
Avatar de l’utilisateur
Runik
 
Message(s) : 458
Inscription : 12 Janvier 2013, 22:45

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par mpatou » 30 Novembre 2013, 10:11

Runik, j'aime ton style...
Par contre, je me demandais si il serait possible d'adapter ta méthode au romset dumpé de la virtual console, étant donné que ce dernier contient la seule vraie traduction officielle et disponible de ce jeu?
Image Anciennement mpatard Image
Avatar de l’utilisateur
mpatou
 
Message(s) : 1260
Inscription : 14 Janvier 2013, 16:37

Re: [WIP] Décryptage de Wonderboy in Monsterland

Message par DracoeL » 30 Novembre 2013, 13:36

J'ai relu ce topic 2 fois pour être sur de comprendre :) .
J'ai pas tout compris :pac: .
Mais je vais le relire encore 2 fois pour être OP car c'est intéressant et que ça me botte de comprendre ;) .

En tout cas super taf Runik, si jamais tu veux des bootlegs SEGA ou des System 2 pour tester n'hésite pas.
[centrer]Strider, Mark of Bubble !
Avatar de l’utilisateur
DracoeL
Vieux Jammatophage
 
Message(s) : 1696
Inscription : 13 Janvier 2013, 04:31

Suivant

Retour vers Créations

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité