ARTICLES
29 / 31 |
Amsoft Disc Protection System by EXOPAL Software Services : MACROCOSMICA
CRACK de MACROCOSMICA (Amsoft – 1986) par ALEX/FDLC
Système de protection : Amsoft Disc Protection System by EXOPAL Software Services mais il y a des fichiers cachés que l'on peut récupérer facilement : outre disc.bas, il y a disc2.bin, loader.bin, udg.bin et screen.scn ; c'est donc une nouveauté car il y a plusieurs 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 (&7B-&83) mais les pistes 13 à 27 sont vides ; le loader semble caché. La piste 3 (secteur &7B) 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) Les pistes 4 à 12 (jusqu'au secteur &80 inclus) comportent des données soit 8*9+6=78 secteurs de &200 octets donc un total de &9C00 octets. Il s'agit du fichier mcode.bin indiqué à la ligne 50 et on nous donne son adresse de début : 970=&3CA. Il suffit d'écrire une routine ASM qui lit 78 secteurs à partir du 1er secteur de la piste 4 dans la zone &3CA-&9FC9 puis on sauvegarde le fichier MCODE.BIN ; voir routine MACRO.ASM.
3) Il suffit de réécrire un loader binaire CRACK.BIN qui charge loader.bin en &9F00 puis faire call &9FAD, call &9F00, charger mcode.bin en &3CA, on efface les couleurs de l'écran de présentation puis on charge udg.bin en &C000 puis call &7530 pour lancer le jeu. Le call &9F33 n'est pas utile.
(voir routine ASM macro_loader.asm). On sauve ce loader avec save"crack.bin",b,&100,&A0,&100
Macro.asm
;; copie du jeu de la version secteurs a la version fichiers
;; drive A (0)= D7 destination
;; drive B (1)= D7 originale !
;; Amsoft disc protection system by EXOPAL Software Services version 3
;; chargement du contenu du fichier MCODE.BIN
;; chargement a partir de la piste 4 pour 78 secteurs (soit &9C00 octets) dans la zone &03CA-&9FC9
org &150
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,&3CA ;; HL = address of buffer
ld e,&01 ;; E = drive number (0 or 1)
ld d,&04 ;; D = track number
ld c,&7B ;; C = sector id
ld b,078 ;; 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 &84
jr nz, net
ld c,&7B
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,&03CA ; adr CHARGEMENT
ld de,&9C00 ; taille en octets *512
ld bc,&7530 ; 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 "MCODE.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
macro_loader.asm
;; ROUTINE chargement jeu Microcosmica
org &100
ld c,7
ld de,&40
ld hl,&B0FF
call &BCCE
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,&9F00 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
call &9FAD
call &9F00
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,&03CA ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
ld a,0
.cls
push af
ld bc,&0000
call &BC32
pop af
inc a
cp 4
jr nz,cls
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,&C000 ; adr CHARGEMENT
call &BC83 ; cas_in_direct = lire
call &BC7A ; cas_in_close = fermer
call &7530
;; filename = maximum of 12 char, 8 for name, "." & 3 for extension
.nom
defb "LOADER.BIN"
.fin
.nom1
defb "MCODE.BIN"
.fin1
.nom2
defb "UDG.BIN"
.fin2
MC.BAS.txt
10 OPENOUT "a"
20 MEMORY HIMEM-1
25 CLOSEOUT
30 LOAD"!loader",40704
35 CALL &9FAD
40 CALL &9F00
45 CALL &9F8F
50 'LOAD"mcode.bin",970
60 CALL &9F33
70 LOAD"!udg.bin",&C000
80 CALL &7530
10000 |TAPE.OUT:SPEED WRITE 1:SAVE"macro",p:MEMORY &9E00:LOAD"loader",&9F00
10005 SAVE"!loader",b,&9F00,&B2:LOAD"screen.scn",&C000
10010 SAVE"!screen.scn",b,&C000,&4000:CHAIN"fred",10000
Article rédigé par : Alexandre OLLIER
Article créé le : | Mardi 17 Janvier 2023 à 21 h 25 |
Dernière mise à jour le : | Mardi 17 Janvier 2023 à 21 h 57 |