devilz Keygenme #4 - Tutorial [fr]
================================================================================
Author         : Canterwood <charloweb@hotmail.com>
Protection     : SHA-256
Outils utiliss: PEiD, OllyDbg, DAMN HashCalc, IDA, MASM32
Attached files : crackme + keygen + source
================================================================================

Introduction
--------------------------------------------------------------------------------
  Je suis tomb par hasard sur ce crackme au dtour d'une balade sur le web, et
j'ai eu envie de relever le dfi...

Mise en route
--------------------------------------------------------------------------------
  On commence par ouvrir le crackme avec PEiD pour voir  quel type de cible on
aura affaire ; dans le cas prsent il s'agit d'un programme pack avec UPX, donc
on fait un petit 

upx - d "KeyGen-Me N4.exe"

pour annihiler la compression, puis on s'empresse de lancer le crackme avec
OllyDbg...

  On rentre un nom et un serial pris au hasard, puis on pose un breakpoint sur
l'appel  GetDlgItemTextA avec la ligne de commande (bpx GetDlgItemTextA), ou
directment via le listing, comme ce dernier est assez concis, en appuyant sur
F2 aprs s'tre positionn  l'endroit appropri.
On clique ensuite sur Check, pour arriver  l'adresse 404163.

tude
--------------------------------------------------------------------------------
  Voil  quoi ressemble le code :

00404154  PUSH 64
00404156  PUSH KeyGen-M.0040639C
0040415B  PUSH 0C8
00404160  PUSH DWORD PTR SS:[EBP+8]
00404163  CALL <JMP.&USER32.GetDlgItemTextA>  ; rcupre le serial
00404168  CMP AL,30                           ; longueur = 30h (48) ?
0040416A  JNZ KeyGen-M.004041FB               ; non, saute vers bad boy
00404170  PUSH 64
00404172  PUSH KeyGen-M.00406338
00404177  PUSH 64
00404179  PUSH DWORD PTR SS:[EBP+8]
0040417C  CALL <JMP.&USER32.GetDlgItemTextA>  ; rcupre le nom
00404181  CMP AL,20                           ; longueur <= 20h (32) ?
00404183  JG SHORT KeyGen-M.004041D1          ; non, saute vers bad boy
00404185  CMP AL,5                            ; longueur >= 5 ?
00404187  JL SHORT KeyGen-M.004041E6          ; non, saute vers bad boy
00404189  PUSH KeyGen-M.00406338
0040418E  PUSH EAX
0040418F  PUSH KeyGen-M.00406270
00404194  CALL KeyGen-M.00401000              ; SHA-256 : nom
00404199  CALL KeyGen-M.0040423B              ; formattage du serial
0040419E  CALL KeyGen-M.00404281              ; comparaison
004041A3  TEST EAX,EAX                        ; serial entr = bon serial ?
004041A5  JNZ SHORT KeyGen-M.004041BC         ; oui, validation russie

Au dbut, le crackme va tester la longueur du serial, qui doit tre gale  48
caractres (30 en hexadcimal).
De mme, le nom doit faire un minimum de 5 caractres et ne pas excder 32
caractres.

  Ensuite, et c'est l que l'on peut s'attendre au pire, trois fonctions sont
appeles successivement.

  La premire prend un buffer en premier paramtre, il est donc intressant
d'afficher son contenu aprs le passage sur le call... Dans la fentre de
mmoire, on peut apercevoir une srie de 8 dwords, ce qui peut bien s'apparenter
 un hash ; on lance donc DAMN HashCalc, puis on calcule tous les hashs
possibles (MD5, RIPEMD...)  partir de notre nom.
Et l, fort heureusement, on peut constater que les dwords semblent tre la
reprsentation brute d'un hash SHA-256. Ce qui nous simplifie grandement la
tche, puisque nous vitons ainsi d'avoir  tudier les quelques centaines de
lignes de code que comprend la fonction...

  Le second call manipule lgrement le hash, puis le formate en caractres
ASCII. Il est inutile de passer plus de temps sur cette fonction car nous
n'aurons qu' la ripper et l'inclure dans le keygen final (voir la source du
keygen  ce sujet).

  Et enfin, le dernier appel de fonction correspond  une comparaison de
chanes, un genre de strcmp rduit. Il faut noter ici que le serial apparat en
clair, donc aucun problme de ce ct l.

Keygen
--------------------------------------------------------------------------------
  Pour le keygen, que nous avons choisi de coder en ASM, il suffira de
reproduire  peu prs le code du crackme.
Il faut bien sr trouver au pralable une source de SHA-256, pour cela je suis
all sur le site de x3chun (http://x3chun.wo.to), qui fournit des tas de
ressources crypto.

En ce qui concerne la fonction de formattage, on peut la recopier ou alors tout
simplement ripper le code avec un outil, par exemple IDA.

Voil, le keygen fonctionne !

Conclusion
--------------------------------------------------------------------------------
  Cela n'a pas t trop difficile, mais ce crackme est tout de mme intressant
puisque il utilise une fonction de hash.

J'espre que ce mini-tutorial vous aura plu !