CPC-POWER : CPC-SOFTS - CPCArchives 
Options de Recherche :
 
 
 

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
 
 

CPC-POWER/CPCArchives, projet maintenu par Fredouille.
Programmation par Kukulcan © 2007-2024 tous droits réservés.
Reproduction sans autorisation interdite. Tous les titres utilisées appartiennent à leurs propriétaires respectifs.