Compétences requises : posséder quelques bases en cracking.
Matériel requis : FlashGet 1.40, un désassembleur, un debugger (optionnel) et éventuellement un éditeur héxadécimal pour appliquer le patch.
Dans ce tutoriel, nous allons apprendre comment cracker FlashGet 1.40 de manière simple et propre.
Notre étude portera dans un premier temps sur l'identification de la routine déterminant si le logiciel est enregistré ou non, puis nous verrons comment modifier cette dernière afin de simuler le mode enregistré.
La première chose à faire est de lancer FlashGet ;-). Un nag s'affiche, indiquant qu'il s'agit d'une version d'évaluation, qu'il faut l'enregistrer, etc... On clique donc sur Continuer pour démarrer le programme ; à ce niveau nous pouvons détecter deux autres éléments intéressants : une bannière de publicité en haut de l'interface et un item Register... dans le menu ?.
On se rend donc dans la boîte de dialogue d'enregistrement, et on renseigne les trois champs Nom, E-Mail et Code d'enregistrement. Une boîte de message apparaît, demandant de redémarrer FlashGet pour que les informations soient validées.
À ce stade, nous allons quitter FlashGet comme demandé, et réfléchir quelques instants.
Si le programme vérifie les informations lors de son lancement (il s'agit de l'hypothèse la plus probable), c'est qu'elles sont stockées quelque part. Or il n'y a pas énormément de possibilités : le répertoire de FlashGet ne comportant visiblement pas de fichier de configuration, nous allons faire un petit tour dans la base de registre...
On lance Regedit (Démarrer -> Éxécuter -> regedit) et on fait une recherche avec notre faux serial. Comme par magie, nous attérissons au niveau de la clé HKEY_CURRENT_USER\Software\JetCar\JetCar\General où le nom, l'email et le serial sont respectivement sauvegardés dans les variables RegDisp, RegName et RegPass.
Notre stratégie d'approche va donc consister à désassembler le programme, puis rechercher la string RegPass dans le listing (on suppose que la validation concernera le serial), afin de pénétrer dans la procédure de vérification.
Comme prévu, nous ouvrons le fichier flashget.exe avec notre désassembleur...
Maintenant, il s'agit de rechercher le texte RegPass. Il y a plusieurs moyens pour y arriver, et cela dépend de votre désassembleur. Je vous laisse donc vous débrouiller !
Si vous avez réussi, vous devriez normalement arriver à l'adresse 41C3E1 dans un premier temps. Apparemment, il s'agit de la routine d'écriture vers le registre qui est appelée lorsque l'on quitte le logiciel, on va donc poursuivre notre recherche.
On trouve ensuite une deuxième occurence en 41C5B6. Comme précédemment, on jette un oeil autour pour voir si l'on se situe bien au bon endroit. Visiblement c'est le cas, car il semble que l'on ait affaire à une vérification de l'email entré (avec les caractères @ et . présents dans le listing) et du serial (fgf-, fgc-) un peu plus loin.
Sans décortiquer le code à fond (c'est long et inutile dans le cadre de ce tutoriel), nous allons essayer de comprendre ce que fait la validation d'un point de vue global, afin de pouvoir la renverser.
Si on remonte un peu dans le code, on remarque que l'on se trouve dans un call (un appel de fonction). Il y a donc de fortes chances pour que la valeur retournée (placée dans le registre eax) détermine si le mode enregistré doit être activé ou non.
Voici un exemple illustrant ceci :
appel de la fonction
si valeur_retournée == 1 alors
mode_enregistré = oui
sinon
mode_enregistré = non
Pour être sûr que l'on est bien dans ce cas-là, on descend en bas de la procédure jusqu'à atteindre une instruction ret ou retn. On arrive ici :
0041C730 push 0FFFFFFFFh
0041C732 mov ecx, ebx
0041C734 call ?ReleaseBuffer@CString@@QAEXH@Z
0041C739 loc_41C739:
0041C739 pop edi
0041C73A pop esi
0041C73B pop ebp
0041C73C xor eax, eax ; EAX = 0
0041C73E pop ebx
0041C73F mov ecx, [esp+2Ch+var_C]
0041C743 mov large fs:0, ecx
0041C74A add esp, 2Ch
0041C74D retn ; VALIDATION ÉCHOUÉE
0041C74E loc_41C74E:
0041C74E push 0FFFFFFFFh
0041C750 mov ecx, ebx
0041C752 call ?ReleaseBuffer@CString@@QAEXH@Z
0041C757 mov ebx, [ebx]
0041C759 mov ecx, [esp+3Ch+var_24]
0041C75D push 1
0041C75F push ebx
0041C760 push offset aGeneral
0041C765 call sub_4B47CE
0041C76A mov ecx, [esp+3Ch+var_C]
0041C76E pop edi
0041C76F neg eax
0041C771 sbb eax, eax
0041C773 pop esi
0041C774 pop ebp
0041C775 pop ebx
0041C776 neg eax ; EAX = 1
0041C778 mov large fs:0, ecx
0041C77F add esp, 2Ch
0041C782 retn ; VALIDATION RÉUSSIE
Bon, cela fait pas mal de choses d'un coup, mais d'une manière générale, nous constatons que la fonction peut se terminer de deux façons : soit eax = 0 (bad boy), soit eax = 1 (good boy).
L'idéal serait de fixer la valeur de eax à 1 une bonne fois pour toutes, ce qui forcera le logiciel à passer en mode enregistré.
Le choix le plus judicieux est d'effectuer les modifications suivantes au début de la procédure :
xor eax, eax ; vide eax
inc eax ; eax = 1
retn ; quitte la fonction
Ainsi, la routine de vérification renverra systématiquement 1 sans même tester la validité du serial, puisque en dessous de notre instruction retn le code ne sera pas éxécuté.
On se place au début (à l'adresse 41C550, soit à l'offset 1C550) et on change les opcodes par les suivants : 33C040C3 (ce qui correspond aux instructions plus haut).
Faites les modifications avec un éditeur héxadécimal, lancez FlashGet et vous constaterez que le nag et la bannière de pub ont disparu ! Vous pouvez même ajouter votre nom dans les informations d'enregistrement en modifiant la propriété RegDisp dans la base de registre. On y est arrivés !
Comme vous avez pu le voir à travers ce tutoriel, FlashGet 1.40 est un logiciel plutôt facile à cracker. Si vous n'avez pas tout compris, c'est normal, mais essayez de bien relire les explications en testant au fur et à mesure avec un debugger. Dans un domaine tel que le cracking, rien ne vaut la pratique !
Enfin, nous avons déplombé FlashGet, mais sachez qu'il existe une bien meilleure solution pour en venir à bout : trouver un serial valide et dans l'absolu, créer un keygen. Ce sera l'objet d'un prochain tutoriel sur le sujet.
En attendant, entraînez-vous bien !
Remerciements : The Analyst, Lise_Grim ainsi que la ShmeitCorp pour leurs tutoriaux qui m'ont permis de débuter dans le cracking.
Je salue par ailleurs les membres de la ICIteam, et tous les gens fréquentant le CrFF !