Index du Forum
IDENTIFICATION SERVEUR : 10.0.97.1 - CLIENT : 54.80.83.123

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Sherwood forest (Phoenix Software, 1982)

 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Jeu 09 Oct 2014, 16:43    Sujet du message: Sherwood forest (Phoenix Software, 1982) Répondre en citant

Graphical adventure with a text parser, about Robin Hood and his friends.
This one has some nice tricks in the protection.

We start with the simple code in the boot sector, to load the next stage.

Code:
0800       .BYTE 1
0801       CLD
0802       BIT    byte_C081
0805       LDA    #$60
0807       EOR    byte_FF58
080A loc_80A:
080A       BNE    loc_80A
080C       STA    byte_3F3
080F       SEI
0810       LDA    byte_800
0813       CMP    #6
0815       BCS    loc_881
0817       ADC    #2
0819       STA    byte_800
081C       INC    byte_3D
081E       TXA
081F       LSR    A
0820       LSR    A
0821       LSR    A
0822       LSR    A
0823       ORA    #$C0
0825       STA    loc_828+2
0828 loc_828:
0828       JMP    loc_C65C


It reads the first three even sectors (2, 4, 6) to the sequential addresses $900, $A00, $B00.
Then we reach some interesting things.

Code:
082B byte_82B:    .BYTE $5F
082C       .BYTE $FF
082D byte_82D:    .BYTE   $45, $29, $69, $81, $AD, $A4, $88, $B1,   $9D, $A6, $8A, $A9, $85, $A5, $A5, $A7
083D       .BYTE   $A7, $A1, $A1, $A0,   5, $78, $A4, $52,   $FA, $94, $60, $A0, $84, $CA, $E7, $AB
084D       .BYTE   $A0, $AA, $8E, $C9, $DE, $DF, $86,   0,   $18, $2A, $12,    8, $C0, $D0, $D0, $C0
085D       .BYTE   $20, $50, $7F,    3, $6D, $41, $6C, $2D,   $41, $5D, $9D,    3, $BE, $BD, $FF, $62
086D       .BYTE   $9D, $FF, $17, $38, $24, $3E, $44, $75,   $FF, $8A, $80, $CE, $8C, $4C, $C6, $64
087D       .BYTE   $E2, $90, $1F, $83

0881 loc_881: ;start here
0881       BIT    $CFFF
0884       TYA
0885 loc_885:
0885       STA    0,Y
0888       INY
0889       BNE    loc_885 ;clear zero page
088B       STX    loc_30
088D       LDX    #$3F
088F loc_88F:
088F       STA    $2000,Y
0892       INY
0893       BNE    loc_88F
0895       INC    loc_88F+2
0898       DEX
0899       BPL    loc_88F ;clear both graphics screens
089B       TXS
089C       STX    byte_4FB
089F       STX    $C00C
08A2       STX    $C00E
08A5       STX    $C000
08A8       JSR    $FE89
08AB       JSR    $FE93
08AE       JSR    $FE84
08B1       JSR    $FB2F
08B4       BIT    $C057
08B7       BIT    $C052
08BA       BIT    $C050
08BD       BIT    $C055
08C0       BIT    $C081
08C3       BIT    $C081
08C6       LDA    #$D8
08C8       TAY
08C9 loc_8C9:
08C9       STA    $300,Y
08CC       INY
08CD       BNE    loc_8C9
08CF loc_8CF:
08CF       LDA    $F800,Y
08D2 loc_8D2:
08D2       STA    $F800,Y
08D5       DEY
08D6       BNE    loc_8CF
08D8       INC    loc_8CF+2
08DB       INC    loc_8D2+2
08DE       BNE    loc_8CF ;shadow ROM so that vectors can be hooked
08E0       LDA    #2
08E2       STA    loc_110
08E5       STA    $BD00
08E8       LDY    #$10
08EA       LDA    #1 ;a stack location ($110)?  yes, see below
08EC       STY    byte_3F0
08EF       STA    byte_3F1
08F2       STY    byte_3FE
08F5       STA    byte_3FF
08F8       STY    byte_3F2
08FB       STA    byte_3F3
08FE       STY    $FFFA
0901       STA    $FFFB
0904       STY    $FFFC
0907       STA    $FFFD
090A       STY    $FFFE
090D       STA    $FFFF
0910       BIT    $C080
0913       EOR    #$A5
0915       STA    byte_3F4
0918       LDA    #$4C
091A       STA    byte_3EF
091D       STA    byte_3FD
0920       CPY    $FFFC
0923       BEQ    loc_92D
0925       CMP    $E000
0928       BEQ    loc_92D
092A       BIT    $C081
092D loc_92D:
092D       LDX    #$53
092F loc_92F:
092F       EOR    byte_82D,X
0932       STA    $110,X
0935       DEX
0936       BPL    loc_92F
0938       LDY    #3
093A       LDX    byte_82B
093D loc_93D:
093D       EOR    $900,X
0940 loc_940:
0940       STA    $500,X
0943       INX
0944       BNE    loc_93D
0946       INC    loc_93D+2
0949       INC    loc_940+2
094C       DEY
094D       BNE    loc_93D
094F       LDA    loc_30
0951       ORA    #$89
0953       STA    loc_110+1
0956       LDA    loc_828+2
0959       STA    loc_15F
095C       JMP    loc_790
095F       .BYTE    $A, $96, $8D, $31, $4C, $D0, $EB, $7E,   $84, $EB,   0, $A0,   3, $23, $BA, $22
096F       .BYTE   $4F, $31, $4C, $D0, $EB, $32, $63, $7A,   $39,   3, $57, $31, $4C, $D0, $EB, $B2
097F       .BYTE   $DF, $46,  $F, $7F, $A3, $86, $89, $B1,   $31, $4C, $D0, $EB, $D1, $AF, $8E, $B6
098F       .BYTE   $31, $4C, $D0, $EB, $DE, $2E, $92, $B5,   $2C, $45, $49, $84, $98, $F7, $4F, $78
099F       .BYTE   $DB, $B6, $31, $4C, $D0, $EB, $32, $23,   $3A, $D2, $1A, $78, $58, $58, $C6, $96
09AF       .BYTE   $90, $B8, $90, $B8, $C7, $4A, $31, $4C,   $D0, $EB, $32, $1C,   5, $24, $1E, $57
09BF       .BYTE   $31, $4C, $D0, $EB, $32, $63, $7A, $22,   $52, $F6, $EB, $31, $4C, $D0, $EB, $B2
09CF       .BYTE   $E4, $7D, $37, $EF, $28, $89, $AC, $2D,   $A0,  $C, $8F, $B7, $30, $4C, $D0, $EB
09DF       .BYTE   $A2, $8F, $D4, $A6, $AF, $92, $99,   3,   $D3, $3E, $6A, $8F, $B7, $30, $4C, $D0
09EF       .BYTE   $EB, $A2, $8F, $D4, $A6, $AF, $92, $99,     2, $CA, $18, $3E, $52, $30, $4C, $D0
09FF       .BYTE   $EB, $A2, $8F, $D4, $D2, $76,   7, $A1,   $BD, $31, $4C, $D0, $EB, $32, $23, $3A
0A0F       .BYTE   $4B, $71, $57, $31, $4C, $D0, $EB, $32,   $63, $7A, $41, $35, $8B, $92, $31, $4C
0A1F       .BYTE   $D0, $EB, $32, $22, $3B, $56, $24, $F4,   $9C, $FA, $CB, $42, $B9,   2, $5C, $5E
0A2F       .BYTE     3, $29, $74, $5E,   3, $29, $BB, $95,   $CC, $18, $3D, $F5, $78, $6E, $96, $99
0A3F       .BYTE   $31, $18,  $C,    4, $3E,   3,   1, $6C,   $5C,  $A,   4, $3D,   1,   3,   1, $99
0A4F       .BYTE   $8B, $AE, $A0, $84, $88, $A9, $A8, $88,   $8E, $33, $DD, $EB, $FE, $C1, $81, $B6
0A5F       .BYTE   $E0, $EB, $44, $B6, $6F, $94, $C2, $CB,   $64, $97, $3B, $C9, $9C, $92, $A7, $A9
0A6F       .BYTE   $C5, $C1, $B8, $B1, $A9, $90, $18, $B2,   $94, $BF, $87, $38, $26, $BE, $98, $A3
0A7F       .BYTE   $AE, $13, $38, $B4, $92, $BF, $FF, $40,   $26, $BE, $98, $E0, $EA, $DC, $16, $E6
0A8F       .BYTE   $BE, $98, $1E, $BD, $A8, $24, $2A, $29,   $2F, $35, $9A, $17, $3D, $40, $A0, $C2
0A9F       .BYTE   $B0, $D8, $1A, $2D, $17, $D2, $D1, $E8,   $D1, $25, $95, $C6, $96, $ED, $54, $49
0AAF       .BYTE     5, $C8, $FD, $F8,   2,  $C,  $B, $2D,   $6E, $48, $A0, $96, $ED, $55, $48, $A0
0ABF       .BYTE   $58, $50, $81, $EF, $83, $8D, $60, $81,   $E9, $85, $8C, $AB, $B1, $BA, $17, $3B
0ACF       .BYTE   $82, $AE, $B3, $9F, $83, $A6, $A7, $B6,   $B9, $F8, $E8, $49, $57, $CE, $E1, $56
0ADF       .BYTE   $8F,   5, $ED, $BD, $A3, $6F, $73, $9F,   $83, $96, $92, $E4, $E1, $CD, $1A, $35
0AEF       .BYTE   $89, $9E, $F1, $CB, $79, $B9, $8D, $81,   $CC, $79, $B9, $8D, $80, $1D, $80, $FD
0AFF       .BYTE   $6D, $A0,  $D, $AC, $60, $69, $48, $D0,   $D0, $70, $98, $A2, $B3, $B7, $A6, $A0
0B0F       .BYTE   $F1, $F7,  $C, $8F, $8F, $BB, $B7, $83,   $87, $CA, $79, $B7, $83, $86, $A6, $A0
0B1F       .BYTE   $80, $95, $B5, $A7, $2B, $2E,  $D, $8F,   $85, $A5, $A6, $49, $EF, $A7, $68, $20
0B2F       .BYTE     0, $CF, $8A, $AD, $B2, $B9, $A9, $95,     5, $5A, $DA, $EB, $5F, $A4, $98, $92
0B3F       .BYTE   $C3, $D9, $80, $92, $EB, $E6, $A5,  $F,   $B5, $85,   5, $76, $F6, $F6, $46, $66
0B4F       .BYTE   $CC, $FA, $F5, $CD,   8, $D0, $80, $76,   $43, $AA, $2F, $8A, $AC, $26, $7F, $5A
0B5F       .BYTE   $B5, $4B, $5E, $8B, $AB, $88, $C8, $CA,   $DF, $3E, $48, $8B, $A7, $CF, $44, $28
0B6F       .BYTE   $28, $F1, $1A, $5F, $25, $60, $16, $63,   $80, $25, $8D, $A8, $B5, $6F, $76, $A9
0B7F       .BYTE   $A6, $8B, $B8,    5, $56, $66, $70,   5,   $33, $E9, $8A, $85, $A5, $AF, $DA, $73
0B8F       .BYTE   $C3, $C9, $AB, $9F, $9D,   8, $95, $9D,    $A, $97, $9D,   $B, $96, $9D,   9, $E1
0B9F       .BYTE   $38, $21, $74, $8F, $8F, $87, $AB, $17,   $3B, $80, $25, $3D, $1A, $AA, $90, $3B
0BAF       .BYTE   $4E, $E5, $91, $3A, $4E, $68, $9F, $B9,   $4A, $4C,   0, $20,  $C, $78, $94, $E0
0BBF       .BYTE   $9F, $B9, $47, $41,   0,   8, $28, $9F,   $B9, $44, $42,    0, $40, $60, $9F, $B9
0BCF       .BYTE   $41, $47,   0, $98, $B8, $8A, $AC, $A4,   $A6, $AD, $A9, $A0, $D8, $E1, $99,   4
0BDF       .BYTE   $9D, $19, $84, $CC, $D8, $E7, $19, $30,   $D9, $E9,  $F, $E6, $CD, $1A, $3C, $A0
0BEF       .BYTE   $14, $A4, $FC,    0,   0,   0,   0,   0,     0,   0,   0,    0,   0,   0,   0,   0
0BFF       .BYTE     0


We start at $881. It sets all of the vectors to point to a stack location, and then it places some code on the stack, using the routine at $92D. That routine decodes the block of data at $82D.

The stack code just clears memory except for the first graphics page, and then reboots. It's not interesting.

The interesting routine is the one at $938. It decodes the block at $95F and places it in screen memory. The encoding method is that each byte of decoded data is the key for the next byte. So if you alter any of the bytes without taking that into account, everything after that byte will not decode properly.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Jeu 09 Oct 2014, 17:05    Sujet du message: Répondre en citant

The routine that is placed in screen memory is the RTS.

Code:
055F sub_55F:
055F       LDX    locret_30
0561 loc_561:
0561       LDA    $C08C,X
0564       BPL    loc_561
0566       STA    loc_1
0568       NOP
0569       NOP
056A       LSR    A ;this is special
056B       EOR    #$6A
056D       BNE    loc_561
056F loc_56F:
056F       LDA    $C08C,X
0572       BPL    loc_56F
0574       CMP    #$AA
0576       BNE    loc_561
0578       NOP
0579 loc_579:
0579       LDA    $C08C,X
057C       BPL    loc_579
057E       EOR    #$96
0580       BNE    loc_561
0582       LDY    #3
0584 loc_584:
0584       STA    loc_C
0586 loc_586:
0586       LDA    $C08C,X
0589       BPL    loc_586
058B       ROL    A
058C       STA    loc_B
058E loc_58E:
058E       LDA    $C08C,X
0591       BPL    loc_58E
0593       AND    loc_B
0595       STA    $2C,Y
0598       EOR    loc_C
059A       DEY
059B       BPL    loc_584
059D       TAY
059E       BNE    loc_5AB
05A0 loc_5A0:
05A0       LDA    $C08C,X
05A3       BPL    loc_5A0
05A5       CMP    #$EA
05A7       BNE    loc_5AB
05A9 sub_5A9:
05A9       CLC
05AA       RTS
05AB loc_5AB:
05AB       SEC
05AC       RTS
05AD sub_5AD:
05AD       LDX    locret_30
05AF       LDY    #$18
05B1 loc_5B1:
05B1       DEY
05B2       BMI    loc_5AB
05B4 loc_5B4:
05B4       LDA    $C08C,X
05B7       BPL    loc_5B4
05B9 loc_5B9:
05B9       CMP    #$D5
05BB       BNE    loc_5B1
05BD       NOP
05BE loc_5BE:
05BE       LDA    $C08C,X
05C1       BPL    loc_5BE
05C3       CMP    #$AA
05C5       BNE    loc_5B9
05C7       LDY    #$56
05C9 loc_5C9:
05C9       LDA    $C08C,X
05CC       BPL    loc_5C9
05CE       EOR    #$AD
05D0       BNE    loc_5B9
05D2       PHP
05D3       JSR    sub_5A9
05D6       PLP
05D7 loc_5D7:
05D7       DEY
05D8       STY    loc_B
05DA loc_5DA:
05DA       LDY    $C08C,X
05DD       BPL    loc_5DA
05DF       EOR    $2D6,Y
05E2       LDY    loc_B
05E4       STA    $300,Y
05E7       BNE    loc_5D7
05E9 loc_5E9:
05E9       STY    loc_B
05EB loc_5EB:
05EB       LDY    $C08C,X
05EE       BPL    loc_5EB
05F0       EOR    $2D6,Y
05F3       LDY    loc_B
05F5       STA    $200,Y
05F8       INY
05F9       BNE    loc_5E9
05FB loc_5FB:
05FB       LDY    $C08C,X
05FE       BPL    loc_5FB
0600       EOR    $2D6,Y
0603       BNE    loc_5AB
0605       LDA    (0,X)
0607 loc_607:
0607       LDA    $C08C,X
060A       BPL    loc_607
060C       CMP    #$EA
060E       BNE    loc_5AB
0610       NOP
0611 loc_611:
0611       LDA    $C08C,X
0614       BPL    loc_611
0616       CMP    #$AA
0618       BNE    loc_5AB
061A       LDY    loc_2F ;funny trick #2
061C loc_61C:
061C       LDA    $C08C,X
061F       BPL    loc_61C
0621       CMP    #$EB
0623       BNE    loc_5AB
0625 loc_625:
0625       LDX    #$56
0627 loc_627:
0627       DEX
0628       BMI    loc_625
062A       LDA    $200,Y
062D       LSR    $300,X
0630       ROL    A
0631       LSR    $300,X
0634       ROL    A
0635       STA    (4),Y
0637       INY
0638       BNE    loc_627
063A       CLC
063B       RTS
063C byte_63C:    .BYTE $E
063D byte_63D:    .BYTE $98
063E byte_63E:    .BYTE     1, $30, $28, $24, $20, $1E, $1D, $1C
0646 byte_646:    .BYTE   $70, $2C, $26, $22, $1F, $1E, $1D, $1C
064E loc_64E:
064E       STA    loc_E
0650       LDY    #0
0652       STY    loc_C
0654 loc_654:
0654       LDA    loc_D
0656       STA    loc_B
0658       SEC
0659       SBC    loc_E
065B       BEQ    loc_68E
065D       BCS    loc_665
065F       INC    loc_D
0661       EOR    #$FF
0663       BCC    loc_669
0665 loc_665:
0665       DEC    loc_D
0667       ADC    #$FE
0669 loc_669:
0669       CMP    loc_C
066B       BCC    loc_66F
066D       LDA    loc_C
066F loc_66F:
066F       CMP    #8
0671       BCS    loc_674
0673       TAY
0674 loc_674:
0674       SEC
0675       JSR    sub_692
0678       LDA    byte_63E,Y
067B       JSR    sub_69E
067E       LDA    loc_B
0680       CLC
0681       JSR    sub_694
0684       LDA    byte_646,Y
0687       JSR    sub_69E
068A       INC    loc_C
068C       BNE    loc_654
068E loc_68E:
068E       JSR    sub_69E
0691       CLC
0692 sub_692:
0692       LDA    loc_D
0694 sub_694:
0694       AND    #3
0696       ROL    A
0697       ORA    locret_30
0699       TAX
069A       LDA    $C080,X
069D       RTS
069E sub_69E:
069E       LDX    #$12
06A0 loc_6A0:
06A0       DEX
06A1       BNE    loc_6A0
06A3       NOP
06A4       SEC
06A5       SBC    #1
06A7       BNE    sub_69E
06A9       RTS
06AA sub_6AA:
06AA       LDX    locret_30
06AC       CMP    $C089,X
06AF       CMP    loc_D
06B1       BEQ    loc_6BB
06B3       ASL    A
06B4       ASL    loc_D
06B6       JSR    loc_64E
06B9       LDX    locret_30
06BB loc_6BB:
06BB       CMP    $C088,X
06BE       RTS
06BF sub_6BF:
06BF       SEC
06C0       PLA
06C1       SBC    #6
06C3       STA    loc_8
06C5       PLA
06C6       SBC    #0
06C8       STA    loc_9
06CA       LDX    #$13
06CC       LDA    #$BE
06CE       STA    loc_7
06D0       LDA    #$1A
06D2       STA    loc_6
06D4 loc_6D4:
06D4       LDY    #7
06D6 loc_6D6:
06D6       LDA    (8),Y
06D8       BEQ    loc_6F2
06DA       EOR    (6),Y
06DC       INY
06DD       AND    #$7F
06DF       BEQ    loc_6D6
06E1       CLC
06E2       LDA    loc_6
06E4       ADC    #$1A
06E6       STA    loc_6
06E8       BCC    loc_6EC
06EA       INC    loc_7
06EC loc_6EC:
06EC       DEX
06ED       BNE    loc_6D4
06EF       JMP    (word_3F2)
06F2 loc_6F2:
06F2       INY
06F3       LDA    (8),Y
06F5       STA    loc_4
06F7       INY
06F8       LDA    (8),Y
06FA       STA    loc_5
06FC       CLC
06FD       TYA
06FE       ADC    loc_8
0700       TAY
0701       LDA    loc_9
0703       ADC    #0
0705       PHA
0706       TYA
0707       PHA
0708       SEC
0709       LDY    #2
070B       LDA    (6),Y
070D       LDY    #0
070F       SBC    (6),Y
0711       ASL    A
0712       STA    loc_A
0714       LDA    (6),Y
0716       STA    loc_2
0718       INY
0719       LDA    (6),Y
071B       STA    loc_3
071D sub_71D:
071D       LDA    loc_5
071F       STA    loc_10
0721       LDA    loc_2
0723       AND    #7
0725       ASL    A
0726       STA    loc_0
0728       LDA    loc_3
072A       LSR    A
072B       LDA    loc_2
072D       ROR    A
072E       LSR    A
072F       LSR    A
0730       STA    loc_F
0732 loc_732:
0732       LDX    #$10
0734       LDA    #0
0736 loc_736:
0736       STA    $90,X
0738       DEX
0739       BPL    loc_736
073B       LDY    loc_0
073D loc_73D:
073D       TYA
073E       ASL    A
073F       CMP    #$10
0741       BCC    loc_745
0743       SBC    #$F
0745 loc_745:
0745       TAX
0746       LDA    loc_10
0748       STA    $90,X
074A       INC    loc_10
074C       INC    loc_A0
074E       DEC    loc_A
0750       BEQ    loc_757
0752       INY
0753       CPY    #$10
0755       BCC    loc_73D
0757 loc_757:
0757       LDA    loc_F
0759       JSR    sub_6AA
075C loc_75C:
075C       JSR    sub_55F
075F       BCS    loc_75C
0761       LDA    loc_2E
0763       STA    loc_D
0765       CMP    loc_F
0767       BNE    loc_757
0769       LDX    loc_2D
076B       TXA
076C       EOR    loc_1
076E       AND    #1 ;funny trick #1
0770       BEQ    loc_75C
0772       LDA    $90,X
0774       BEQ    loc_75C
0776       STA    loc_5
0778       JSR    sub_5AD
077B       BCS    loc_75C
077D       LDA    #0
077F       LDX    loc_2D
0781       STA    $90,X
0783       DEC    loc_A0
0785       BNE    loc_75C
0787       INC    loc_F
0789       STA    loc_0
078B       LDA    loc_A
078D       BNE    loc_732
078F       RTS
0790       LDA    #2
0792 loc_792:
0792       STA    $800,X
0795       STA    $A00,X
0798       STA    $B00,X
079B       STA    $900,X
079E       INX
079F       BNE    loc_792
07A1       STA    loc_A
07A3       STA    loc_2
07A5       LDA    #$BE
07A7       STA    loc_5
07A9       JSR    sub_71D
07AC       LDA    byte_63D
07AF       PHA
07B0       LDA    byte_63C
07B3       PHA
07B4       JSR    sub_6BF
07B7       JMP    loc_0
07BA       .BYTE $20
07BB       BIT    byte_C054
07BE       JSR    sub_6BF
07C1       .BYTE   $41,   0,   0,    8
07C5       JSR    sub_6BF
07C8       .BYTE   $42,   0,   0, $40
07CC       JSR    sub_6BF
07CF       .BYTE   $47,   0,   0, $98
07D3       JSR    sub_6AA
07D6       LDX    #4
07D8       LDA    #0
07DA loc_7DA:
07DA       LDY    #$78
07DC loc_7DC:
07DC       STA    $400,Y
07DF loc_7DF:
07DF       STA    $480,Y
07E2       INY
07E3       BPL    loc_7DC
07E5       INC    loc_7DC+2
07E8       INC    loc_7DF+2
07EB       DEX
07EC       BNE    loc_7DA
07EE       JMP    sub_FC58


This time, we start at $790. The read routine is fairly regular. It supports reads that span tracks. The read address routine is at $55F. However, the instructions at $56A-56C are interesting. LSR and EOR #$6A? Why not CMP #$D5? Is it just to confuse people? I thought so at first, but no, that's not it. It's a trick. Looking further down, we see #$AA and #$96, the usual values, but after the 4x4 decoder, instead of #$DE, we see #$EA. Okay, so the address epilog has been changed. We find the corresponding location in the encoded data and fix it (from C9^EA->C9^DE), along with the byte that follows it (EA^D0->DE^D0), in order to preserve the encoding. Are we done? No.

The read data routine is at $5AD. It has another trick. This time, we see the usual #$D5 #$AA #$AD, but again the epilog has been changed. #$EA #$AA #$EB, instead of #$DE #$AA #$EB. Again, we find the corresponding location in the encoded data and fix it. Are we done now? Still not, but let's see what happens.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Jeu 09 Oct 2014, 17:34    Sujet du message: Répondre en citant

The code at $7A5 wants to read to $BE00. The data at $BE00 contain an array of structures that describe the location of the rest of the data on the disk. It's very important.

The structure starts with a tag, followed by the start and end track/sector. When the routine at $6BF is called, the packet that follows it is the two-byte tag, one byte "reserved" (might have been intended for offset within a page, but is unused), and one byte page address. If the tag can't be found, then the game will reboot.

That's what happens if we run it now. This is strange, because we can see clearly that we find the right sector and read the data. The problem occurs during the decoding. For some reason, only the last two bytes of the page are decoded. The rest are untouched.

The reason for that is the instruction at $61A, which is where the index value comes from for decoding the data. Why LDY $2F instead of LDY #00? Heh, what is stored at $2F? Why, let's return to the read address routine. The instruction at $595 is STA $2C,Y. It stores checksum, sector, track, volume at $2C-2F. So $2F is the volume number. The game expects a volume number of zero. A DOS 3.3 disk typically has a volume number of #$FE. If #$FE is used as the index, only the bytes at #$FE and #$FF will be decoded. Nice.

So, we find that load instruction in the encoded data and change it to LDY #$00. Does it work now? Oh, still not, but now it hangs instead of reboots, so we are getting somewhere. And where is it hanging? The routine at $75C, which reads the address block. Why is it hanging? Because of the comparison at $769-771.

Code:
0769       LDX    loc_2D
076B       TXA
076C       EOR    loc_1
076E       AND    #1
0770       BEQ    loc_75C


It's doing something with the sector number and the value at $01. For some reason, the result is always zero.

We know where the sector number comes from, but where does the value for $01 come from? Once again, let's look at the routine which reads the address block, specifically the instruction at $566. It's storing the nibble that was read, and then it performs the LSR and EOR. The LSR discard bit 0, so that the EOR can match if the original value was either #$D5... or #$D4.

The first time that we called the routine, it passed, because the sector that it wanted is even, and the address prolog for that sector was #$D5 #$AA #$96. However, we're on an odd sector now. The prolog is #$D4 #$AA #$96. Yes, the address prolog is #$D5 #$AA #$96 for the even sectors, and #$D4 #$AA #$96 for the odd sectors. Very funny. So we change that AND #$01 to AND #$FF in the encoded data. Does it work now? Yes, we are finally done.

That's not all. Nothing to do with the crack, simply something very interesting. Take a look at the step routine, at $6AA-6BE.

Code:
06AA       LDX    locret_30
06AC       CMP    $C089,X
06AF       CMP    loc_D
06B1       BEQ    loc_6BB
06B3       ASL    A
06B4       ASL    loc_D
06B6       JSR    loc_64E
06B9       LDX    locret_30
06BB loc_6BB:
06BB       CMP    $C088,X
06BE       RTS


It turns on the drive, performs the seek if it must, then turns off the drive, and does not turn it back on! Maybe you're wondering how it can read the disk if it's turned off? If so, then go and read the technical specification for the disk drive. Read it very carefully. After the drive is turned off, there is a one second delay in which data can be read reliably. That's plenty for reading a single sector.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 2945
Localisation: Le Chesnay, France

MessagePosté le: Ven 10 Oct 2014, 13:52    Sujet du message: Répondre en citant

Ah the LSR CMP #$6A is used on Gato where you have header markers of D5AA96 and D4AA96

funny thing!
av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
qkumba



Inscrit le: 29 Jan 2012
Messages: 176

MessagePosté le: Ven 10 Oct 2014, 16:12    Sujet du message: Répondre en citant

It looks like Masquerade (same author) uses a very similar (but not identical) protection. I'll write about that one next.
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Page 1 sur 1

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com