DeFeAtInG PrOtEcTiOnS By TaIPaN ! ( I )
( Autrement dit : Comment keskon fait pour cracker un programme ... )
I advise you to be in the following resolution : 1024*768
ATTENTION : Ce document à été créé uniquement dans un but pédagogique.
"Casser du logiciel" n'est pas une fin en soi. Dites-vous bien que les concepteurs de logiciels ( même de simples "petits" progs sharewares ) ont passé de nombreuses heures devant leurs écrans ... Il est donc tout-à-fait justifier qu'il soient rémunérer pour leur travail. Ainsi, si vous trouver le logiciel utile, vous êtes priés de bien vouloir vous enregistrer auprès de l'auteur une fois votre période de test passée. Imaginez que ce soit vous qui ayez "pondu" un petit bijou. Aimeriez-vous que quelqu'un le crack, et par là-même, "viole" votre travail ? Aimeriez-vous ne pas recevoir l'argent qui vous était, à juste titre, dû ?
J'espère que vous m'avez compris et que vous respecterez les règles du SHAREWARE... ( Rien ne vous empêche de cracker le programme pour le FUN puis de vous enregistrer ... ;') Enfin, je ne me fais pas trop d'illusion ! )
Je supposerais par la suite que vous avez quelques notions d'assembleur. Si ce n'est pas le cas, vous pourrez quand même réussir à comprendre quelque chose, mais peut-être pas tout ! Je vais essayer d'expliquer clairement mes propros car ce document s'adresse avant tout aux débutants.
NOTRE PREMIER CRACK : FULLDISK ( Récupéré sur le CD PRO n° 30 de PC Team mais sûrement dispo sur internet )
Outils utilisés :
* W32dasm, un éditeur héxadécimal, FileMon, RegMon.
Pour ceux qui ne connaîtraient pas, W32dasm permet de désassembler un programme éxecutable. ( ===> A partir d'un .exe, on obtient un listing en assembleur. )
FileMon et Regmon : on les verra plus loin ...
Mais keskil fé FULLDISK ?
Ce logiciel vous donne la taille des répertoires ainsi que des sous-répertoires de vos différents lecteurs. Il vous présentera le résultat sous forme de "camembert".
Bon bah... Au boulot ! Déjà, on peut prendre une petite bière pour commencer... Euh, si vous avez moins de 18 ans, prenez du lait ! ;') Si,si, sans déconner, du lait quand on est jeune, il n'y a pas mieux pour alimenter le cerveau. Si tu es mineur et que tu veux malgré tout prendre de la bière, et bien sache que tu auras un cerveau lent ... ( Ou un cerf-volant, je sais plus ... :) )
Fini la rigolade, on attaque ! La première chose à faire est de lancer le shareware et de collecter le plus d'informations possibles. Dans notre exemple, ce sera plutôt court. Nous notons que dans le menu "FullDisk", il y a un item "Register...". C'est déjà bien ! Baladons-nous dans le menu "Help" puis "About FullDisk...". Rien de spécial : aucun message du type "Unregistered version" ... Quand, on sort du programme, un nag screen nous informe que nous utilisons la version SHAREWARE et que celui-ci disparaîtra quand nous serons enregistrés.
Maintenant, retournons dans le menu "FullDisk" puis "Register...". Tapons un nom puis un code. Pour moi, ce sera "TaIPaN!" suivi de "666"... Comme nous nous y attendions, nous obtenons un message d'erreur.
A ce stade, ne faites pas ce qu'il y a d'écrit : NE REESSAYEZ PAS : CA NE NOUS AVANCERA PAS PLUS ! :')
On peut désassembler le fichier Fullfisk.exe avec w32dasm puis on se rend sur l'icône " String Data References" pour prendre connaissance des chaînes de caractères qui sont mises à notre disposition. On cherche, on cherche... Tiens ! On retrouve notre chaîne " Name / Code mis-match. Try again. ". On double-clique dessus ce qui nous amène dans la partie du programme correspondante.
CHOSE IMPORTANTE A RETENIR : il faut toujours rechercher dans le fichier s'il n'y a pas la même chaîne à un autre endroit du programme. Il arrive que certains logiciels utilisent cette protection dite "mirroir". Si cette protection est présente, il faut également patcher ces autres locations !
Dans notre exemple, une seule occurence de cette chaîne est trouvée. Regardez ces lignes ( également présentent sur l'image précédente ) :
Cela signifie que l'on peut atterrir sur notre message " Name / Code mis-match. Try again. " à partir de 2 locations différentes ( 402AEB et 402B00 ). Le (C) indique que les 2 sauts sont conditionnels ===> Il faut qu'il arrive une certaine chose dans le déroulement du programme pour que le saut est lieu. Un saut inconditionnel, comme son nom l'indique, ne dépend d'aucune condition. Quoiqu'il arrive, la portion de code suivie de ce saut s'exécutera.
Il faut donc retourner en amont pour voir ce qui se trame derrière ces 2 adresses. Ce ce que nous allons faire, et nous tombons ( sans nous faire mal ! ) sur la portion de code suivante :
Nous avons la présence des 2 sauts conditionnels sur cette image ( à l'adresse 402AEB et 402B00 ).
Voici ce qui doit de passer : à l'adresse 402AE4, le prog effectue un CALL. Cela représente un sous-programme. Il y a fort à parier que celui-ci s'occupe de comparer le code que nous avons entré avec le véritable code qui permet de s'enregistrer. Une fois ceci fait, nous arrivons à l'adresse 402AE9 qui effectue un test sur le registre interne EAX. Quand on fait un TEST EAX,EAX, on fait un ET LOGIQUE avec ce qu'il y a dans ce registre.De ce test dépendra le branchement ou non sur la boîte de dialogue nous informant que le code entré n'est pas correct. Le branchement potentiel se fera par l'instruction JNE 00402B64 ( JNE pour Jump if Not Equal ). Autrement dit, si le test renvoie zero, aucun branchement. Si il est différent de zéro, on affiche la fenêtre qu'on aime pas voir.
Il se passe la même chose pour la deuxième adresse ( 402B00 ) sauf qu'on effectue ou non le saut avec l'instruction JE ( Jump if Equal ).
On pourrait inverser les sauts de ces 2 adresses en les transformant respectivement par des JE et JNE... Mais ce n'est pas le meilleur moyen car ces 2 tests successifs appelant la même procédure ( le même CALL ) me paraissent louchent ... En regardant un peu plus bas, on se dit qu'il y a un moyen qui ne laissera aucune place au doute, et qui fonctionnera à coup sûr.
.
Donc, si on empêche le programme de se diriger vers l'affiche de la fenêtre "ké pas belle ékon aime pô voâr", on arrive directement sur des procédures qui doivent certainement écrire les informations ( Nom et Code ) dans un fichier. Et juste après ça : BINGO ! Et oui : "Thank you for registering"!
Ouh là, on s'emballe, on s'emballe mais patchons le programme et on verra après ... ;)
Donc, l'idée général est d'empêcher les différents sauts placés aux adresses 402AEB et 402B00. Pour cela, nous allons utiliser l'instruction NOP ( No OPeration ). C'est une instruction qui permet de n'effectuer aucune opération ( Quoi ! Vous l'aviez deviné ?!? ). Cette instruction prend 1 octet ===> il va donc falloir les enchaîner ... ( NOTE : certains logiciels n'aiment pas être patchés et détectent les NOPs comme des modifications de cracker. C'est bon à savoir. D'ailleurs, nous reparlerons de tous ces petites techniques ultérieurement ).
Il faut également savoir qu'à côté de l'instruction JNE 402B64 à l'adresse 402AEB se trouvent des chiffres ( En rouge ci-dessous ) :
C'est la représentation "ke l'ordi il kompran" correspondant à l'instruction JNE 00402B64 ( Autrement dit, l'instruction JNE 00402B64 se code par 0F8573000000 ).
Pour annuler ce saut,il faut le remplacer par des NOPs ( Vous vous souvenez ? Non non, je ne dis pas que vous avez la mémoire courte ! :p ). Un NOP se code par 90. Autrement dit, pour annuler ce saut, il faut remplacer 0F8573000000 par 909090909090. Il faudra faire de même à l'adresse 402B00. Une question me turlupine ... Savez-vous comment modifier ces octets avec un éditeur héxadécimal ? Ah vous savez ... Bon ok ! Quoi ? Il y en a qui ne savent pas ? Ka s'la n'tienne ! Et bien c'est très simple. On est toujours sous W32dasm. Et bien, on place le curseur sur la ligne qu'on veut modifier ( Ici, la ligne de l'image précédente ). On double-clique sur celle-ci. Une barre verte vient alors se superposer. Et là, je réclame un maximum d'attention ! On regarde en bas de l'écran et on devrait avoir un truc du style :
Ce qui nous intéresse, c'est Offset 00001EEBh. Cela signifie que pour faire nos modifications, il nous faudra nous doter d'un cerveau, de doigts pour taper les touches du clavier ... Ouh là, je m'égare ... Non, il nous faudra plutôt un éditeur héxadécimal. Avec celui-ci, il faudra donc nous rendre à l'adresse 1EEB dans le fichier ( NOTE : le h derrière le 1EEB sous W32dasm indique seulement qu'il nous donne une information en héxadécimal ... Donc, quand vous êtes sous votre éditeur, ne tapez pas 1EEBh ! ).
Si tout ce passe bien, une fois rendu à cette adresse ... OH ! On retrouve la série 0F8573000000 !!! On nop tout ça ... ( Et oui, il existe le verbe noper dans le jargon du cracker normalement constitué ! ). Bah, on met des 90 quoi !
On fait pareil avec l'autre adresse et le fichier est patché !
On relance le programme fraîchement modifié. On s'enregistre et PATATA ( C'est une son de trompette ! ).
Alors là, on saute partout, on chante et tout et tout ... Pis tiens, j'prends un malabar. Et pis j'fais des bulles avec. ( bah vi, quand j'suis content, j' fais des bulles avec! ).
On sort du logiciel. Pas de NAG BOX. CooL ! Bon bah, on relance le programme histoire de s'assurer que l'on a bien assuré !
Et là : PATATRA ! ( Non, ça , c'est pas le son d'une trompette ! ).
KOI, COMMENT , OU CA , PAR KI KE KOI DONC OU ??? ( Enfin, là, j'éxagère un peu... )
On a toujours la rubrique " Register ..." ! Alors là, je jette mon malabar.
Mais comment c'est possible ça ? Bah pourtant, on a bien patché le programme et il nous a bien dit qu'on était enregistré ! J'ai rêvé ou quoi ? ( Ou plutôt : J'ai bu trop de bière ou quoi ? ;') )
Voilà l'explication : lors de l'enregistrement, le prog à du stocker le nom et le code quelque part dans un fichier ou dans la base de registre. A chaque démarrage, il vérifie s'il y a bien concordance entre le nom et le code ( Une sorte de 2ème protection quoi ! ). ARRGGHHH ! Ca doit être ça !
Bon bah, on va devoir recourir à 2 utilitaires très utiles ( C'est bien un utilitaire utile hein ? ) : FILEMON et REGMON.
Ces derniers sont lancés avant le programme à cracker et reste planqués en tâche de fond pendant son exécution. ( Chercher pas derrière votre moniteur, quand j'ai dit "planqués", c'était une expression ! =8') )
Ceux-ci scannent respectivement toute modification au niveau des fichiers ( création, fermeture ,lecture, écriture ... ) et au niveau de la base de registre ( si une clé est créée, lue, fermée , sollicitée ... ).
Bon, on les lance puis on exécute FULLDISK.EXE et puis on retourne voir ces 2 utilitaires. On va voir ce qui c'est tramé lors de l'exécution de FULLDISK.
Et là, avec FILEMON, on trouve quelque chose d'intéressant :
Fulldisk fait référence au fichier FULLDISK.INI qu'il a crée lors de l'enregistrement. ( Je le sais paske j'avais lancé FILEMON avant que FULLDISK soit enregistré et j'ai constaté qu'il faisait référence à ce fichier. Mais à la place de SUCCESS, il y avait marqué : NOT FOUND. Bah koi ? J'suis pas obligé de tout vous dire non plus ! Non mais ... :'o )
Comme on est pas trop bête, on va ouvrir ce fichier pour voir ce qu'il y a dedans :
Notre théorie était bonne ...
Il va falloir retourner sous W32dasm et rechercher dans le String Data References s'il y a une occurence avec quelque chose comme : " fulldisk.ini" mais sans succès. Bon ben, il va falloir y aller au feeling ! Cette protection ne doit pas être très loin du début du programme. On cherche un peu et on tombe rapidement ( Oui, sans se faire mal ! ) sur :
C'est quoi ça : "Name" et "Code" ? Duh ! Mais oui, ce sont les références au fichier fulldisk.ini ! ;)
Là, il charge les informations nécessaires. Il y a fort à parier qu'il doit y avoir des tests pas très loin après... Je commence déjà à déchirer l'emballage d'un autre malabar mais je me préserve de le mâcher pour l'instant ...
On regarde donc un peu plus loin et BING !
Tiens ? Ces quoi ces ( petits ... ) points rouges ? A mais oui, ce sont les tests qui détermine si le code et le nom concordent ! ( Si en désassemblant, vous n'avez pas les points rouges, c'est normal ! arf ! )
Bon bah, c'est la même histoire. A chaque fois qu'un saut est effectué, le prog sait que la version n'a pas été enregistrée avec un code valide...
Eh ben... Keskon fé ? Ouais, on NOPs tout ça ! En utilisant la même méthode que précédemment pour NOPer, vous devriez être en mesure de patcher ces 4 instructions par des NOPS, nan ? Mais si... Je vous fais confiance !
D'ailleurs, il y a une instruction qui vient me réconforter et qui me dit que le malabar va bientôt m'amener des caries ...
Regardez l'instruction à l'adresse 4016D7... Ne serait-ce pas un " boolean flag ?". Ah bon, vous savez ce que c'est ... Bon, continuons alors ... Un ? Quoi ? Ah oui, y en a qui savent pas ... Eh ben c'est pas sorcier :
Si on avait effectué un des sauts ci-dessus, nous aurions atterri sur une routine qui aurait sûrement placé un 0 quelque part en mémoire. Ainsi, le prog sait que le code et le nom ne concordent pas et nous empêche d'avoir une version enregistrée.
Et là, à l'adresse 4016D7, on y place un 1 dans ce quelque part. C'est pas bon signe ça ? Bah nous verrons bien ...
Donc, nous avons patché les 4 sauts. On sauvegarde les modifs. ( Avec l'éditeur héxadécimal hein ! Ca va ? Vous suivez ? ). On relance le programme et là : PATATA ! ( Oui ! C'est ça ! C'est un son de trompette ! )
L'item "Register ..." est grisé ! C'est tout bon ! On sort du programme : plus de NAG BOX !
CONGRATULATIONS : YOU'VE JUST CRACKED THE PROGRAM !
( Toujours dans un but éducatif hein ? ;) )
Je jette mon malabar en l'air, j'ouvre la bouche et le rattrape comme un phoque de cirque...
Et là, je m'étrangle et je meurs ... Mais nan, j's'rais là bientôt pour de nouvelles aventures !
BYE !
TaIPaN !