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

ARTICLES

15 / 31

SPEEDLOCK 1985 / 1986

- Le loader ASM de la protection SPEEDLOCK 1985 est protégé par 2 cryptages. Le premier décryptage s'efffectue toujours avec la même clé : &8D car cette clé est calculée à l'aide du registre R et que le code ASM pour arriver à ce premier décryptage est identique à tous les logiciels protégés par le SPEEDLOCK 1985.

- Le SPEEDLOCK 1986 est composée de deux phases : le système de deux cryptages reposant sur le registre R du SPEEDLOCK 1985 (phase 1) puis 128 cryptages (phase 2) dont les clés sont les données décryptées lors de la première phase.


HACK de la première clé de décryptage du système SPEEDLOCK 1985-1986

La protection SPEEDLOCK 1985-1986 utilise le registre R du Z80 pour calculer la première clé de décryptage du loader binaire (souvent AAAA.BIN), ce qui est rusé car toute tentative de charger et de décrypter soi-même le loader aboutit à la génération d'une clé erronée en raison du mode de fonctionnement particulier du registre R. C'est le registre de rafraîchissement qui est incrémenté en fonction du nombre d'instructions lues. Il est cependant possible de hacker facilement cette clé comme il est indiqué ci-dessous avec les outils de l'époque :


1) Patcher une copie fonctionnelle d'un jeu avec une protection SPEEDLOCK 1985 ; ici, le jeu HACKER :
* Figure A :



* Figure B :

 

Les figures A et B nous montrent la zone et les octets correspondant au transfert de la première clé de décryptage dans la boucle de décryptage du loader ASM dans le fichier crypté AAAA.BIN. La ligne 0035 de la figure B : LD A,R, signifie que le registre A reçoit la valeur du registre R donc la valeur de la clé recherchée.

 

Nous allons utiliser la technique du détournement de code ASM car nous allons remplacer la commande LD A,R par un saut à l'adresse &6000 (JP &6000) où nous aurons installé notre routine personnelle pour afficher la valeur contenue dans le registre A :


* Figure C :



* Figure D :

 

Vous remarquerez que les octets &43-&44 de la figure A, &ED-&10, ont été remplacés par les valeurs &FE-&0F dans la figure C ; c'est normal car il s'agit du checksum (valeur de contrôle du fichier) qui doit être recalculé après notre modification. Sauf erreur de ma part, cette opération doit être effectuée quand on modifie l'entête du fichier, ce qui est notre cas.

 

2) Ecrire une petite ASM qui va afficher le caractère ASCII correspondant à la valeur hexadécimale contenue dans le registre A (transférée depuis le registre R) car c'est la première clé de décryptage de la routine SPEEDLOCK :

 

ORG &6000

PUSH AF	; SAUVEGARDE LE CONTENU DE AF avec A=clé de décryptage !
LD A,1
CALL &BC0E	; MODE 1
LD A,1		; PEN 1
LD B,26	; couleur 26
LD C,26	; couleur 26
CALL &BC32	; ACTIVATION DE CETTE COULEUR
POP AF		; RESTAURE LE CONTENU DE AF avec A=clé de décryptage !
CALL &BB5A	; AFFICHAGE DU CARACTERE
CALL &BB18	; ATTENTE FRAPPE TOUCHE
RET

 

3) Sauvegarder la routine ASM ci-dessus sous forme d'un fichier Basic qui lance ensuite le loader du jeu, le fichier HACKER.BIN :

 

10 'DECRYPTION KEY FINDER
20 REM lancer le programme et chercher la valeur ASCII du caractère affiché à l'écran
30 FOR I=0 TO 22:READ A$:POKE &6000+I,VAL("&"+A$):NEXT I
40 DATA F5,3E,01,CD,0E,BC,3E,01,06,1A,0E,1A,CD,32,BC,F1,CD,5A,BB,CD,18,BB,C9
50 RUN"HACKER.BIN"


4) RUN"KEY.BAS qui nous affiche :



5) Il suffit ensuite de consulter la table ASCII pour déterminer la valeur ASCII de ce caractère :

 

Nous avons donc identifié avec succès la première clé de décryptage : la valeur &8D.



HACK de la 2e clef de la protection SPEEDLOCK 1985-1986

1) Après avoir obtenu la première clef, nous pouvons déchiffrer partiellement le loader crypté car ce loader présente un second cryptage qui utilise à nouveau le registre R comme clé (adresse &A724) dans la boucle de décryptage ci-dessous. Il faut donc calculer la valeur de R en &A724.

On remarque que le fichier HACKER.BIN en &3ED9 cherche et initialise la ROM pour l'AMSDOS (accès fichiers notamment) avec CALL &BCCE. On remarque qu'une fois cette fonction appelée avec succès, la valeur &C9 est inscrite en &BF01.

 

2) Nous allons commencer par calculer R en &A700. Le programme arrive en &A700 après avoir décrypté le dernier octet du loader AAAA.BIN.

Dans le cas du jeu HACKER, il s'agit de l'octet situé en &A82B mais comment calculer la clé et donc la valeur de R utilisée pour cet octet ?

C'est très simple, on connaît la valeur de l'octet codé : &7B et sa valeur décodée : &C0
Il suffit donc d'écrire &7B XOR &C0 = &BB ; nous avons ainsi la dernière valeur de R de la première routine de décryptage donc R=&BB en &AC8C :

&AC8C	XOR 	(HL)		; R=&BC
&AC8D	LD 	(HL),A	; R=&BD
&AC8E	LDI			; R=&BF
&AC90	RET PO		; R=&C0

donc en &A700, R=&C0

 

3) Entre &A700 et &A726, R peut prendre deux valeurs car nous ne savons pas si en &A721 il y a un saut en &BC00. Nous allons donc calculer R si le programme va en &BC00 et s'il ne va pas en &BC00. C'est assez simple :

 

S'il n'y a pas de saut à la routine suite, R=&C0+&1E=&DE ; Si il y a saut à la routine suite, R=&C0+&20=&E0. Nous ne pouvons pas savoir à ce stade qu'elle est la bonne valeur mais il suffit de lancer un décryptage avec la valeur &DE puis un avec la valeur &E0 pour voir que la bonne valeur est R=&E0

 

Voir ci-dessous la routine maison qui décrypte le loader AAAA.BIN du jeu HACKER en faisant deux décryptages successifs avec les clefs &8D et &E0 :

 

;; CHARGEMENT JEU HACKER
;; SPEEDLOCK BYPASS V1.1 ASM

ORG &2000
; LIGNES A UTILISER SI ADRESSE DE CHARGEMENT SUPERIEURE A &A000

LD C,7
LD DE,&40
LD HL,&B0FF
CALL &BCCE

;===========================================
; ====  CHARGEMENT DU FICHIER AAAA.BIN  ====
;===========================================
LD B,FIN-NOM 		; TAILLE NOM FICHIER
LD HL,NOM			; NOM FICHIER	
LD DE,&C000		; 2K BUFFER
CALL &BC77		; CAS_IN_OPEN : OUVRIR
PUSH BC

LD HL,&A700		; ADR CHARGEMENT &A700 A TROUVER AUX OCTETS &9E,&9D DU FICHIER LANCEMENT DU JEU HACKER.BIN
PUSH HL
CALL &BC83		; CAS_IN_DIRECT : LIRE
CALL &BC7A		; CAS_IN_CLOSE : FERMER
;=============================================

LD A,&8D 		; 1ER CLE DE DECRYPTAGE
POP HL		; RECUPERATION ADRESSE DE DEPART
POP BC		; RECUPERATION TAILLE DE LA ZONE CRYPTEE
PUSH HL
PUSH BC
CALL DECODE	; ROUTINE DE DECODAGE
LD A,&E0		; 2E CLE DE DECRYPTAGE
; CP D
JR NC,CLO
ADD A,&80
.CLO
POP DE		; RECUPERATION 2E ADRESSE DE DEPART
POP HL		; RECUPERATION TAILLE DE LA 2E ZONE CRYPTEE
LD B,&2E

.COCO
DEC DE		; CALCUL TAILLE-&2D
INC HL		; CALCUL ADRESSE+&2D
DJNZ COCO 
PUSH DE	
POP BC		
CALL DECODE

RET

DECODE:
LD D,A
XOR (HL)
LD (HL),A
INC HL
DEC BC
LD A,0
CP B
JR NZ,PLUS
CP C
JR NZ,PLUS
RET

.PLUS
LD A,D
ADD A,10
;CP D
JR NC,TOTO
ADD A,&80
.TOTO
JP DECODE

RET

.NOM
DEFB "AAAA.BIN"		; NOM DU LOADER A DECRYPTER
.FIN

 

On peut donc résumer la technique très simplement :
1) On lit X, le dernier octet crypté du fichier codé (AAAA.BIN par exemple)
2) On lit Y, ce dernier octet décrypté
3) On calcule : Z=X XOR Y
4) On calcule Z=Z+&5+&20=Z+&25 pour obtenir la seconde clef de décryptage !

 

Article rédigé par Alex/FDLC

 

Article créé le : Vendredi 16 Février 2024 à 21 h 06
Dernière mise à jour le : Vendredi 16 Février 2024 à 21 h 10
 
 

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.