Les défis, quand y'en a plus, y'en a encore ! Alors que je croyais avoir fait le tour de tous ceux disponibles sur la scène française, j'en ai découvert un nouveau très récemment et dans Déplombage Mode d'Emploi qui plus est ! Je suis encore en train d'essayer de comprendre comment il a pu m'échapper jusqu'à présent.  À propos, si vous connaissez des défis à côté desquels je serais également passé, n'hésitez pas à me contacter pour me les signaler ! Celui qui nous intéresse aujourd'hui est très classique : il s'agit de signer une page texte qui s'affiche après l'intro du disque. Rien de particulier à noter (pas de prompt DOS ou autres petites douceurs remarquables), et en plus, ça charge vite. Sans doute un Fast Boot, ce qui ne serait pas une surprise pour une production Godfather et Kristo.

On va donc comme d'hab, boot tracer tranquillou pour en savoir un peu plus :

On obtient après le Boot 0 :

*801L
 
0801-   E0 60       CPX   #$60
0803-   2C 10 C0    BIT   $C010
0806-   EA          NOP
0807-   EA          NOP
0808-   A9 B6       LDA   #$B6
080A-   85 27       STA   $27
080C-   BD 8C C0    LDA   $C08C,X
080F-   10 FB       BPL   $080C
0811-   49 D5       EOR   #$D5
0813-   D0 F7       BNE   $080C
0815-   BD 8C C0    LDA   $C08C,X
0818-   10 FB       BPL   $0815
081A-   C9 AA       CMP   #$AA
081C-   D0 F3       BNE   $0811
081E-   BD 8C C0    LDA   $C08C,X
0821-   10 FB       BPL   $081E
0823-   C9 AD       CMP   #$AD
0825-   D0 EA       BNE   $0811
0827-   A9 00       LDA   #$00
0829-   A0 56       LDY   #$56
082B-   84 3C       STY   $3C
082D-   BC 8C C0    LDY   $C08C,X
0830-   10 FB       BPL   $082D
0832-   59 D6 02    EOR   $02D6,Y
0835-   A4 3C       LDY   $3C
0837-   88          DEY
0838-   99 00 03    STA   $0300,Y
083B-   D0 EE       BNE   $082B
083D-   84 3C       STY   $3C
083F-   BC 8C C0    LDY   $C08C,X
0842-   10 FB       BPL   $083F
0844-   59 D6 02    EOR   $02D6,Y
0847-   A4 3C       LDY   $3C
0849-   91 26       STA   ($26),Y
084B-   C8          INY
084C-   D0 EF       BNE   $083D
084E-   BC 8C C0    LDY   $C08C,X
0851-   10 FB       BPL   $084E
0853-   59 D6 02    EOR   $02D6,Y
0856-   D0 48       BNE   $08A0
0858-   A0 00       LDY   #$00
085A-   A2 56       LDX   #$56
085C-   CA          DEX
085D-   30 FB       BMI   $085A
085F-   B1 26       LDA   ($26),Y
0861-   5E 00 03    LSR   $0300,X
0864-   2A          ROL
0865-   5E 00 03    LSR   $0300,X
0868-   2A          ROL
0869-   45 2B       EOR   $2B
086B-   91 26       STA   ($26),Y
086D-   C8          INY
086E-   D0 EC       BNE   $085C
0870-   E6 27       INC   $27
0872-   A2 60       LDX   #$60
0874-   CE A4 08    DEC   $08A4
0877-   D0 93       BNE   $080C
0879-   20 58 FC    JSR   $FC58
087C-   A0 28       LDY   #$28
087E-   B9 A5 08    LDA   $08A5,Y
0881-   49 12       EOR   #$12
0883-   99 FF 03    STA   $03FF,Y
0886-   88          DEY
0887-   10 F5       BPL   $087E
0889-   20 8F 08    JSR   $088F
088C-   4C E9 08    JMP   $08E9
088F-   A9 00       LDA   #$00
0891-   8D F2 03    STA   $03F2
0894-   A9 C6       LDA   #$C6
0896-   8D F3 03    STA   $03F3
0899-   49 A5       EOR   #$A5
089B-   8D F4 03    STA   $03F4
089E-   A9 20       LDA   #$20
08A0-   85 E6       STA   $E6
08A2-   60          RTS
...
...
08EA-   00          BRK
08EB-   B9 CF 08    LDA   $08CF,Y
08EE-   99 07 05    STA   $0507,Y
08F1-   C8          INY
08F2-   C0 1A       CPY   #$1A
08F4-   D0 F5       BNE   $08EB
08F6-   A9 FF       LDA   #$FF
08F8-   20 A8 FC    JSR   $FCA8
08FB-   4C 00 B6    JMP   $B600 ; vers le BOOT2
08FE-   F0 FE       BEQ   $08FE

Pas besoin de chercher plus loin, ceux qui ont lu mon article récent sur les Fast Boot reconnaîtront immédiatement le Boot 1 que l'on rencontre sur Ze Enfoirés Copy Disk par exemple. Ce n'est finalement pas une mauvaise chose car nous voilà ainsi en terrain connu et cela va nous permettre de gagner du temps ! On repère très vite en $8FB le saut vers le Boot 2 qui se charge classiquement en $B600.

Je passe dans la suite sur les différentes étapes du Boot Tracing en lui-même. Vous pouvez retrouver des instructions détaillées sur la procédure à employer notamment dans les textes des différents Déplombage Mode d'Emploi. On se retrouve donc directement face au listing du code en $B600 :

*B600L
 
B600-   A9 00       LDA   #$00
B602-   8D 4B BA    STA   $BA4B
B605-   8D 4D BA    STA   $BA4D
B608-   A9 0F       LDA   #$0F
B60A-   8D 4C BA    STA   $BA4C
B60D-   A9 01       LDA   #$01
B60F-   8D 4F BA    STA   $BA4F
B612-   A9 BF       LDA   #$BF
B614-   8D 4E BA    STA   $BA4E
B617-   A2 60       LDX   #$60
B619-   AD E9 C0    LDA   $C0E9
B61C-   20 6D B6    JSR   $B66D ; R(W)TS du FastBoot
B61F-   20 78 BF    JSR   $BF78
B622-   A9 A0       LDA   #$A0
B624-   A0 00       LDY   #$00
B626-   20 F8 BF    JSR   $BFF8
B629-   A9 00       LDA   #$00
B62B-   A0 01       LDY   #$01
B62D-   A2 09       LDX   #$09
B62F-   20 90 BF    JSR   $BF90
B632-   4C 20 A2    JMP   $A220 ; ici !

Rien de particulier ici, on reconnaît l'appel à la RWTS du Fast Boot qui va charger la suite, avant un saut final vers $A220. On va donc tout naturellement s'intéresser à ce qu'il s'y passe :

*A220L
 
A220-   A9 11       LDA   #$11
A222-   8D 6C B6    STA   $B66C
A225-   A9 83       LDA   #$83
A227-   A0 00       LDY   #$00
A229-   20 F8 BF    JSR   $BFF8 ; initialisation paramètres avant appel RWTS
A22C-   A9 01       LDA   #$01
A22E-   A0 00       LDY   #$00
A230-   A2 14       LDX   #$14
A232-   20 90 BF    JSR   $BF90 ; sous-routine qui appelle à $B66D donc la R(W)TS
A235-   A0 FC       LDY   #$FC
A237-   A9 0F       LDA   #$0F
A239-   20 F8 BF    JSR   $BFF8
A23C-   A9 02       LDA   #$02
A23E-   A0 04       LDY   #$04
A240-   A2 09       LDX   #$09
A242-   20 90 BF    JSR   $BF90
A245-   A9 20       LDA   #$20
A247-   85 E6       STA   $E6
A249-   20 00 A0    JSR   $A000
A24C-   A0 FC       LDY   #$FC
A24E-   A9 0F       LDA   #$0F
A250-   20 F8 BF    JSR   $BFF8 ;
A253-   A9 02       LDA   #$02
A255-   A0 0C       LDY   #$0C
A257-   A2 0C       LDX   #$0C
A259-   20 90 BF    JSR   $BF90 ;
A25C-   A9 60       LDA   #$60
A25E-   85 E6       STA   $E6
A260-   20 00 A0    JSR   $A000
A263-   20 00 83    JSR   $8300
A266-   EA          NOP
A267-   EA          NOP
A268-   EA          NOP
A269-   20 29 94    JSR   $9429
A26C-   A9 00       LDA   #$00
A26E-   85 FF       STA   $FF
A270-   20 00 10    JSR   $1000
A273-   8D 10 C0    STA   $C010   ; (ré)initialisation clavier
A276-   20 58 FC    JSR   $FC58
A279-   A9 08       LDA   #$08    ; Buffer de chargement
A27B-   A0 00       LDY   #$00    ; = $800 !
A27D-   20 F8 BF    JSR   $BFF8
A280-   A9 03       LDA   #$03    ; PISTE 3
A282-   A0 07       LDY   #$07    ; SECTEUR 7
A284-   A2 04       LDX   #$04    ; 4 secteurs à charger
A286-   20 90 BF    JSR   $BF90   ; R(W)TS
A289-   EA          NOP
A28A-   EA          NOP
A28B-   20 34 83    JSR   $8334   ; routine de décodage 1
A28E-   A2 04       LDX   #$04    ; routine
A290-   A0 00       LDY   #$00    ; de décodage 2
A292-   B9 00 08    LDA   $0800,Y ; décodage PAGE 2 TXT !
A295-   C8          INY
A296-   59 00 08    EOR   $0800,Y ; (MEM) = (MEM) EOR (MEM+1)
A299-   88          DEY
A29A-   99 00 08    STA   $0800,Y
A29D-   C8          INY
A29E-   D0 F2       BNE   $A292
A2A0-   EE 94 A2    INC   $A294
A2A3-   EE 98 A2    INC   $A298
A2A6-   EE 9C A2    INC   $A29C
A2A9-   CA          DEX
A2AA-   D0 E4       BNE   $A290
A2AC-   20 00 A3    JSR   $A300   ; bon emplacement pour récupérer la main !
A2AF-   20 2F FB    JSR   $FB2F
A2B2-   20 4B A3    JSR   $A34B
A2B5-   20 48 87    JSR   $8748
A2B8-   EA          NOP
A2B9-   EA          NOP
A2BA-   A9 0F       LDA   #$0F
A2BC-   A0 FC       LDY   #$FC
A2BE-   20 F8 BF    JSR   $BFF8
A2C1-   A9 04       LDA   #$04
A2C3-   A0 0D       LDY   #$0D
A2C5-   A2 0A       LDX   #$0A
A2C7-   20 90 BF    JSR   $BF90
A2CA-   A9 20       LDA   #$20
A2CC-   85 E6       STA   $E6
A2CE-   20 D0 BF    JSR   $BFD0
A2D1-   8D 50 C0    STA   $C050

On remarque tout de suite le décodage par EOR qui commence en $A28E. Le JSR juste au-dessus mérite aussi une petite visite. Il contient une autre phase de décodage que nous détaillerons plus bas. On repère aussi en remontant encore un peu, l'appel à la RWTS en $A286 avec son passage de paramètres juste avant. Ceci nous permet de situer très facilement le texte crypté sur le disque en lui-même.

Le début de la routine concerne bien évidemment la gestion (chargement et affichage) de l'intro graphique. Encore une fois, l'essentiel pour nous est de localiser ce qui nous intéresse (en l’occurrence le traitement des pages TEXT). Ici c'est très simple car le EOR couplé à l'utilisation de la mémoire en $800+ est un très gros indice ! En fait, c'est carrément comme s'il y avait un néon rouge qui clignotait en beuglant "ICI !".

Petite remarque d'ordre générale : un  moyen simple et empirique (j'aime bien ce mot) est de poser régulièrement des JMP $FF59 (ou des BREAK) le long d'une routine et  d'exécuter celle-ci pour voir ce qui se passe concrètement, AVANT son interruption. Cela permet par tâtonnement de localiser la ou les parties intéressantes. Avec un peu de pratique et d'habitude, on arrive vite à  ses fins. C'est vrai, ce n'est pas ultra technique, c'est plus de la bidouille que du vrai reverse engineering mais c'est diablement efficace. Et cela permet souvent de gagner énormément de temps.

Pour le cas concret qui nous occupe aujourd'hui, si vous modifiez le code pour y placer des interruptions, attention de ne pas utiliser de BREAK (code $00) sinon reboot assuré ! Faîtes toujours en sorte d'employer des JMP $FF59 pour ce défi (ou désactivez la modification du BRK Handler).

On reprend avec la routine de décodage 1 exécutée en $8334 (et appelée en $A28B) :

*8334L
 
8334-   A0 00       LDY   #$00
8336-   84 06       STY   $06
8338-   A9 08       LDA   #$08
833A-   85 07       STA   $07
833C-   B1 06       LDA   ($06),Y ; (MEM 1) -> A
833E-   AA          TAX           ; A -> X
833F-   C8          INY
8340-   B1 06       LDA   ($06),Y ; (MEM 2) -> A
8342-   88          DEY
8343-   91 06       STA   ($06),Y ; A donc (MEM 2) -> (MEM 1)
8345-   8A          TXA           ; X -> A donc (MEM 1) -> A
8346-   C8          INY
8347-   91 06       STA   ($06),Y ; A donc (MEM 1) -> (MEM 2)
8349-   C8          INY
834A-   D0 F0       BNE   $833C
834C-   E6 07       INC   $07
834E-   A5 07       LDA   $07
8350-   49 0C       EOR   #$0C
8352-   D0 E8       BNE   $833C
8354-   60          RTS

C'est une simple permutation entre deux octets et ce, sur l'ensemble de la page TEXT 2. Ensuite, le résultat obtenu subira le EOR en cascade pour générer le texte final décodé et prêt à être affiché.

Nous avons maintenant tout ce qu'il nous faut pour la résolution du défi :

Première étape : on récupère le texte en interceptant la routine juste après le double décodage (par un JMP $FF59 posé en $A2AC par exemple). À ce moment là, on a la page texte décodée en $800-$C00. Elle est en attente de la petite animation pour son affichage. Il suffit de la déplacer en mémoire (vers $2000 par exemple), et de rebooter un DOS pour ensuite la sauvegarder.

Seconde étape : on édite ce texte pour y ajouter notre signature. J'ai utilisé pour ce faire, le programme T40 d'Antoine Vignau que vous pouvez retrouver sur Brutal Deluxe.  C'est un éditeur plein écran qui convient parfaitement pour ce type de travail.

Troisième étape : il ne reste plus qu'à encoder notre nouveau texte. Je vous propose ci-dessous  le code source (Merlin) du programme d'encodage.
Il utilise le buffer en $2000 dans lequel doit être chargé le texte modifié. L'encodage se fait en deux passes, d'abord le EOR en cascade, ensuite la permutation par paire d'octets. Pour le EOR, on commence par la fin du buffer et on recule vers le début (pour obtenir l'inverse du décodage). On ne va pas s'étendre dessus, là encore, ce type d'encodage a déjà été vu (et revu) car on le retrouve très souvent dans les défis. Quant à la permutation, c'est exactement le même code que pour le décodage : forcément, si on a deux octets consécutifs : AB, on obtient BA après permutation. Pour de nouveau obtenir AB, il suffit de permuter BA par le même procédé.

Code source ultra simple, vous en conviendrez :

         ORG   $1000
 
 BUFFERLO EQU   $06
 BUFFERHI EQU   $07
 
 * ENCODAGE 1 (EOR EN CASCADE)
 
          LDA   #$00
          STA   BUFFERLO
          LDA   #$23
          STA   BUFFERHI
 
          LDX   #04
          LDY   #$FF
 B1       LDA   (BUFFERLO),Y
          INY
          EOR   (BUFFERLO),Y
          DEY
          STA   (BUFFERLO),Y
          DEY
          CPY   #$FF
          BNE   B1
          DEC   BUFFERHI
          DEX
          BNE   B1
 
 * ENCODAGE 2 (PERMUTATION OCTETS)
 
          LDA   #$20
          STA   BUFFERHI
 
          LDY   #$00
 B3       LDA   (BUFFERLO),Y
          TAX
          INY
          LDA   (BUFFERLO),Y
          DEY
          STA   (BUFFERLO),Y
          TXA
          INY
          STA   (BUFFERLO),Y
          INY
          BNE   B3
          INC   BUFFERHI
          LDA   BUFFERHI
          CMP   #$24
          BNE   B3
 
          RTS

Quatrième étape : on utilise le classique Accès Direct pour écrire directement sur le disque notre texte modifié et encodé ! Il est sauvegardé à partir de la piste $03, secteur $07, le tout, sur 4 secteurs jusqu'en $0A inclus.

Et voilà c'est fini ! Et oui déjà ! Finalement, un défi en droite ligne de celui de Déplombage Mode d'Emploi 4 : ni trop dur ni totalement simpliste. Juste de quoi occuper les bidouilleurs avertis de l'époque. Bidouilleurs, qui étaient justement le public visé par cette grande série.

 

Vous pouvez, comme d'habitude, télécharger le disque de travail avec les sources du programme Encodage, le programme Accès Direct et quelques bricoles. Et bien sûr Déplombage Mode d'Emploi 6 signé par mes soins (face 1 uniquement).