Pas de nouvel article ne veut pas forcément dire que je me la coule douce sur une île paradisiaque en profitant des revenus publicitaires mirobolants du site. Et d'un, il n'y a pas de pub sur CPR et de deux, les quarante visiteurs quotidiens qui sont arrivés ici par hasard en faisant une recherche sur "Kobo", ne me permettront jamais de remplir ma piscine de champagne. Cela tombe bien car de toute façon je n'aime pas le champagne ! Tout ceci pour dire que non, je ne reste pas inactif, bien au contraire. Je bricole deci delà quelques trucs (oui je reste vague exprès !) mais pour le moment rien ne débouche sur du concret et encore moins sur l'écriture d'un article soporifique de quinze pages dont j'ai le secret. Autre activité régulière, il y a encore (et toujours), la numérisation et/ou le test de nouvelles disquettes qui refont régulièrement surface...
Et c'est justement pendant ce travail ô combien fastidieux (mais nécessaire) que je suis tombé sur la version du jeu Alter Ego cracké par la fine équipe d'ACS à savoir The Gog's, Deny et Spk. Lors du boot du jeu s'affiche une petite page texte nous invitant à signer le disque ! Je parle ici plus d'invitation que de défi véritable car comme vous allez le voir, nous sommes bien loin du défi ACS de Championship Wrestling ! Sur Alter Ego, tout sera très simple et bouclé en 5 minutes chrono. Mais dans un souci d'exhaustivité (car c'est cela le journalisme total !), je ne pouvais pas ne pas en parler dans cette rubrique !
Première chose à faire, on affiche le contenu du Boot Sector (Piste $00/Secteur $00, je ne vous apprends rien j'espère) sous Diskfixer et on jette un œil au code qu'il contient. On reconnaît immédiatement un Boot Sector de type Dos 3.3 avec son fameux JMP ($08FD) en $[08]4A. Puisqu'on est cultivé et de bon goût, on sait également que ce JMP indirect nous enverra tout droit en $B700 et que le contenu de la page $B7 sur disque est Piste $00/Secteur $01. Ne réfrénons pas notre curiosité maladive et allons donc voir ce que le secteur suivant nous cache. Next !
On repère tout de suite le JMP $9B00 en $[B7]41 particulièrement louche ! Remplaçons le par un JMP $FF59 (4C 59 FF) pour générer un saut Monitor et ainsi vérifier que l'on récupère effectivement la main avant l'affichage de l'intro texte (et donc confirmer que nous ne faisons pas fausse route).
On sauve, on reboot et effectivement le saut Monitor nous rend le contrôle juste avant l'apparition du blabla ACS. La suite logique, c'est bien évidemment de lister le code présent en $9B00 :
9B00- A9 00 LDA #$00 9B02- 8D F2 03 STA $03F2 9B05- A9 C6 LDA #$C6 9B07- 8D F3 03 STA $03F3 9B0A- 49 A5 EOR #$A5 9B0C- 8D F4 03 STA $03F4 9B0F- 20 2F FB JSR $FB2F ; INIT 9B12- 20 58 FC JSR $FC58 ; HOME 9B15- A0 00 LDY #$00 9B17- B9 00 9C LDA $9C00,Y ; base en $9C00 pour le premier texte 9B1A- 49 7F EOR #$7F ; décodage #7F série 1 & 2 9B1C- A2 FF LDX #$FF ; effet 9B1E- 8D 30 C0 STA $C030 ; sonore 9B21- CA DEX ; type 9B22- D0 FA BNE $9B1E ; téléscripteur... 9B24- C9 00 CMP #$00 ; fin de texte ? 9B26- F0 11 BEQ $9B39 9B28- 20 ED FD JSR $FDED ; COUT (affichage caractère) 9B2B- 4D FF 9C EOR $9CFF ; "calcul checksum" 9B2E- 8D FF 9C STA $9CFF ; et sauvegarde 9B31- A9 80 LDA #$80 9B33- 20 A8 FC JSR $FCA8 ; WAIT (pause pour l'effet visuel) 9B36- C8 INY 9B37- D0 DE BNE $9B17 9B39- 2C 10 C0 BIT $C010 ; BIT remplacé par un RTS en (1) 9B3C- AD 00 C0 LDA $C000 ; attente appui... 9B3F- 10 FB BPL $9B3C ; ...d'une touche pour continuer 9B41- AD FF 9C LDA $9CFF ; lecture du checksum ; LDA remplacé par un RTS en (2) avant la troisième série 9B44- C9 68 CMP #$68 ; on vérifie que c'est la bonne valeur 9B46- D0 FE BNE $9B46 ; sinon on boucle ! 9B48- A9 60 LDA #$60 ; 9B4A- 8D 39 9B STA $9B39 ; (1) RTS 9B4D- A9 86 LDA #$86 ; $9C86 devient la base pour le second texte 9B4F- 8D 18 9B STA $9B18 9B52- 20 58 FC JSR $FC58 ; HOME 9B55- 20 15 9B JSR $9B15 ; affichage seconde série 9B58- A9 9B LDA #$9B ; $9B86 devient la base pour le troisième texte 9B5A- 8D 19 9B STA $9B19 ; 9B5D- A9 60 LDA #$60 ; (2) RTS 9B5F- 8D 41 9B STA $9B41 ; plus de checksum après la première série ! 9B62- A9 AD LDA #$AD 9B64- 8D 39 9B STA $9B39 ; on remet LDA $C010 pour le troisième passage 9B67- A9 2C LDA #$2C ; BIT au lieu de STA pour le troisième passage 9B69- 8D 2E 9B STA $9B2E ; (de façon à ne plus modifier $9CFF) 9B6C- A9 6E LDA #$6E ; EOR #$6E : décodage troisième série de texte 9B6E- 8D 1B 9B STA $9B1B 9B71- 20 15 9B JSR $9B15 ; affichage troisième série 9B74- 2C 50 C0 BIT $C050 ; suite du boot... 9B77- 2C 52 C0 BIT $C052 9B7A- 2C 57 C0 BIT $C057 9B7D- 2C 55 C0 BIT $C055 9B80- 4C 84 9D JMP $9D84 |
Et voilà tout y est :
- L'affichage des messages textes (en 3 phases distinctes).
- Le décodage des deux premières séries de texte par un EOR #$7F.
- Le checksum qui vérifie si on n'a pas touché au premier message (signature des crackers).
- Et ensuite le décodage de la troisième série (celle qui nous concerne directement car contenant la partie à signer) par un EOR #$6E.
On remarque que le code s'automodifie afin d'être réutilisé pour l'affichage de chaque partie de texte. La même portion de code sera donc exécutée trois fois avec de petites variations à chaque passage : attente ou non de l'appui d'une touche et vérification ou non du checksum du texte affiché. Car effectivement le plus important ici, c'est la neutralisation du checksum après le premier affichage texte. Ce qui veut tout simplement dire qu'il n'y aura pas à s'en soucier lors de l'ajout de notre propre signature. On repère également que la partie à signer est localisée en mémoire à partir de $9B86, soit dans la même page mémoire que la routine (et donc au même endroit sur disque).
On retourne sous Diskfixer pour y faire une recherche Hexa sur "A9 00 8D F2 03" et localiser ainsi sur disque où se trouve la page $9B. Un indice chez vous : c'est en Piste $00, Secteur $0A que cela se passe !
Il ne reste alors plus qu'à utiliser les fonctions de MASK de Disfixer : touche X pour mettre $6E pour le EOR (laissez les autres valeurs par défaut). Faire CTRL+T pour activer le Mask et sous nos yeux ébahis, apparaît alors la partie du texte qu'il faudra compléter par notre signature. On peut directement éditer le texte sous Diskfixer (Mask Actif). Une fois terminé, on désactive le Mask (de nouveau par CTRL+T) pour déEORer et on sauve le secteur en question. N'oubliez pas de désactiver avant de sauver sinon ce sont des octets EORés qui seront sauvés et tout sera corrompu. Plantage assuré au reboot lors de l'exécution de la routine !
Sur le secteur suivant (qui correspond à l'espace mémoire $9C00), on peut également, par le même principe, afficher en clair les deux premiers messages (en mettant $7F pour le EOR du Mask). Ne changez rien ici, déjà parce que c'est mal de "défacer" et ensuite parce que le checksum vous enverra dans une boucle sans fin (si vous avez compris le listing ci-dessus, vous avez toutes les cartes en main pour corriger cela mais chut ! Je n'ai rien dit).
Les modifications une fois effectuées, on relance et on constate avec satisfaction que le boot se poursuit tout à fait normalement, aucun checksum fourbe ne se déclenche, pas de vérif cachée, rien ! Une formalité je vous avais prévenu...
L'unique intérêt de ce mini défi est qu'il permet de se familiariser concrètement avec le mode MASK de Diskfixer, une fonction très puissante qui, dans ce genre de situations, permet de gagner un temps fou. À utiliser sans modération donc...
Téléchargements :
- Alter Ego (version ACS) non signé - 6 faces.
- Alter Ego Signed - face 1.
Message perso à Johnny Depp : si jamais tu dois vendre ton île pour payer une pension alimentaire à Vanessa,
contacte-moi please, on doit pouvoir s'arranger...
envoyé le 17-07-2012 à 21 h 35 min
Je te croyais en vacances, pas en train de disséquer du 65(c)02 !
av
envoyé le 18-07-2012 à 9 h 30 min
Des vacances ? Quelles vacances ?!