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

ARTICLES

27 / 31

Amsoft Disc Protection System by EXOPAL Software Services : 3D GRAND PRIX

CRACK de 3D GRAND PRIX (Amsoft – 1985) par ALEX/FDLC

 

Système de protection Amsoft Disc Protection System by EXOPAL Software Services avec deux fichiers seulement disc.bas et disc2.bin. Il y a deux faces mais elles sont identiques !

 

1) L'analyse de la D7 nous montre que les pistes 0 à 2, 28 à 31 sont formatées en DATA mais rien après la piste 31 alors que les pistes 3 à 27 sont formatées en 9 secteurs (&A5-&AD). La piste 3 (secteur &A5) nous apporte une nouvelle fois la réponse au problème : elle porte la signature Amsoft Disc Protection mais aussi le loader écrit en BASIC que nous dévoile Discology :

 

 

 

 

 

 

2) On formate une D7 en DATA et on récupère le fichier basic crack.bas à partir des secteurs &A5 et &A6 de la piste 3. Voir routine 3DGP_1A.asm. Pb le listing est là mais on ne peut pas sauvegarder le fichier ; il faut le retaper ou trouver un moyen de récupérer le listing (WINAPE/SHOW ASSEMBLER/READ BASIC)

 

3) L'analyse des pistes modifiées nous renseigne sur les fichiers ; les pistes 4 à 13 sont remplies alors que la piste 14 est vide. Les pistes 15, 16, 17 et 18 (jusqu'au secteur &A9) sont occupées ; soit 32 secteurs ; c'est bien sûr l'image de présentation que l'on récupère. Voir routine 3DGP_1B.asm.

 

4) Les pistes 4 à 11 jusqu'au secteur &A7 sont occupées ; soit 66 secteurs pour &8400 octets. On en déduit que c'est le fichier 3dfile.bin mentionné dans le loader basic ; malheureusement le memory &A2F ne nous donne pas la bonne adresse de début du programme.

Déterminer l'adresse de chargement de ce fichier a été difficile. J'ai cependant remarqué que le call &4123 était suivi de chargements sur la D7 originale. J'ai donc recherché la chaîne &77 &BC qui correspond à l'ouverture d'un fichier et je l'ai trouvée en &12B, secteur &AB, piste 6. En &123, début de la routine de chargement qui pointe sur la taille du nom et le nom du fichier à charger. Donc j'ai calculé la position avec 9 secteurs piste 4 + 9 secteurs piste 5 et 7 secteurs piste 6 donnent 25 secteurs *512 octets -(&1FF-&123+1) = &3123 ; on arrive donc à une adresse de &3123 depuis le début du fichier pour l'adresse (call) &4123 donc &4123-&3123=&1000 ; on a enfin l'adresse de chargement du fichier 3dfile.bin !!! Il n'y a plus qu'à le récupérer : voir routine 3DGP_1C.asm.

 

5) En analysant le code à partir de &4123, on voit deux autres chargements : sinum.bin et wheels.bin. Si on suit la logique des pistes de la protection, sinum.bin occupe la piste 12 des secteurs &A5 à &AB, soit 7 secteurs car ensuite secteurs vides. Il se charge en &40 et a une taille de &E00 octets. Il n'y a plus qu'à le récupérer, voir routine 3DGP_1D.asm.

 

6) Enfin, les 9 secteurs occupés de la piste 13 forment le fichier wheels.bin chargé en &C000 avec une taille de &1200 octets. Il n'y a plus qu'à le récupérer, voir routine 3DGP_1E.asm.

 


3DGP_1A.asm

;; copie du jeu 3D GP de la version Amsoft Disc Protection System by Exopal a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; chargement du fichier loader basic sur la piste 3 secteurs &A5-&A6

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,&170 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,3 ;; D = track number
ld c,&A5 ;; C = sector id
ld b,02 ;; 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 &AE
jr nz, net
ld c,&A5
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,&170 ; adr CHARGEMENT
ld de,&2D0 ; taille nb octets *512 (&200 octets), &20*&200 = &4000
ld bc,&0000 ; adr execution
ld a,0 ; file type 0 = basic
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer

ret


.nom
defb "CRACK.BAS"
.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


3DGP_1B.asm

 ;; copie du jeu 3D GP de la version Amsoft Disc Protection System by Exopal a la version fichiers

;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; recuperation de l'image de presentation, 32 secteurs pistes 15 a 18 (jusqu'au secteur &A9)

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,15 ;; D = track number
ld c,&A5 ;; C = sector id
ld b,&20 ;; 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 &AE
jr nz, net
ld c,&A5
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,&4000 ; taille nb octets *512 (&200 octets), &20*&200 = &4000
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 "SCREEN.AWS"
.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


3DGP_1C.asm

;; copie du jeu 3D GP de la version Amsoft Disc Protection System by Exopal a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; recuperation du fichier 3dfile, 66 secteurs pistes 4 a 11 (jusqu'au secteur &A7)
;; 3dfile,&1000,&8400,&4123

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,&1000 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,4 ;; D = track number
ld c,&A5 ;; C = sector id
ld b,066 ;; 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 &AE
jr nz, net
ld c,&A5
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,&1000 ; adr CHARGEMENT
ld de,&8400 ; taille nb octets
ld bc,&4123 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer

ret


.nom
defb "3DFILE.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


3DGP_1D.asm

;; copie du jeu 3D GP de la version Amsoft Disc Protection System by Exopal a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; recuperation du fichier sinum, 7 secteurs piste 12 (jusqu'au secteur &AB)
;; sinum &40,&E00,&00


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,12 ;; D = track number
ld c,&A5 ;; C = sector id
ld b,07 ;; 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 &AE
jr nz, net
ld c,&A5
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,&0E00 ; taille nb 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 "SINUM.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


3DGP_1E.asm

;; copie du jeu 3D GP de la version Amsoft Disc Protection System by Exopal a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; recuperation du fichier wheels, 9 secteurs piste 13
;; wheels &c000,&1200,&00



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,&C000 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,13 ;; D = track number
ld c,&A5 ;; C = sector id
ld b,09 ;; 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 &AE
jr nz, net
ld c,&A5
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,&1200 ; taille nb 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 "WHEELS.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 Basic

10 MODE 0:BORDER 0:FOR i=0 TO 15:INK i,0:NEXT
20 LOAD"screen.aws"
30 BORDER 14:INK 0,0:INK 1,1:INK 2,2:INK 3,10:INK 4,3:INK 5,6:INK 6,6:INK 7,16:INK 8,26:INK 9,13:INK 10,25:
INK 11,14:INK 12,24:INK 13,20:INK 14,23:INK 15,26
40 OPENOUT"d":MEMORY &A2F:CLOSEOUT
60 ENT -1,5,-3,1,5,3,1
80 ENT 2,80,-2,8
90 ENV 7,49,1,0
100 ENV 8,49,3,0
110 ENV 9,49,5,0
120 ENV 10,49,7,0
130 ENV 11,49,9,0
140 ENV 12,49,11,0
150 ENV 13,49,13,0
160 ENV 14,49,14,0
170 ENV 15,49,15,0
190 ENV 3,1,0,20,8,-2,5
210 ENV 4,1,16,100,1,-16,100
220 ENT -4,3,-15,13
240 ENV 5,=9,5000
250 ENT 5,=5,1
270 ENV 6,=9,5000
280 ENT 6,=100,10
300 LOAD"3dfile"
320 CALL &4123


Article rédigé par : Alexandre OLLIER

 

Article créé le : Dimanche 15 Janvier 2023 à 11 h 09
Dernière mise à jour le : Jeudi 09 Février 2023 à 23 h 01
 
 

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.