Entrons directement dans le vif du sujet : le premier (vrai) article de ce blog sera consacré au défi de Force Fix 2, production underground de The Warriors of Destiny.
But de ce défi : signer une page texte qui s'affiche peu après le boot du disque. A noter que le second défi du disk - récupérer le source BASIC - fera l'objet d'une autre article prochainement.
Pour relever le défi, j'ai choisi l'approche par Boot Trace, déjà pour me remémorer cette technique, ensuite tout simplement parce qu'elle me semble la plus appropriée ici.
Je vous propose donc de suivre de A à Z ce Trace Boot, avec quasiment la copie de ce que l'on voit sous Monitor en direct-live.
]CALL -151 ; passage sous Monitor ; déplacement et modification du BOOT 0 pour récupérer la main : *9600<C600.C700M *96F8 : 4C 65 FF ; (remplacement du JMP 801) *9600G ; exécution BOOT 0 (modifié) * ; on a récupéré la main ! ; on vérifie qu'un seul secteur a été chargé par le BOOT 0 *800 0800- 01 ; 1 c'est OK *801L ; on regarde ce qu'on a en $801 0801- A5 27 LDA $27 *** Entry Point BOOT 1 0803- C9 09 CMP #$09 0805- D0 0C BNE $0813 0807- A9 B4 LDA #$B4 0809- 85 27 STA $27 080B- AD FF 08 LDA $08FF 080E- 85 3D STA $3D 0810- 4C 5C C6 JMP $C65C 0813- CE 0C 08 DEC $080C 0816- A5 27 LDA $27 0818- C9 BB CMP #$BB 081A- D0 EF BNE $080B 081C- A9 00 LDA #$00 081E- 8D 02 C0 STA $C002 0821- 8D 08 C0 STA $C008 0824- 8D 7F C0 STA $C07F 0827- 8D 0C C0 STA $C00C 082A- 8D 56 C0 STA $C056 082D- A9 FF LDA #$FF 082F- 8D 05 C0 STA $C005 0832- 8D F4 03 STA $03F4 0835- A9 00 LDA #$00 0837- 8D 04 C0 STA $C004 083A- 20 39 FB JSR $FB39 083D- 20 58 FC JSR $FC58 0840- A2 00 LDX #$00 0842- BD 4E 08 LDA $084E,X ; move $84E->$300 0845- 9D 00 03 STA $0300,X ; 0848- E8 INX 0849- D0 F7 BNE $0842 084B- 4C 00 03 JMP $0300 *** on exécutera en fait ce qui est 084E- 2C E9 C0 BIT $C0E9 actuellement en $84E 0851- 20 6D B6 JSR $B66D 0854- A2 00 LDX #$00 0856- BD 00 0C LDA $0C00,X 0859- 9D 00 60 STA $6000,X 085C- E8 INX 085D- D0 F7 BNE $0856 085F- 20 9F 03 JSR $039F 0862- A9 69 LDA #$69 0864- 8D F2 03 STA $03F2 0867- A9 FF LDA #$FF 0869- 8D F3 03 STA $03F3 086C- A9 4A LDA #$4A 086E- 8D F4 03 STA $03F4 0871- A9 00 LDA #$00 0873- 8D 4D BA STA $BA4D 0876- 8D 4C BA STA $BA4C 0879- A9 22 LDA #$22 087B- 8D 4B BA STA $BA4B 087E- A9 90 LDA #$90 0880- 8D 4E BA STA $BA4E 0883- A9 03 LDA #$03 0885- 8D 4F BA STA $BA4F 0888- 20 6D B6 JSR $B66D 088B- 4C 10 92 JMP $9210 *** JMP BOOT 2 ! ; Patch du JMP Boot 2 (JMP $9210 devient JMP $FF65) ; dans la routine du BOOT 2 : *96F8 : A9 65 8D 8C 08 A9 FF 8D 8D 08 4C 01 08 *96F8L ; on vérifie qu'on a bien enlevé nos mouffles pour taper le code ! 96F8- A9 65 LDA #$65 96FA- 8D 8C 08 STA $088C 96FD- A9 FF LDA #$FF 96FF- 8D 8D 08 STA $088D 9702- 4C 01 08 JMP $0801 ; OK pas de fautes de frappe, on peut relancer la routine de BOOT 0 : *9600G * ; on récupère la main après le premier affichage du HAWK MOON ; BOOT 1.3 *9210L ; on regarde un peu ce qui a été chargé : 9210- 20 00 90 JSR $9000 9213- A9 00 LDA #$00 9215- 8D 4D BA STA $BA4D 9218- 8D 4B BA STA $BA4B 921B- A9 08 LDA #$08 921D- 8D 4C BA STA $BA4C 9220- A9 10 LDA #$10 9222- 8D 4E BA STA $BA4E 9225- A9 08 LDA #$08 9227- 8D 4F BA STA $BA4F 922A- 20 6D B6 JSR $B66D 922D- A9 01 LDA #$01 922F- 8D 4B BA STA $BA4B 9232- A9 A0 LDA #$A0 9234- A2 00 LDX #$00 9236- 9D 54 05 STA $0554,X 9239- E8 INX 923A- E0 20 CPX #$20 923C- D0 F8 BNE $9236 923E- 20 69 92 JSR $9269 9241- 4C 42 03 JMP $0342 *** intéressant ! ; on patch ce JMP pour avoir la main et on lance la routine *9241 : 4C 65 FF ; plus besoin de passer par le BOOT 0 *9210G ; on peut donc modifier directement le code * *342L 0342- A9 00 LDA #$00 0344- 8D 4C BA STA $BA4C 0347- 8D 4D BA STA $BA4D 034A- A9 20 LDA #$20 034C- 8D 4E BA STA $BA4E 034F- A9 20 LDA #$20 0351- 8D 4F BA STA $BA4F 0354- 20 6D B6 JSR $B66D 0357- A9 03 LDA #$03 0359- 8D 4B BA STA $BA4B 035C- A9 0A LDA #$0A 035E- 8D 4C BA STA $BA4C 0361- A9 00 LDA #$00 0363- 8D 4D BA STA $BA4D 0366- A9 70 LDA #$70 0368- 8D 4E BA STA $BA4E 036B- A9 0A LDA #$0A 036D- 8D 4F BA STA $BA4F 0370- 20 6D B6 JSR $B66D 0373- A9 04 LDA #$04 0375- 8D 4B BA STA $BA4B 0378- 8D 4C BA STA $BA4C 037B- A9 00 LDA #$00 037D- 8D 4D BA STA $BA4D 0380- A9 A3 LDA #$A3 0382- 8D 4E BA STA $BA4E 0385- A9 09 LDA #$09 0387- 8D 4F BA STA $BA4F 038A- 20 6D B6 JSR $B66D 038D- A9 00 LDA #$00 038F- 8D F2 03 STA $03F2 0392- A9 A3 LDA #$A3 0394- 8D F3 03 STA $03F3 0397- 20 6F FB JSR $FB6F 039A- 4C E8 70 JMP $70E8 *** ICI ! ; Pour la petite histoire cette partie était déjà en mémoire après chargement ; du BOOT 1 (souvenez-vous du move $84E+ vers $300+) ; on aurait donc pu patcher directement ce JMP là plutôt que le JMP $9210 ; mais difficile de le savoir à ce moment là. Je reproduis ici fidèlement tout ; le cheminement pour arriver jusqu'à la localisation de la routine de ; décryptage. *39A: 4C 65 FF *342G * *70E8L 70E8- A2 00 LDX #$00 70EA- BD 00 70 LDA $7000,X 70ED- 49 22 EOR #$22 ; tiens du décryptage ! 70EF- 9D 00 70 STA $7000,X 70F2- E8 INX 70F3- E0 E5 CPX #$E5 70F5- D0 F3 BNE $70EA 70F7- 2C 10 C0 BIT $C010 70FA- 4C 40 70 JMP $7040 *** ! ; on patch et on exécute la routine de décrytage *70FA : 4C 65 FF *70E8G * *7040L 7040- 4C 00 70 JMP $7000 ; on se balade un peu visiblement 7043- A9 A0 LDA #$A0 7045- 8D FF 60 STA $60FF 7048- 8D FF 61 STA $61FF 704B- 8D FF 62 STA $62FF 704E- 8D FF 63 STA $63FF 7051- A9 C4 LDA #$C4 7053- 8D FF 64 STA $64FF 7056- A9 CF LDA #$CF 7058- 8D FF 65 STA $65FF 705B- A9 C9 LDA #$C9 705D- 8D FF 66 STA $66FF 7060- 2C E8 C0 BIT $C0E8 7063- 20 00 14 JSR $1400 7066- A9 00 LDA #$00 7068- 85 06 STA $06 706A- A2 00 LDX #$00 706C- BD 00 60 LDA $6000,X 706F- 18 CLC 7070- 65 06 ADC $06 *7000L ; voyons voir où on nous promène 7000- A9 00 LDA #$00 7002- A2 00 LDX #$00 7004- A0 FF LDY #$FF 7006- A9 00 LDA #$00 7008- 85 06 STA $06 700A- 85 19 STA $19 700C- A9 78 LDA #$78 700E- 85 07 STA $07 7010- A9 67 LDA #$67 7012- 85 1A STA $1A 7014- A9 00 LDA #$00 7016- 85 08 STA $08 7018- 91 19 STA ($19),Y 701A- 8D FF 68 STA $68FF 701D- B1 06 LDA ($06),Y 701F- 45 08 EOR $08 7021- 88 DEY 7022- 91 19 STA ($19),Y 7024- 85 08 STA $08 7026- C0 FF CPY #$FF 7028- D0 F3 BNE $701D 702A- C6 1A DEC $1A 702C- C6 07 DEC $07 702E- A5 07 LDA $07 7030- C9 70 CMP #$70 7032- F0 05 BEQ $7039 7034- A0 FF LDY #$FF 7036- 4C 1D 70 JMP $701D 7039- 4C 43 70 JMP $7043 703C- 00 BRK 703D- 00 BRK 703E- 00 BRK 703F- 00 BRK 7040- 4C 00 70 JMP $7000 7043- A9 A0 LDA #$A0 7045- 8D FF 60 STA $60FF 7048- 8D FF 61 STA $61FF 704B- 8D FF 62 STA $62FF 704E- 8D FF 63 STA $63FF 7051- A9 C4 LDA #$C4 7053- 8D FF 64 STA $64FF 7056- A9 CF LDA #$CF 7058- 8D FF 65 STA $65FF 705B- A9 C9 LDA #$C9 705D- 8D FF 66 STA $66FF 7060- 2C E8 C0 BIT $C0E8 7063- 20 00 14 JSR $1400 7066- A9 00 LDA #$00 7068- 85 06 STA $06 706A- A2 00 LDX #$00 706C- BD 00 60 LDA $6000,X 706F- 18 CLC 7070- 65 06 ADC $06 7072- 85 06 STA $06 7074- E8 INX 7075- E0 00 CPX #$00 7077- D0 F3 BNE $706C 7079- EE 6E 70 INC $706E 707C- AD 6E 70 LDA $706E 707F- C9 68 CMP #$68 7081- D0 E7 BNE $706A 7083- A5 06 LDA $06 7085- C9 58 CMP #$58 7087- F0 03 BEQ $708C 7089- 4C 00 A3 JMP $A300 708C- 20 39 FB JSR $FB39 708F- 2C E9 C0 BIT $C0E9 7092- A9 03 LDA #$03 7094- 8D 4B BA STA $BA4B 7097- A9 00 LDA #$00 7099- 8D 4C BA STA $BA4C 709C- 8D 4D BA STA $BA4D 709F- A9 60 LDA #$60 70A1- 8D 4E BA STA $BA4E 70A4- A9 05 LDA #$05 70A6- 8D 4F BA STA $BA4F 70A9- 20 6D B6 JSR $B66D 70AC- A2 00 LDX #$00 70AE- BD 00 61 LDA $6100,X 70B1- 9D 00 08 STA $0800,X 70B4- E8 INX 70B5- E0 00 CPX #$00 70B7- D0 F5 BNE $70AE 70B9- EE B0 70 INC $70B0 70BC- EE B3 70 INC $70B3 70BF- AD B3 70 LDA $70B3 70C2- C9 0C CMP #$0C 70C4- D0 E6 BNE $70AC 70C6- A9 04 LDA #$04 70C8- 8D 4B BA STA $BA4B 70CB- A9 0D LDA #$0D 70CD- 8D 4C BA STA $BA4C 70D0- A9 00 LDA #$00 70D2- 8D 4D BA STA $BA4D 70D5- A9 20 LDA #$20 70D7- 8D 4E BA STA $BA4E 70DA- A9 03 LDA #$03 70DC- 8D 4F BA STA $BA4F 70DF- 20 6D B6 JSR $B66D 70E2- 4C 35 21 JMP $2135 *** ouf nous y voilà 70E5- 00 BRK 70E6- 00 BRK 70E7- 00 BRK 70E8- A2 00 LDX #$00 70EA- BD 00 70 LDA $7000,X 70ED- 49 22 EOR #$22 70EF- 9D 00 70 STA $7000,X 70F2- E8 INX 70F3- E0 E5 CPX #$E5 70F5- D0 F3 BNE $70EA 70F7- 2C 10 C0 BIT $C010 70FA- 4C 65 FF JMP $FF65 70FD- 00 BRK 70FE- 00 BRK ; on patch le JMP $2135 et on lance la routine *70E2 : 4C 65 FF *7040G * ; on récupère la main après l'animation graphique d'intro ; et un nouvel écran HAWK MOON BOOT. ; ça commence à sentir bon car on est maintenant forcément tout prêt ; on va donc s’intéresser aussi aux JSR maintenant. ; note : ce qui se passe en $7000+ (décryptage EOR/checksum etc) ne ; concerne pas le défi mais l'intro donc on ne s'en occupe pas ! ; "Tout ce qui brille n'est pas Or"... ; on reprend : *2135L 2135- 20 9F 21 JSR $219F ; bof 2138- 2C E9 C0 BIT $C0E9 213B- 20 00 20 JSR $2000 *** OhOh ! 213E- A2 00 LDX #$00 2140- BD 00 08 LDA $0800,X 2143- 9D 00 61 STA $6100,X 2146- E8 INX 2147- E0 00 CPX #$00 2149- D0 F5 BNE $2140 214B- EE 42 21 INC $2142 214E- EE 45 21 INC $2145 2151- AD 42 21 LDA $2142 2154- C9 0C CMP #$0C 2156- D0 E6 BNE $213E 2158- 20 80 21 JSR $2180 215B- 85 06 STA $06 215D- C9 9B CMP #$9B 215F- D0 1C BNE $217D 2161- 20 58 FC JSR $FC58 2164- A0 01 LDY #$01 *2000L ; voyons d'un peu plus près tout ça... 2000- A9 00 LDA #$00 2002- A2 00 LDX #$00 2004- A0 00 LDY #$00 2006- A9 00 LDA #$00 2008- 85 06 STA $06 200A- A9 08 LDA #$08 200C- 85 07 STA $07 200E- B1 06 LDA ($06),Y ; $800+Y dans A 2010- 85 08 STA $08 ; A dans $08 2012- A2 00 LDX #$00 2014- BD 35 20 LDA $2035,X ; on commence à lire la table en $2035 2017- C5 08 CMP $08 ; est-ce que c'est l'octet cherché ? 2019- F0 04 BEQ $201F ; 201B- E8 INX 201C- 4C 14 20 JMP $2014 ; non ? on boucle (table+1) 201F- 8A TXA ; si oui, on transfert l'index correspondant 2020- 91 06 STA ($06),Y ; dans A et on le sauve en $800+Y ! 2022- C8 INY 2023- C0 00 CPY #$00 2025- D0 E7 BNE $200E 2027- E6 07 INC $07 2029- A5 07 LDA $07 202B- C9 0C CMP #$0C 202D- F0 05 BEQ $2034 202F- A0 00 LDY #$00 2031- 4C 0E 20 JMP $200E 2034- 60 RTS ; Pour résumer, le décodage consiste à prendre l'index ; correspondant à la position de l'octet crypté dans la table. ; C'est cet index qui est directement utilisé comme code ASCII ; pour l'affichage ! ; donc en fait, en retournant le processus et en utilisant cette ; table, si on veut afficher un "A" ($C1), sur la page du défi, on va chercher ; l'octet correspondant dans la table à la position : ; $C1 (code ASCII à afficher) + $2035 (début table) = $20F6 ; Soit l'octet $F1 qui sera la valeur cryptée de notre A. ; ; Pour faire la modication sur disque et localiser où se trouve le texte crypté ; recherchez les premiers octets cryptés (qui sont $800+ en mémoire lors de ; l'appel en $2000) ; N'oubliez pas que l'affichage en page texte n'est pas linéaire. ; Il faudra en tenir compte pour positionner votre message/signature. ; Perso je ne me suis pas trop fait chier, j'ai recherché les octets cryptés ; pour "DECKARD" et je me suis aligné sur lui ;-) ; ; LA TABLE de décodage : 2035- 40 41 42 2038- 43 44 45 46 47 48 49 4A 2040- 4B 4C 4D 4E 4F E1 E0 E2 2048- E3 E4 E5 E6 E7 E8 E9 EA 2050- EB EC ED EE EF C2 C1 C0 2058- C3 C4 C5 C6 C7 C8 C9 CA 2060- CB CC CD CE CF 80 81 82 2068- 83 84 85 86 87 88 89 8A 2070- 8B 8C 8D 8E 8F B0 B1 B2 2078- B3 B4 B5 B6 B7 B8 B9 BA 2080- BB BC BD BE BF 00 01 02 2088- 03 04 05 06 07 08 09 0A 2090- 0B 0C 0D 0E 0F 20 21 22 2098- 23 24 25 26 27 28 29 2A 20A0- 2B 2C 2D 2E 2F 50 51 52 20A8- 53 54 55 56 57 58 59 5A 20B0- 5B 5C 5D 5E 5F 60 61 62 20B8- 63 64 65 66 67 68 69 6A 20C0- 6B 6C 6D 6E 6F 90 91 92 20C8- 93 94 95 96 97 98 99 9A 20D0- 9B 9C 9D 9E 9F A0 A1 A2 20D8- A3 A4 A5 A6 A7 A8 A9 AA 20E0- AB AC AD AE AF D0 D1 D2 20E8- D3 D4 D5 D6 D7 D8 D9 DA 20F0- DB DC DD DE DF F0 F1 F2 20F8- F3 F4 F5 F6 F7 F8 F9 FA 2100- FB FC FD FE FF 70 71 72 2108- 73 74 75 76 77 78 79 7A 2110- 7B 7C 7D 7E 7F 10 11 12 2118- 13 14 15 16 17 18 19 1A 2120- 1B 1C 1D 1E 1F 30 31 32 2128- 33 34 35 36 37 38 39 3A 2130- 3B 3C 3D 3E 3F |
Ici vous apercevez la page signée par ce diable de DECKARD, en attendant que vous mettiez votre propre pseudo à côté pour la postérité (ou au moins les 20 prochaines années !).
Télécharger Force Fix 2 - version DECKARD
(que vous pouvez retrouver sur son site).
Télécharger Force Fix 2 signé par votre serviteur.