Résolution LaFarges crackme #2
|
28-09-2013, 14h23
Message : #1
|
|
MLT
MauriceLeTendu Messages : 40 Sujets : 10 Points: 26 Inscription : Dec 2012 |
Résolution LaFarges crackme #2
Voici une nouvelle résolution de keygenme.
Le keygenme est téléchargeable : ici Voici ses caractéristiques: Difficulty: 1 - Very easy, for newbies Platform: Windows Language: Assembler D'après les votes sur le site : Crackme is quite nice. Ce keygenme est facile à comprendre. Cependant, les nombreuses manipulations de chaîne (pseudo et une chaîne intégrée au programme) rendent casse-tête le codage du kengen, réalisé ici en C (je ne me suis pas encore mis au rip routine ). Je le conseille au débutant en reverse et en programmation car il permet de s'exercer et de bien gérer la mémoire des variables (choix des types de variables adaptés aux utilisations faites). Présentation du keygenme Présentation classique, une musique pas très agréable vient nous chatouiller les oreilles. Correction Nous regardons les fonctions (ctrl+n), puis nous cliquons sur user32.MessageBoxA pour faire un "Set breakpoint on every reference" Nous lançons le programme. Le programme nous demande un pseudo et un mot de passe. Nous cliquons sur OK. On breakpoint en 004012e3, si nous continuons, nous avons le message "Nope, that's the right code !". Juste au dessus, en 004012cd, nous remarquons le placement d'un breakpoint, avec comme message "Yes, that's the right code !". Encore en dessus, nous avons des fonctions lstrcmpA. Nous montons plus haut, un breakpoint est placé en 0040115a avec le message "Username must have at least 4 chars". Nous voyons le véritable sérial apparaître en 00401288 Nous venons de trouver le début et la fin de notre routine...... Nous voyons juste au dessus: Code : 00401149 JA SHORT crackme.00401163 Ce saut (si supérieur) vérifie que le pseudo entré, fait bien plus de 3 caractère. Nous fesons "ENTRER" sur cette ligne et nous nous retrouvons en 00401163, nous y plaçons un breakpoint. Nous lançons le programme, on break, puis on avance avec la touche f8 jusqu'à avoir le message d'erreur. Nous observons de nombreuses boucles Boucle 1 : 0040117a à 00401197 Boucle 2 : 004011a3 à 004011c7 Boucle 3 : 004011d1 à 004011f0 Boucle 4 : 004011fa à 0040121e Boucle 5 : 00401236 à 0040124b Boucle 6 : 004012ea à 0040126a Boucle 7 : 00401278 à 00401286 Nous allons donc analyser chacune de ces boucles et les coder. Boucle 1
Code : 0040117A > 8A0C16 MOV CL,BYTE PTR DS:[ESI+EDX] ; commencement boucle , un caractère du pseudo est pris à partir de 0040634a (2eme caractère du pseudo) Durant cette boucle, nous voyons une manipulation de la chaîne du pseudo placée en 00406349 ( clic droit dans la fenêtre de dump >>> go to >> 00406349) ainsi que d'une chaîne de caractère placée en 00406328 ( clic droit dans la fenêtre de dump >>> go to >> 00406328) Fenêtre de dump
Voici le code C équivalent à cette boucle: Code : for(count = 0 ; count != longueur_login ; count++) name est le pseudo tab est la chaîne de caractère count2 est le compteur lié à la chaîne qui est remis à 0 quand il est égale à 5 count est un compteur pour le pseudo Boucle 2 Code : 004011A3 > 8A9F 2D634000 MOV BL,BYTE PTR DS:[EDI+40632D] ; commencement de la 2nd boucle / mise dans ebx du 6eme caractère de la chaîne Voici l'équivalent en C: Code : for (count = 0 ; count != longueur_login -1 ; count++) Boucle 3 Code : 004011D1 > 8A043A MOV AL,BYTE PTR DS:[EDX+EDI] ; commencement 3eme boucle ; on prend un caractère du pseudo (on commence par le 2eme) et on le met dans eax Boucle 4 Code : 004011FA > 8A9F 37634000 MOV BL,BYTE PTR DS:[EDI+406337] ; commencement 4eme boucle on prend le 10eme caractère de la chaine et on le met dans ebx L'équivalent en C Code : for (count = 0 ; count != longueur_login -1 ; count++) Boucle 5 Code : 00401236 > 8BC8 MOV ECX,EAX ; 5eme boucle L'équivalent en C Code : or (count=0 ; count !=longueur_login -1 ; count++) Boucle 6 La Boucle 6 est différente des autre boucle, elle permet de calculé le pseudo. Code : 0040125A > 33D2 XOR EDX,EDX ; 6eme boucle Plus haut, nous voyons que ecx est égale à 0x0a. et eax est d'après le code suivant: Code : 00401253 . A1 45634000 MOV EAX,DWORD PTR DS:[406345] eax est égale au dword (4 octets) en 00406345 Donc avec le login "maurice", si nous faisons un breakpoint sur 00401253, et qu'ensuite, nous nous rendons en 00406345 (dans la fenêtre de dump), le dword est de: 88 10 07 23 La lecture se faisant à l'envers, il nous faut une variable égale à 0x23071088 Ensuite cette valeur (0x23071088) est divisée par 0x0a, le résultat va en eax, le reste de la division va en edx. La boucle continue tant que eax n'est pas égale à 0. Il est nécessaire de mettre la valeur initiale eax dans un unsigned long. Voici l'équivalent en C: Code : while(eax !=0) Voici en bonus la fonction pour inversé 88 10 07 23 en 0x23071088 Code : for(count = 0 ; count !=4 ; count++) La dernière boucle est simple elle permet d'inverser la chaine (variable serial dans la boucle 6), le résultat est le serial final. En pièce jointe, je met mon keygen |
|
« Sujet précédent | Sujet suivant »
|
Sujets apparemment similaires… | |||||
Sujet | Auteur | Réponses | Affichages | Dernier message | |
Résolution Synok's CrackMe 2 in 1 | MLT | 10 | 505 |
18-10-2013, 23h26 Dernier message: Ark |
|
Résolution greedy_fly keygenme_v1.6 | MLT | 0 | 121 |
29-08-2013, 22h14 Dernier message: MLT |
Utilisateur(s) parcourant ce sujet : 1 visiteur(s)