CD check reverse engineering Lv1

décembre 13, 2014

En reverse engineering les protections dites CD CHECK sont particulières car bien souvent elles sont liées à l’industrie du jeux vidéos, même si il faut reconnaitre que depuis peu les jeux en ligne dématérialisés ont forcément changé la donne, elles restent parfois impressionnante de complexité.

Au travers divers articles je vais tenter de décortiquer et d’expliquer différentes types protections, plus ou moins simple. Vous allez voir que certaines protections contre la copie sont d’une nullité exemplaire et d’autres à l’inverse ont nécessité des années de recherche. L’industrie du jeu vidéo est un marché très juteux, les grand groupes n’ayant pas vraiment envie de voir leur dernières sortis copiées facilement, elles ont confié la protection de leur jeu à des entreprises très spécialisées dans ce domaine (Securom, CDilla, safedisc..).

Inutile de préciser que ces articles ne sont qu’a vocation éducative. L’ensemble de mes tests seront opérés sur une plateforme 32 bits.

Commençons par un basique :
A peine je lance ce crackme (abex crackme#1), qu’un message apparait : « Make me think your HD is a CD-ROM » . On clique sur OK, et Hop « This is not a CD-ROM drive ».
cdcheck1

PEiD ne nous indique rien de particulier, on dégaine donc Ollydbg et on va regarder notre exécutable de plus prés.

Les BPX les plus utilisés dans le CD checks sont: GETDRIVETYPEA et GETVOLUMEINFORMATIONA.
Comme nous l’indique la MSDN : GETDRIVETYPEA : Détermine si le lecteur est « removable, fixed, CD-ROM, RAM disk, or network drive ».
et concernant la MDSN : GETVOLUMEINFORMATIONA : Récupère les informations sur le système de fichiers, le volume qui lui est associé avec le répertoire racine.
cdcheck1
Pas manqué, l’api getdrivetypeA est présente, et un autre truc me saute directement aux yeux :

Le crackme compare (CMP) la valeur EAX et ESI. l’instruction CMP soustrait l’opérande source à l’opérande de destination.
Si ces deux valeurs sont égales (JE Jump if Equal) alors il saute jusqu’en 0040103D. C’est à dire qu’il affiche que l’on a réussi : « YEAH » ..machin truc..

Pour ceux qui découvre le reverse engineering voici un petit tableau récapitulatif des sauts conditionnels :

Tous d’abord je vais poser un breakpoint (F2) sur :

afin de savoir quel valeur l’exécutable compare. Je lance le crackme (F9) je clique sur OK, et comme prévu il break, me permettant de connaitre les deux valeurs de ESI et EAX.

Parfait, toute l’info est devant nos yeux ! Voila un petit tableau récapitulatif vous allez vite comprendre :

La valeur dans EAX veux dire:

Donc le crackme ici compare EAX avec 3 ! Donc il veut un DISQUE DUR, sinon il ne saute pas!!

Evite t-on donc de se casser la tronche .. on va directement patcher la ligne suivante :

Dans ollydebug (logiquement vous êtes encore dans le break précédent) on se place sur
00401026 et on se fait un clic droit BINARY -> EDIT et op on change le 74 par 75 .. et OP F9

« Ok, I really think that your HD is a CD-ROM! :p »

Bingo.