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

ARTICLES

28 / 31

Amsoft Disc Protection System by EXOPAL Software Services : NUCLEAR DEFENCE

CRACK de NUCLEAR DEFENCE (Amsoft – 1986) par ALEX/FDLC

 

Système de protection : Amsoft Disc Protection System by EXOPAL Software Services. Version sectorielle à transformer en version fichiers.

 

1) L'analyse de la D7 nous montre que les pistes 0 à 2 et 28 à 39 sont formatées en DATA alors que les pistes 3 à 27 sont formatées en 9 secteurs (&E1-&E9) mais les pistes 5 puis 13 à 27 et 28 à 39 sont vides. Il y a deux fichiers disc.bas et disc2.bin stockés sur la piste 0. La piste 3 porte la signature Amsoft Disc Protection ainsi que le nom de 3 fichiers : title, code1 et code2 mais aussi le loader basic :

 

 

 

2) La piste 4 contient des données sur les 9 secteurs mais la piste 5 est vide ! On peut donc en conclure que la piste 4 contient les données d'un fichier du jeu car les chargements se font par secteurs successifs ; c'est le 1er fichier appelé title. Le désassemblage du secteur &E1 de la piste 4 avec Discology se révèle intéressant car il fait apparaître plusieurs adresses significatives : &7033, &7077, &805F, &807B...

 

 

Or, ce fichier qui est écrit sur la piste 4, il a une taille de 9*512=&1200 octets. On peut donc en déduire qu'il commence en &7000 et se termine en &81FF. Quel est le point d'entrée du programme ? On suppose que c'est &7000 comme le montre le listeur BASIC de Discology. Un memory &6FFF:load"title.bin":call &7000 affiche l'image du jeu avant de revenir au Basic ; on a réussi à récupérer l'image de présentation !Voir routine Nuke1.asm.

 

3) La piste 5 est vide, ce qui peut être perçu comme une séparation entre deux fichiers. On constate également que les secteurs &E4 à &E9 de la piste 9 sont vides ! J'en déduis que les pistes 6,7,8 et 9 jusqu'au secteur &E3 inclus forment un second fichier : 30 secteurs soit &3C00 octets. On le nomme code1.bin ; voir la routine Nuke2.asm. Par contre, on ne connaît pas l'adresse de début, ni l'adresse d'exécution.

 

4) De même, les secteurs &E4 à &E9 de la piste 9 sont vides donc on peut les considérer comme un marquage entre deux fichiers. Ainsi, les pistes 10,11 et 12 jusqu'au secteur &E8 (car tout ce qui suit est vide) constitue un 3e fichier : il est composé de 26 secteurs soit &3400 octets. Le désassemblage du secteur &E1 de la piste 9 avec Discology se révèle intéressant car il fait apparaître plusieurs adresses significatives : &6876, &6891, &689A, &68A2, &68B8, &680F...

 

 

J'en déduis que l'adresse de début de ce fichier est &6800 et il occupe la zone &6800-&9BFF, soit &3400 octets. Ainsi, on a un 3e fichier nommé code2.bin voir la routine Nuke3.bin.

On teste un point d'entrée en &6800 mais c'est un échec ; on tente alors &7000 et cette fois-ci cela fonctionne !

 

Attention, dans les routines Nuke1, Nuke2 et Nuke3, j'ai réduit la taille des fichiers en enlevant les octets vides (qui étaient présents sur les secteurs chargés et pas complètement remplis par les 3 programmes) :

Code1.bin => &11D0 octets au lieu de &1200

Title.bin => &3B30 octets au lieu de &3C00

Code2.bin => &3400 octets au lieu de &3400

 

5) On revient au secteur E1 de la piste 3 qui nous fournit les informations manquantes :

 

 

On constate que ce secteur fournit les adresses de début et d'exécution des fichiers :

Title => début &7000, exécution &7000

code1 => début &1000, exécution &1000

code2 => début &6800, exécution &7000

 

Ces données confirment nos trouvailles et complètent les informations manquantes pour le fichier code1 !

 

6) On écrit un loader CRACK.BIN qui charge title, l'affiche puis charge code1 et code2 puis lance le jeu !

(voir routine nuke_loader.asm)



 


NUKE1.asm

;; copie du jeu de la version secteurs a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; chargement du contenu du 1er fichier TITLE
;; chargement a partir de la piste 4 de 9 secteurs (soit &1200 octets) dans la zone &7000-&81CF (&11D0 octets)
;; zone &81D0-&81FF vide


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,&7000 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,&04 ;; D = track number
ld c,&E1 ;; C = sector id
ld b,009 ;; 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 &EA
jr nz, net
ld c,&E1
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,&7000 ; adr CHARGEMENT
ld de,&11D0 ; taille en octets *512
ld bc,&7000 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer

ret

;; filename = maximum of 12 char, 8 for name, "." & 3 for extension

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



NUKE2.asm

;; copie du jeu de la version secteurs a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; chargement du contenu du 2e fichier CODE1
;; chargement a partir de la piste 6 a la piste 9, secteur &E3;
;; soit 30 secteurs (soit &3C00 octets) dans la zone &1000-&4B2F (&3B30 octets)
;; zone &4B30-&4BFF vide


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,&1000 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,&06 ;; D = track number
ld c,&E1 ;; C = sector id
ld b,030 ;; 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 &EA
jr nz, net
ld c,&E1
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,&3B30 ; taille en octets *512
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

;; filename = maximum of 12 char, 8 for name, "." & 3 for extension

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


NUKE3.asm

;; copie du jeu de la version secteurs a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !

;; chargement du contenu du 3e fichier CODE2
;; chargement a partir de la piste 10 a la piste 12 (secteur &E8 inclus)
;; soit 26 secteurs (&3400 octets) dans la zone &6800-&9DFF



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,&6800 ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,10 ;; D = track number
ld c,&E1 ;; C = sector id
ld b,26 ;; 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 &EA
jr nz, net
ld c,&E1
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,&6800 ; adr CHARGEMENT
ld de,&3400 ; taille en octets *512
ld bc,&7000 ; adr execution
ld a,2 ; file type 2 = binaire
call &BC98 ; cas_in_direct = ecrire
call &BC8F ; cas_in_close = fermer

ret

;; filename = maximum of 12 char, 8 for name, "." & 3 for extension

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



nuke_loader.asm

;; ROUTINE chargement jeu Nuclear Defence

org &800

ld c,7 ; numéro de la ROM a initialiser (7 = AMSDOS)
ld de,&40 ; adresse du premier octet utilisable
ld hl,&B0FF ; adresse du dernier octet utilisable
call &BCCE ; initialise une ROM de second plan


ld b,fin-nom ; taille nom fichier
ld hl,nom ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC77 ; cas_in_open = ouvrir en lecture
ld hl,&7000 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer

call &7000


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,&1000 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer

ld b,fin2-nom2 ; taille nom fichier
ld hl,nom2 ; adresse nom fichier
ld de,&C000 ; 2k buffer
call &BC77 ; cas_in_open = ouvrir en lecture
ld hl,&6800 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer

call &7000


;; filename = maximum of 12 char, 8 for name, "." & 3 for extension

.nom
defb "TITLE.BIN"
.fin

.nom1
defb "CODE1.BIN"
.fin1

.nom2
defb "CODE2.BIN"
.fin2



Article rédigé par : Alexandre OLLIER

 

Article créé le : Lundi 16 Janvier 2023 à 21 h 43
Dernière mise à jour le : Lundi 16 Janvier 2023 à 21 h 48
 
 

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.