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 |