Protection: CD-CHECK

 

 


Salut tout le monde , pour mon entré dans la shmeitcorp j'ai décidé d'approfondir un sujet encore inexploré ou trés peu (memento 2) qui est la protection par cd-check !Ce tut ...sera général et je l'espere résumera tous les types de cd-check .

Allé on est parti :
Cette protection est très répendue ..en effet les boites de création de jeux vidéos se servent de cette protection pratiquement tout le temps !!Très peu de jeux sont dépourvus de cette protection (et de plus en plus de soft aussi)

La protection par CD-CHECK consiste a ne pas jouer a un jeux sans en utiliser son cd !
le logiciel va donc regarder au lancement du jeux si il y a un cd dans le lecteur ... mais surtout si ce cd correspond bien a l'original .. et pour cela plusieurs méthodes existent .
De plus il faut faire attention a avoir bien enlever toutes les parties de cette protection et donc du code faisant surgir bien souvent un nag nous indiquant l'absence de cd dans le lecteur ou l'absence du cd original !
Car fréquemment cette protection se fait au lancement du jeux mais aussi en allant dans une option du jeu ... comme par exemple dans la partie multijoueur (ex : Starcraft ) ...

On peut donc dire en résumé .. une protection finalement pas très difficile a cracker ...mais bon il faut de la pratique et de la méthode ..



Tout d'abord les outils a utiliser :


Comme ce tut doit se révéler GENERAL voici la plupart des techniques possibles et réalisées par les programmeurs pour activer cette protection :

1) La plus courante : GETDRIVETYPEA :

Exemple type :

* Reference To: KERNEL32.GetDriveTypeA, Ord:0000h

:0080101D E878000000 Call 00801024
:00801022 83F805 cmp eax, 00000005 <== Ici on vérifie la présence d'un cd (5)
:00801025 75DC jne 00801200

Le cmp eax,00000005 permet de soustraire la valeur que contient eax a 5 (la valeur 5 correspond au CD-Rom : voir le petit rappel ci-dessous)

Si eax différent de 5 on saute vers le bad message ........

ici eax sera égal a 3 ..... qui correspond au disque dur ! Donc pour passer simplement cette protection il suffit d'inverser le saut en 00401035 de facon a qu'il ne saute pas .....

petit rappel :

 

Valeur Correspondance
0 Impossible de déterminer le lecteur
1 Pas de racine
2 DriveRemoveable
3 Disque Dur
4 Remote Drive
5 CD-Rom
6 Lecteur de Ram

Voila , vous en savez assez pour cette premiére partie ......donc first protection passée !!!


2)Fréquemment utilisé : GETVULMEINFORMATIONA :

Exemple type :

* Reference To: KERNEL32.GetVolumeInformationA, Ord:0000h <== voici la vérification du volume (ou label ) du cd .
:0040104D E85E000000 Call 004010B0
:00401052 0BC0 or eax, eax
:00401054 74BD je 00401013

ou encore :

* Reference To: KERNEL32!GetVolumeInformationA <== on prend le nom du volume
:004092AC 81BD70FCFFFF21787573 CMP DWORD PTR [EBP-0390],73757821 <== la fameuse comparaison entre notre label et le bon label
:004092B6 0F85F9000000 JNZ 004093D8


Cette fois ci on va vérifier l'authenticité du cd dans le lecteur ......cette protection ce trouve logiquement aprés le fameux Getdrivetypea ....car si il n'y pas de cd dans le lecteur il est logique que l'on ne vérifie pas si c'est le bon cd :) (of course)

Ici il va donc il y avoir une comparaison entre le label du cd dans notre lecteur et celle du cd origininal (tout ceci ce remarque trés clairement sous soft-ice)
Il suffit tout simplement d'inverser encore les sauts pour ce sortir de cette mauvaise passe ;)


3)Courante : GETDISKFREESPACE :

Exemple type :

* Reference To: KERNEL32.GetDiskFreeSpaceA, Ord:0000h <== verifie si il y a encore de la place dans le disk présent
:00432132 E84B000000 Call 00432155
:00432138 A15F224000 mov eax, dword ptr [0040225F]
:00432144 0BC0 or eax, eax
:00432146 75AC jne 00443452

Dans ce cas la ... la protection consiste simplement a regarder si il reste de la place dans le disk utilisé :

si c'est disque dur .... il reste de la place donc le or eax,eax n'est pas égal a zéro donc on saute et c'est fini ...

si c'est un cd-rom ....c'est good :) !! Pour passer cette protection vous l'aurez encore deviné ==> on va faire de facon a ce que ca ne saute jamais ! Donc on nop le saut (9090 a la place de 75AC)

 

4) Peu courante : GETMODULEFILENAMEA :

Exemple type :

*Reference To: KERNEL32!GetModuleFileNameA <== On vérifie le nom
00401214 8A8DBCFAFFFF MOV CL,[EBP+FFFFFABC] <== notre drive
0040121A 3A8DE8FBFFFF CMP CL,[EBP+FFFFFBE8] <== on le compare avec celui ou est installé le prog
00401220 7518 JNZ 0040123A

J'aime bien cette protection :) , dans ce cas on va vérifier en réalité le chemin d'accés (on le vois toujours trés bien avec soft-ice a l'aide d'un petit d CL puis d'un autre petit d EBP+FFFFFBE8 ... dans mon exemple) d'ou est lancé le prog !!

Par exemple on le lance a partir de c:/programes files/jeux au lieu du cd (c'est un exemple) .... il va donc comparer si ces chemins d'accés correspondent : si ils sont identiques : pas de présence du cd .......si ils sont différents le cd est présent .il va donc suffir de forcer le saut (au lieu de 7518 vous mettez EB18 ..dans mon exemple).


5)Assez rare : SETVOLUMELABELA (on le trouve dans les grosses boites de jeux parfois ...sierra ..etc..) :

Exemple type :

*Reference To: KERNEL32!SetVolumeLabelA
00401335 48 DEC EAX <== on décrémente eax donc on modifie le label
00401336 7526 JNZ 0040135E <== et biensur si il change c'est fini !!

Bien entendu changer le label d'un cd est impossible donc ....si le programme arrive a le modifier c'est que le cd original n'est toujours pas présent !!!
Pour passé cette protection on change le 7526 en eb26 et voila .


6)Rare : LCREAT :

Exemple type :

* Reference To: KERNEL32!_lcreat
00401369 83F8FF CMP EAX,-01
0040136C 7428 JZ 00401396

lcreat permet de créer un fichier ....et créer un fichier sur un cd c'est pas encore possible normalement :) .... donc le programme essai de créer un fichier et .... si il y arrive on se fait encore avoir : il va donc suffir de forcer le programme a ne pas sauter a cette endroit .... on peut nopper ou inverser le saut !!


Les différentes méthodes de procéder :

PS : N'oubliés pas quand soft-ice break de faire f12 jusqu'a sortir du kernel 32 ....afin d'arriver dans le programme et donc de remonter jusqu'au call qui est important (normalement tout sa est aquis) ...


Ce tut s'achéve ... je vous laisse de quoi vous entrainer avec ce crackme :) ...il est pas difficile et si vous avez bien lu tout mon BlaBla ..en 3 secondes vous l'aurez fini !!
@+ and good crack :)