ARTICLES
31 / 31 |
Amsoft Disc Protection System by EXOPAL Software Services : 3D STUNT RIDER
CRACK de 3D STUNT RIDER (AMSOFT – 1985) par ALEX/FDLC
Deux remarques préliminaires. La protection Amsoft Disc Protection System by EXOPAL a déjà fait l'objet de plusieurs articles dont un concernant Spitfire 40. A ce jour (début 2023), je suis étonné que ce système n'ait été utilisé que pour si peu de jeux Spitfire 40, Macrocosmica, Nuclear Defence, 3D Grand Prix et les 3 versions de Sorcery+ alors qu'Amsoft a publié un très grand nombre de logiciels/jeux. De plus, cette protection est présentée comme la version 3, ce qui signifie logiquement qu'il y a eu au moins deux précédentes versions.
ATTENTION : Il existe deux originaux légèrement différent, deux différences entre les deux versions, la première : les secteurs sont nommés &CB à &D3 et les pistes 32 à 39 ne sont pas formatées pour l'autre version.
Ainsi, en analysant d'autres programmes Amsoft, j'ai trouvé une autre version de l'Amsoft Disc Protection System, une plus ancienne, s'agit-il de la version 1 ou 2 ? Rien ne permet de le lire au moment où cet article est rédigé. Une différence de taille, le nom de la protection n'apparaît nulle part sur la disquette originale. Les pistes 3 et 15 contiennent des informations importantes, comme le démontrent ces écrans Discology :
Néanmoins, plusieurs éléments nous confirment que nous sommes en présence de l'Amsoft Disc Protection System. On y retrouve le découpage de la D7 en fichiers stockés sur des pistes avec des numéros inhabituels (&F5 à &FD ici), fichiers séparés par des secteurs vides. La piste 3 est toujours la première avec le format inhabituel. De plus, les pistes 0 à 2 sont formatées en DATA ainsi que les dernières pistes (28 à 39). On retrouve le fichier DISC2.BIN avec pour adresse de début &A000 et pour taille &648 octets mais il y a ici cinq parties cryptées (en &A000, en &A200, en &A300, en &A400 et en &A500). Pour décrypter le fichier, on peut utiliser la routine DECODEUR.ASM en y rajoutant &A5 dans :
.liste
defb &A4,&A2,&A3,&A5,&FF
.fliste
Le décryptage du fichier DISC2.BIN confirme que nous sommes en présence de l'Amsoft Disc Protection System : car, comme dans la version 3, on peut y lire COPYRIGHT PROTECTED (C)... AMSOFT 1985... MICKO (voir image ci-dessous). Comme la version 3, le code ASM de DISC2.BIN se reloge et s'auto-modifie plusieurs fois.
De plus, si l'on fait une copie de l'original, on décode DISC2.BIN avec la routine DECODEUR.V1.1.ASM, on efface DISC2.BIN, on fait SAVE"DISC2.BIN",b,&A000,&648, on reset le CPC et que l'on tape RUN"DISC alors le jeu se lance et la protection fonctionne malgré le décryptage que nous avons opéré.
La piste 3 s'avère intéressante car elle comporte des noms de fichiers : SRDATAX.BIN qui commence en &0040 et SRDATAY.BIN qui commence en &7952. Se pose le problème de la taille de ces fichiers. La piste 15 nous révèle le troisième fichier SRCDEH.BIN qui commence en &C000 ; là encore, se pose le problème de la taille de ce fichier. Comme à chaque fois avec ce système de protection, l'analyse des pistes fournit les données manquantes : les fichiers y sont stockés avec des secteurs ou des pistes vides comme séparateurs. Du secteur &F5 de la piste 3 au secteur &FA de la piste 5, il y a 9+9+6=24 secteurs soit &3000 octets chargés en &C000 et représentant le fichier SRCDEH.BIN (voir les deux écrans Discology ci-dessus). De la piste 6, secteur &F5 à la piste 12, secteur &FB, il y a 6*9+7=61 secteurs, soit &7A00 octets ; on en déduit qu'ils ne peuvent être chargés qu'à partir de &40 donc, c'est le fichier SRDATAX.BIN. Enfin, de la piste 13, secteur &F5 à la piste 14, secteur &FB, il y a 9+5=14 secteurs soit &1C00 octets chargés en &7952 ; c'est le fichier SRDATAY.BIN. Au-delà, les pistes et leurs secteurs sont vides.
Remarque, il n'y a pas d'écran de présentation dans ce jeu.
===> Pour cracker le jeu, il suffit donc de formater une D7 en DATA, de récupérer le fichier SRCDEH.BIN avec la routine 3D_STUNT_1.asm, le fichier SRDATAX.BIN avec la routine 3D_STUNT_2.asm et le fichier
SRDATAY.BIN avec la routine 3D_STUNT_3.asm.
Attention, la routine assembleur de la piste 3 (chargement des fichiers SRDATAX.BIN et SRDATAY.BIN) est en partie un leurre car la protection détourne les vecteurs &BC77, &BC7A et &BC83 pour faire des sauts vers son propre code. En fait, les données des pistes 3 et 15 sont à considérer comme les données avant l'implémentation de la protection. Il faut donc créer notre propre loader et modifier l'ordre de chargement des fichiers pour éviter un plantage.
Enfin, on écrit un loader en assembleur, voir CRACK.asm, que l'on sauvegarde avec la commande SAVE"crack,bin",b,&A000,&A0,&A000. A noter que l'on charge SRDATAX.BIN, SRDATAY.BIN puis SRCDEH.BIN. On écrit un loader basic (voir DISC.txt) pour proposer les vies infinies :
&BC9E : LD A,(&AA10) .... 3A 10 AA
&BCA1 : DEC A ........... 3D
&BCA2 : LD(&AA10),A ..... 32 10 AA
il suffit de remplacer le 32 par 3A mais comme le code du jeu se reloge, il faut mettre &32 en &E95B et non en &BCA2 avant de faire JP &C028 dans CRACK.BIN.
RUN"DISC" pour accéder au trainer ou RUN"CRACK" pour jouer normalement.
decodeur.asm
;; programme de decryptage des 5 sections codees du loader DISC2.BIN
;; 1) prendre une copie de la D7 originale
;; 2) enlever la protection en lecture et en écriture du fichier DISC2.BIN
;; 3) taper MEMORY &9FFF:LOAD"DISC2.BIN"
;; 4) taper ERA,"DISC2.BIN
;; 5) charger la routine decodeur.asm sous Winape
;; 6) l'assembler sous WINAPE Assembler
;; 7) CALL &8000
;; 8) SAVE"DISC2.BIN",B,&A000,&648
;; 9) RUN"DISC" => le jeu démarre avec un loader décrypté
org &8000
;; decryptage
.debut
ld de,liste
.start
ld hl,&a018
ld a,(&a000)
.decode
xor (hl)
ld (hl),a
inc l
jp nz,decode
ld hl,&a004
.plus
inc (hl)
jp z,fin
ld hl,start+4 ; on modifie aussi notre code pour reussir le decryptage !
inc(hl)
ld hl,&a004
ld a,(hl)
cp #18
jp z,plus
jp start
;; efface la routine de decodage interne a chacune des quatre sections
.fin
ld hl,&a000
.cls
ld(hl),0
inc l
ld a,l
cp #18
jr nz,cls
;; apres la 1e partie en &A000, 2e partie en &A400, 3e partie en &A200,4e partie en &A300 et 5e partie en &A500
ld hl,start+4
ld a,0
ld (hl),a
ld a,(de)
cp #FF
jp z,fini
ld hl,start+&02 ; automodification de notre programme
ld (hl),a
ld hl,start+&05 ; automodification de notre programme
ld (hl),a
ld hl,start+&0E ; automodification de notre programme
ld (hl),a
ld hl,start+&19 ; automodification de notre programme
ld (hl),a
ld hl,start+&25 ; automodification de notre programme
ld (hl),a
inc e
jp start
;; retour au BASIC ==> SAVE"disc2.bin",b,&A000,&648
.fini
ret
liste:
defb &A4,&A2,&A3,&A5,&FF
.fliste
3D_STUNT_1.asm
;; copie du jeu 3D STUNT RIDER de la version Amsoft Disc Protection System a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; chargement du fichier SRCDEH.BIN
org &8000
ld hl,cmd_bios_read_sector
call &bcd4 ; firmware function to find a RSX
ret nc
;; command found
ld (bios_read_sector),hl ;; store address of command
ld a,c
ld (bios_read_sector+2),a
;; store "rom select" of command
;;------------------------------------------------------------------
;; read 512 bytes of data from track D, sector C from disc drive e
ld hl,&C000 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,3 ;; D = track number
ld c,&F5 ;; C = sector id
ld b,24 ;; number of sectors
.charge
push de
;; execute command
rst 3
defw bios_read_sector
ld de,&200
add hl,de
pop de
inc c
ld a,c
cp &FE
jr nz, net
ld c,&F5
inc d
.net
djnz charge
call &bb18
ld b,fin-nom ; taille nom fichier
ld hl,nom ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC8C ; cas_in_open = ouvrir en ecriture
ld hl,&C000 ; adr CHARGEMENT
ld de,&3000 ; taille nb octets *512 (&200 octets)
ld bc,&0000 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer
ret
.nom
defb "SRCDEH.BIN"
.fin
;;------------------------------------------------------------------
;; this is initialised when the "BIOS: READ SECTOR" RSX has been found.
.bios_read_sector
defw 0 ;; address of function
defb 0 ;; "rom select" for function
.cmd_bios_read_sector
defb 4+&80 ;; this is the "BIOS: READ SECTOR" RSX
3D_STUNT_2.asm
;; copie du jeu 3D STUNT RIDER de la version Amsoft Disc Protection System a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; chargement du fichier SRDATAX.BIN
org &A000
ld hl,cmd_bios_read_sector
call &bcd4 ; firmware function to find a RSX
ret nc
;; command found
ld (bios_read_sector),hl ;; store address of command
ld a,c
ld (bios_read_sector+2),a
;; store "rom select" of command
;;------------------------------------------------------------------
;; read 512 bytes of data from track D, sector C from disc drive e
ld hl,&0040 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,6 ;; D = track number
ld c,&F5 ;; C = sector id
ld b,61 ;; number of sectors
.charge
push de
;; execute command
rst 3
defw bios_read_sector
ld de,&200
add hl,de
pop de
inc c
ld a,c
cp &FE
jr nz, net
ld c,&F5
inc d
.net
djnz charge
call &bb18
ld b,fin-nom ; taille nom fichier
ld hl,nom ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC8C ; cas_in_open = ouvrir en ecriture
ld hl,&0040 ; adr CHARGEMENT
ld de,&7A00 ; taille nb octets *512 (&200 octets)
ld bc,&0000 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer
ret
.nom
defb "SRDATAX.BIN"
.fin
;;------------------------------------------------------------------
;; this is initialised when the "BIOS: READ SECTOR" RSX has been found.
.bios_read_sector
defw 0 ;; address of function
defb 0 ;; "rom select" for function
.cmd_bios_read_sector
defb 4+&80 ;; this is the "BIOS: READ SECTOR" RSX
3D_STUNT_3.asm
;; copie du jeu 3D STUNT RIDER de la version Amsoft Disc Protection System a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; chargement du fichier SRDATAY.BIN
org &A000
ld hl,cmd_bios_read_sector
call &bcd4 ; firmware function to find a RSX
ret nc
;; command found
ld (bios_read_sector),hl ;; store address of command
ld a,c
ld (bios_read_sector+2),a
;; store "rom select" of command
;;------------------------------------------------------------------
;; read 512 bytes of data from track D, sector C from disc drive e
ld hl,&7952 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,13 ;; D = track number
ld c,&F5 ;; C = sector id
ld b,14 ;; number of sectors
.charge
push de
;; execute command
rst 3
defw bios_read_sector
ld de,&200
add hl,de
pop de
inc c
ld a,c
cp &FE
jr nz, net
ld c,&F5
inc d
.net
djnz charge
call &bb18
ld b,fin-nom ; taille nom fichier
ld hl,nom ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC8C ; cas_in_open = ouvrir en ecriture
ld hl,&7952 ; adr CHARGEMENT
ld de,&1C00 ; taille nb octets *512 (&200 octets)
ld bc,&0000 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer
ret
.nom
defb "SRDATAY.BIN"
.fin
;;------------------------------------------------------------------
;; this is initialised when the "BIOS: READ SECTOR" RSX has been found.
.bios_read_sector
defw 0 ;; address of function
defb 0 ;; "rom select" for function
.cmd_bios_read_sector
defb 4+&80 ;; this is the "BIOS: READ SECTOR" RSX
CRACK.asm
;; ROUTINE chargement jeu 3D STUNT RIDER
;; avec TRAINER vies infinies
;; save"crack.bin",b,&A000,&A0,&A000
org &A000
ld c,7
ld de,&40
ld hl,&B0FF
call &BCCE
ld b,fin0-nom0 ; taille nom fichier
ld hl,nom0 ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC77 ; cas_in_open = ouvrir en lecture
ld hl,&0040 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
ld b,fin1-nom1 ; taille nom fichier
ld hl,nom1 ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC77 ; cas_in_open = ouvrir en lecture
ld hl,&7952 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
ld a,1
call &BC0E
ld a,1
.cls
push af
ld bc,&0101
call &BC32
pop af
inc a
cp 4
jr nz,cls
ld b,fin00-nom00 ; taille nom fichier
ld hl,nom00 ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC77 ; cas_in_open = ouvrir en lecture
ld hl,&C000 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
ld hl,&A0A0
ld a,(hl)
cp &45
jr nz,jeu
ld hl,&E95B
ld (hl),&3A ; vies infinies
.jeu
jp &C028
.nom00
defb "SRCDEH.BIN"
.fin00
.nom0
defb "SRDATAX.BIN"
.fin0
.nom1
defb "SRDATAY.BIN"
.fin1
DISC.BAS
10 ' TRAINER+1 and Amsoft Disc Protection System removed by ALEX
20 MODE 1
30 PRINT CHR$(150):FOR i=2 TO 39:LOCATE i,1:PRINT CHR$(154):NEXT:LOCATE 40,1:PRINT CHR$(156)
40 LOCATE 1,2:PRINT CHR$(149):LOCATE 10,2:PRINT "3D STUNT RIDER TRAINER":LOCATE 40,2:PRINT CHR$(149)
50 LOCATE 1,3:PRINT CHR$(147):FOR i=2 TO 39:LOCATE i,3:PRINT CHR$(154):NEXT i:LOCATE 40,3:PRINT CHR$(153)
60 PRINT "VIES INFINIES (O/N)?"
70 a$=UPPER$(INKEY$)
80 IF a$="" THEN GOTO 70
90 IF a$="O" THEN GOSUB 130:GOTO 110 ELSE GOSUB 140:GOTO 120
100 GOTO 70
110 POKE &A0A0,&45
120 RUN"crack
130 LOCATE 25,5:PRINT CHR$(24);" OUI ";CHR$(24):RETURN
140 LOCATE 25,5:PRINT CHR$(24);" NON ";CHR$(24):RETURN
Article rédigé par : Alexandre OLLIER
Article créé le : | Vendredi 27 Janvier 2023 à 16 h 57 |
Dernière mise à jour le : | Vendredi 27 Janvier 2023 à 17 h 58 |