___           ___           ___           ___           ___           ___     
     /\  \         /\__\         /\  \         /\__\         /\  \         /\  \    
     \:\  \       /:/  /        /::\  \       /::|  |       /::\  \       /::\  \   
      \:\  \     /:/__/        /:/\:\  \     /:|:|  |      /:/\:\  \     /:/\ \  \  
      /::\  \   /::\  \ ___   /:/  \:\  \   /:/|:|__|__   /::\~\:\  \   _\:\~\ \  \ 
     /:/\:\__\ /:/\:\  /\__\ /:/__/ \:\__\ /:/ |::::\__\ /:/\:\ \:\__\ /\ \:\ \ \__\
    /:/  \/__/ \/__\:\/:/  / \:\  \ /:/  / \/__/~~/:/  / \/__\:\/:/  / \:\ \:\ \/__/
   /:/  /           \::/  /   \:\  /:/  /        /:/  /       \::/  /   \:\ \:\__\  
   \/__/            /:/  /     \:\/:/  /        /:/  /        /:/  /     \:\/:/  /  
                   /:/  /       \::/  /        /:/  /        /:/  /       \::/  /   
                   \/__/         \/__/         \/__/         \/__/         \/__/    
				   .openmod.org


Keygenme - silver's crack n-gen crackme 1




-|- A. Introduction


Au menu ce matin, le crackme de sylver's crack / n-gen. Il n'est pas de premiere jeunesse
mais suffisant pour nous occuper un petit moment.

action.


-|- B. silver's crack n-gen crackme 1

----------------------------------------------------------------------------------------

crackme author : silver's crack n-gen crackme 1
type : Name / Serial
level : 1

----------------------------------------------------------------------------------------

Comme a l'habitude, on analyse toujours avec PEiD l'executable, pour etre a peut pret sure
qu'il ne soit pas packé ou crypté auparavant.

PEiD est clair : Nothing found *

Ca promet...



Reversing :
-----------

Par habitude je degaine ollydebug histoire de voir un peux ce que sa donne. A peine ouvert ollydebug 
nous indique que l'OEP est 'outside' le code..  ça sent le crackme packed.

Je regarde tout de meme les referenced text string, et là je vois un 'bravo' , 'dommage'. Je double 
clique sur le bravo et j'atteri ici : 

00401264   .  68 18324000   PUSH 00403218                            ; |Title = "Bravo !"

je remonte jusqu'au messageboxa me demandant d'indiquer un nom :

004011D8   . /0F84 C5000000 JE 004012A3

je pose mon bpx juste en dessous :

004011DE   .  50            PUSH EAX

F9, et je rentre thomas comme nom et 123456789 comme serial. Il break comme prevu.

je trace avec F8 juste au debut de la routine de calcul du nom :

004011E2   .  8D15 75324000 LEA EDX,DWORD PTR DS:[403275]
004011E8   >  8A1A          MOV BL,BYTE PTR DS:[EDX]
004011EA   .  80F3 03       XOR BL,3
004011ED   .  8899 43324000 MOV BYTE PTR DS:[ECX+403243],BL
004011F3   .  42            INC EDX
004011F4   .  41            INC ECX
004011F5   .  3BC8          CMP ECX,EAX
004011F7   .  74 02         JE SHORT 004011FB
004011F9   .^ EB ED         JMP SHORT 004011E8

explications : 

- calcul le nombre de lettre du nom entré
- il prend chaque lettre de mon nom
- XOR cette lettre avec 3
- converti le resultat en ascii
- et ceci pour chaque lettre, une fois fait, il JUMP 

on sort la calculette windo, notre table ASCII prefere et on regarde ce que ça donne : 

t = 74 (hexa) XOR 3 = 77 (hexa) = w
h = 68 (hexa) XOR 3 = 6B (hexa) = k
o = 6F (hexa) XOR 3 = 6C (hexa) = l
m = 6D (hexa) XOR 3 = 6E (hexa) = n
a = 61 (hexa) XOR 3 = 62 (hexa) = b
s = 73 (hexa) XOR 3 = 70 (hexa) = p

mon nom correspond donc a  "wklnbp"

Voyons maintenant la routine de calcul du serial :


0040121A   .  50            PUSH EAX
0040121B   .  51            PUSH ECX
0040121C   .  33C9          XOR ECX,ECX
0040121E   .  8D15 75324000 LEA EDX,DWORD PTR DS:[403275]
00401224   >  8A1A          MOV BL,BYTE PTR DS:[EDX]
00401226   .  80F3 0C       XOR BL,0C
00401229   .  8899 5C324000 MOV BYTE PTR DS:[ECX+40325C],BL
0040122F   .  42            INC EDX
00401230   .  41            INC ECX
00401231   .  3BC8          CMP ECX,EAX
00401233   .  74 02         JE SHORT 00401237
00401235   .^ EB ED         JMP SHORT 00401224

cette routine est similaire a celle precedemment explique :

- il prend le premier caractere du serial dans sa valeur HEXA
- il le XOR cette fois avec la valeur hexa 0C
- et ceux pour chaque caracteres
- et op JUMP vers la routine de comparaison.

on ressort la calculette windo, notre table ASCII et on analyse notre serial bidon '123456': 

1 = 31 (hexa) XOR 0C = 3D (hexa) = =
2 = 32 (hexa) XOR 0C = 3E (hexa) = >
3 = 33 (hexa) XOR 0C = 3F (hexa) = ?
4 = 34 (hexa) XOR 0C = 38 (hexa) = 8
5 = 35 (hexa) XOR 0C = 39 (hexa) = 9
6 = 36 (hexa) XOR 0C = 3A (hexa) = :

ce qui donne : "=>?89:"

nous voici donc a la routine de comparaison : 

00401244   .  8D15 43324000 LEA EDX,DWORD PTR DS:[403243]
0040124A   .  8D05 5C324000 LEA EAX,DWORD PTR DS:[40325C]
00401250   >  8A1A          MOV BL,BYTE PTR DS:[EDX]
00401252   .  8A38          MOV BH,BYTE PTR DS:[EAX]
00401254   .  38FB          CMP BL,BH
00401256   . /75 1F         JNZ SHORT 00401277



- EDX = wklnbp
- EAX = =>?89:
- il met le premier caractere de EDX dans BL
- il met le premier caractere de EAX dans BH
- compare BL et BH, c'est a dire w et =
- si c OK il passe au caractere suivant . sinon il JUMP vers BAD SERIAL

OK maintenant ke c'est analysé, comment k'on fait pour trouver le serial ki va bien.

Plusieurs moyens. on pe tres facilement patcher le XOR OC en XOR 3 histoire de faire le fégnant. 
Sinon on peu aussi se faire un keygen vite fait :

la difference entre le serial et le nom c le XOR.

OC + 3 = F

- donc cela reviendrai a prendre la valeur de la routine du nom : "wklnbp"
- de lui faire un XOR F, c'est a dire, OC +3
- ce qui nous donnerais le bon serial !

testons !

t = 74 (hexa) XOR F = 7B = {
h = 68 (hexa) XOR F = 67 = g
o = 6F (hexa) XOR F = 60 = `
m = 6D (hexa) XOR F = 62 = b
a = 61 (hexa) XOR F = 6E = n
s = 73 (hexa) XOR F = 7C = | 

BINGO !

J'ai fait un keygen vite fait en VB, mais c tres loin d'etre le top : 
------------------------------------------------
Private Sub Command1_Click()

LONGUE = Len(Text1.Text)

For i = 1 To LONGUE
toto = Hex(Asc(Mid$(Text1.Text, i, 1)) Xor 15)

CODE = CODE + toto

Next i

Text2.Text = CODE
Total = Chr(Val("&H" & Mid(Text2.Text, 1, 2)))
Total2 = Chr(Val("&H" & Mid(Text2.Text, 3, 2)))
Total3 = Chr(Val("&H" & Mid(Text2.Text, 5, 2)))
Total4 = Chr(Val("&H" & Mid(Text2.Text, 7, 2)))
Total5 = Chr(Val("&H" & Mid(Text2.Text, 9, 2)))
Total6 = Chr(Val("&H" & Mid(Text2.Text, 11, 2)))

Text3.Text = Total + Total2 + Total3 + Total4 + Total5 + Total6

End Sub
------------------------------------------------

c'est une merde, mais il fonctionne !:-)

-|- C. Thx

A tout le chan #old-school sur irc.worldnet.net, Misto, Kyler, Goda, Azerty.. 

retrouvez sur http://thomas.openmod.org l'ensemble de mes tutos et ezines.

a+
thomas