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).
envoyé le 12-09-2011 à 16 h 22 min
Super, bravo !