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 :

 

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...