Force Fixe 2 - IntroEntrons 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

Force Fix 2 - Défi SignatureIci 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.