CrackMe1 de Kef par Kharneth | |||
---|---|---|---|
Outils utilisés | Public | Cible | |
- PEId - OllyDbg - Papier, Crayon, Cerveau 5.0 | Débutant en Cracking ayant des connaissances de base en programmation | Crackme1_by_Kef.exe | |
1 - PEId | |||
Comme d'habitude, on commence par une analyse rapide avec PeId pour vérifier que le programme n'est pas compressé ou crypté.
Et en effet, PEiD nous indique PE Pack 1.0 -> ANAKIN. | |||
2 - OllyDbg | |||
Le dump ne devrait pas poser de problème en suivant le tut de Kef (Unpack PE Pack). Pour ma part, j'ai posé un BP sur JMP EAX puis F9 et F8, et enfin un coup de Ollydump avec "Rebuild Import" coché. Le programme étant décompressé, on peut donc commencé son analyse. ![]()
Première chose frappante, on voit un appel à l'API IsDebuggerPresent. Cette fonction va renvoyer 1 si l'application tourne sous un debugger ou 0 dans le cas contraire. Il existe de nombreuses façon de contourner ce problème, la plus simple étant en utilisant le plugin "IsDebugPresent". Si un debugger est détecté, une MsgBox nous prévient puis le programme se ferme. ![]()
Ensuite, le programme teste la présence du fichier "IloveMicrosoft.key" avec l'api CreateFileA. Si le fichier existe, les 2 fonctions suivantes vont en créer une image en mémoire et l'api MapViewOfFile va renvoyer l'adresse du début de cette image. Si le fichier n'existe pas, le programme se ferme. ![]() Finalement, le programme compare le contenu du fichier avec la chaine de caractères suivante: <strKey> 53 E9 73 61 6D 65 2C 20 6F 75 76 72 65 20 74 6F Sésame, ouvre to 0040304B 69 20 21 20 20 20 20 20 20 31 34 38 35 32 33 32 i ! 1485232 0040305B 35 36 39 36 35 38 34 31 31 31 32 32 32 35 38 35 5696584111222585 0040306B 36 39 20 3A 29 00 69 :).Puis continue son exécution s'ils sont égaux, sinon il se ferme. Tout ce code se trouve dans la gestion du message WM_INITDIALOG, donc ces 2 tests son effectués juste avant que la fenêtre apparaisse. Pour créer le fichier, il suffit d'utiliser un éditeur hexa et d'ouvrir le dump du programme pour copier les valeurs hexa de la chaine attendue, puis de les coller dans un nouveau fichier que l'on sauvegardera dans le même dossier que le crackme en "IloveMicrosoft.key". ![]()
En continuant l'étude de la DialogProc(), on tombe sur la gestion du message WM_COMMAND avec 2 appels à GetDlgItemTextA. On ne doit donc pas être très loin du controle du serial. ![]()
C'est en fait l'équivalent de la fonction IntToHex() de Delphi qui convertit un entier en chaine de caractères représentant sa forme Hexadécimale. On a vu que la fonction prend 2 paramêtres. Un DWORD correspondant à la valeur à convertir, et un autre DWORD représentant le nombre minimum de caractères que la chaine devra contenir. Par exemple, si le nombre minimum de caractères à retourner est 4 et que la valeur à convertir est 5E, alors la fonction va ajouter autant de 0 devant pour finalement arriver à la chaine "005E". Le traitement s'effectue de la fin de la chaine vers le début. ![]()
| |||
3 - KeyGen | |||
Voici le listing d'un keygen codé sous Dev-C++:
Voici le listing d'un keygen codé sous Delphi: procedure TForm1.Button1Click(Sender: TObject); var Nom: String; i: Integer; sum: Cardinal; Taille: Integer; begin sum:= 1; Nom := Edit1.Text; Taille:=Length(Nom); If (Taille < 3) Or (Taille > 10) Then ShowMessage('Minimum 3 caractères et macimum 10!'); For i:=1 To Taille Do sum := sum + 1 + Ord(Nom[i]); Edit2.Text:=IntToHex(sum,3); end; | |||
Kharneth | |||
He took a face from the ancient gallery And he walked on down the hall | |||
![]() |