ARTICLES
30 / 31 |
Amsoft Disc Protection System by EXOPAL Software Services : 3D BOXING
CRACK de 3D BOXING (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.
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. La piste 3 ne contient pas nécessairement les informations dont nous avons besoin, comme le démontre cet écran Discology :
Néanmoins, plusieurs éléments nous confirme 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 (&EF à &F7 par exemple), 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.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 7 s'avère intéressante car elle comporte des noms de fichiers dont le fichier OBJ présent sur la catalogue quand on a enlevé les protections contre lecture/écriture et cachée/visible. Le listeur Basic nous donne la réponse ! La ligne 20 charge l'image de présentation à l'écran puis le fichier OBJ.BIN est lancé à la ligne 30. Deux remarques à nouveau :
Enfin, l'analyse des pistes 3 à 27 nous montre que les pistes 3,4,5 et 6 jusqu'au secteur &F3 inclus stockent l'image de présentation facile à récupérer. Voir routine 3DBOXING.ASM.
La piste 7 contient le loader basic (voir ci-dessus) et la piste 8, secteur &EF contient le fichier SETUP.BIN qui est chargé en &8000 pour une taille de &200 octets bien que seuls les &31 premiers octets nous intéressent vraiment (mode 0, border et les 16 couleurs de l'image de présentation) :
Pour cracker le jeu, il suffit donc de formater une D7 en DATA, de copier le fichier OBJ.BIN, le fichier TITLE.SCN récupéré avec la routine 3DBOXING.ASM et d'écrire un loader ; voir CRACK.BIN.
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
3DBOXING.asm
;; copie du jeu 3D BOXING de la version Amsoft Disc Protection System a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; chargement du fichier image pistes 3 à 6 (5 secteurs seulement)
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,&EF ;; C = sector id
ld b,32 ;; 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 &F8
jr nz, net
ld c,&EF
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 "TITLE.SCN"
.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 BOXING
;; save"CRACK.BIN",b,&100,&90,&100
org &0100
ld c,7
ld de,&40
ld hl,&B0FF
call &BCCE
ld a,0
call &BC0E
ld bc,&0000
call &bC38
ld hl,couleurs
ld a,0
.plus
push af
push hl
ld b,(hl)
ld c,(hl)
call &BC32
pop hl
inc hl
pop af
inc a
cp 17
jr nz,plus
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 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,&200 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
jp &200
;; filename = maximum of 12 char, 8 for name, "." & 3 for extension
.nom00
defb "TITLE.SCN"
.fin00
.nom0
defb "OBJ.BIN"
.fin0
.couleurs
defb &00,&0D,&1A,&0C,&18,&09,&12,&0A,&14,&01,&02,&0B,&06,&07,&03,&04
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 14 |