TUTORIAL => [PhoX's CrackMe_5.1]
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
Je pars sur le principe que vous avez qq bases en cracking
,,,,,,,,,,,,,,
:INTRODUCTION:
''''''''''''''
Bon ce crackme n'est pas extrΩmement difficile mais il m'a quand mΩme
rΘsiser assez longtemps. Le plus dur est de capter ce qu'il fait subir
α notre serial avant de le comparer au bon et de trouver un moyen de
"reverser"(c'est peu Ωtre un grand mot) le tout. Enfin, passons α l'acte,
ce sera plus simple... ;)
On a besoin:
- du crackme (sans blague!)
- de W32Dasm (pas indispensable)
- de Softice
- de papier et d'un crayon
- d'Ωtre assez ΘveillΘ pour faire marcher sa tΩte
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
:YAHAAAYAYAA!(cri de guerre :):
'''''''''''''''''''''''''''''''
Oki, alors on lance la bΩ-bΩte: oh la gentille ch'tite boεte α serial!
Allez, viens! viens! chope le serial! chope! Oups dΘsolΘ un moment de dΘlire ;)
Sous W32Dasm >>>
:00401191 6A28 push 00000028
:00401193 68A6204000 push 004020A6 ; buffer pour serial
:00401198 FF354C204000 push dword ptr [0040204C]
* Reference To: USER32.GetWindowTextA, Ord:0000h
|
:0040119E E800010000 Call 004012A3 ; chope le serial
:004011A3 FF3544204000 push dword ptr [00402044]
:004011A9 E85D000000 call 0040120B <<< α moins d'avoir commencΘ le
:004011AE 83F801 cmp eax, 00000001 <<< cracking hier, vous avez surement
:004011B1 751E jne 004011D1 <<< remarquΘ cela.
:004011B3 6A30 push 00000030
* Possible StringData Ref from Data Obj ->"Good For U!"
|
:004011B5 6881204000 push 00402081
* Possible StringData Ref from Data Obj ->"U Did It!!"
|
:004011BA 688D204000 push 0040208D
:004011BF FF3548204000 push dword ptr [00402048]
* Reference To: USER32.MessageBoxA, Ord:0000h
|
:004011C5 E8EB000000 Call 004012B5
Donc pas compliquΘ, qu'on se dit, tout est dans le call 0040120B!
[Suite]
* Referenced by a CALL at Address:
|:004011A9
|
:0040120B C8000000 enter 0000, 00
:0040120F 53 push ebx
:00401210 52 push edx
:00401211 33C0 xor eax, eax
:00401213 B8A6204000 mov eax, 004020A6
:00401218 803800 cmp byte ptr [eax], 00
:0040121B 7460 je 0040127D
:0040121D 33DB xor ebx, ebx
:0040121F 33D2 xor edx, edx
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040122C(C)
|
:00401221 8A18 mov bl, byte ptr [eax] ; le plus
:00401223 C1C308 rol ebx, 08 ; compliquΘ
:00401226 03D3 add edx, ebx ; du crackme
:00401228 40 inc eax ; se case
:00401229 803800 cmp byte ptr [eax], 00 ; dans ces
:0040122C 75F3 jne 00401221 ; quelques
:0040122E 52 push edx ; lignes
* Possible StringData Ref from Data Obj ->"%lX"
|
:0040122F 6854204000 push 00402054
:00401234 68BF204000 push 004020BF
* Reference To: USER32.wsprintfA, Ord:0000h
|
:00401239 E88F000000 Call 004012CD
:0040123E BBBF204000 mov ebx, 004020BF ] il y a une chaεne en 004020BF
:00401243 803B38 cmp byte ptr [ebx], 38 ] sa 1ere lettre doit Ωtre 38h = 8 \
:00401246 7535 jne 0040127D ] | Ce
:00401248 807B0144 cmp byte ptr [ebx+01], 44 ] sa 2e " " " 44h = D |
:0040124C 752F jne 0040127D ] | qui
:0040124E 807B0243 cmp byte ptr [ebx+02], 43 ] sa 3e " " " 43h = C |
:00401252 7529 jne 0040127D ] | nous
:00401254 807B0341 cmp byte ptr [ebx+03], 41 ] sa 4e " " " 41h = A |
:00401258 7523 jne 0040127D ] | donne
:0040125A 807B0446 cmp byte ptr [ebx+04], 46 ] sa 5e " " " 46h = F |
:0040125E 751D jne 0040127D ] | 8DCAF368
:00401260 807B0533 cmp byte ptr [ebx+05], 33 ] sa 6e " " " 33h = 3 |
:00401264 751D jne 0040127D ] | ...
:00401266 807B0636 cmp byte ptr [ebx+06], 36 ] sa 7e " " " 36h = 6 |
:0040126A 751D jne 0040127D ] |
:0040126C 807B0738 cmp byte ptr [ebx+07], 38 ] sa 8e " " " 38h = 8 /
:00401270 750B jne 0040127D
:00401272 B801000000 mov eax, 00000001 <<< si on arrive lα, on est ok
:00401277 5A pop edx
:00401278 5B pop ebx
:00401279 C9 leave
:0040127A C20400 ret 0004
----------------------------------------------------------------------
:00401221 8A18 mov bl, byte ptr [eax]
:00401223 C1C308 rol ebx, 08
:00401226 03D3 add edx, ebx
:00401228 40 inc eax
:00401229 803800 cmp byte ptr [eax], 00
:0040122C 75F3 jne 00401221
En fait, dans cette partie de code le premier caractΦre de notre faux serial,
est mit dans bl puis on effectue une rotation de 8bits vers la gauche.
On ajoute le rΘsultat α edx et on recommence jusqu'α avoir fait passer tout le
monde dans la moulinette.
Comme je ne sais pas exactement α quoi correspond le rol, je matte sous softice.
Je vais prendre 12345 comme exemple de serial:
_________________________________________________________________________
BYTE PTR [EAX]=31h
mov bl, byte ptr [eax] >>> EBX=00000031 EDX=00000000
rol ebx, 08 >>> EBX=00003100 EDX=00000000
add edx, ebx >>> EBX=00003100 EDX=00003100
...boucle...
BYTE PTR [EAX]=32h
mov bl, byte ptr [eax] >>> EBX=00003132 EDX=00003100
rol ebx, 08 >>> EBX=00313200 EDX=00003100
add edx, ebx >>> EBX=00313200 EDX=00316300
...boucle...
BYTE PTR [EAX]=33h
mov bl, byte ptr [eax] >>> EBX=00313233 EDX=00316300
rol ebx, 08 >>> EBX=31323300 EDX=00316300
add edx, ebx >>> EBX=31323300 EDX=31639600
...boucle...
BYTE PTR [EAX]=34h
mov bl, byte ptr [eax] >>> EBX=31323334 EDX=31639600
rol ebx, 08 >>> EBX=32333431 EDX=31639600
add edx, ebx >>> EBX=32333431 EDX=6396CA31
...boucle...
BYTE PTR [EAX]=34h
mov bl, byte ptr [eax] >>> EBX=32333435 EDX=6396CA31
rol ebx, 08 >>> EBX=33343532 EDX=6396CA31
add edx, ebx >>> EBX=33343532 EDX=96CAFF63
_________________________________________________________________________
Ensuite le wsprintfA, va transformer la valeur de EDX en un vrai chiffre,
de faτon α pouvoir Ωtre comparΘ ensuite avec 8DCAF368.
Ici on a 96CAFF63 au lieu de 8DCAF368.
On va s'imaginer que le bon serial fait 8 caractΦres.
Soit X la valeur dΘcimale du 1er, Y celle du 2nd, Z celle du 3e,
A celle 4e, ..., et E celle du 8e.
On aura: (EBX)
00 00 X 00 |
+ 00 X Y 00 | Petite parenthΦse pour la suite:
+ X Y Z 00 | 8Dh = 141(d)
+ Y Z A X | CAh = 202(d)
+ Z A B Y | F3h = 243(d)
+ A B C Z | 68h = 104(d)
+ B C D A |
+ C D E B |
|
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
= 141 202 243 104
(= 8Dh CAh F3h 68h)
DONC: X + Y + Z + A + B = 104
»»»»» X + Y + Z + A + B + C = 141 >>> C = 141 - 104 = 37
X + Y + Z + A + B + C + D = 202 >>> D = 202 - 141 = 61
X + Y + Z + A + B + C + D + E = 243 >>> E = 243 - 202 = 41
Et X ~ Y ~ Z ~ A ~ B ~ 104/5 = 20 + 20 + 20 + 20 + 24 = 104
D'o∙ X=20 B=24 \ Soit --> X=14h B=18h
Y=20 C=37 \ en --> Y=14h C=25h
Z=20 D=61 / hexa --> Z=14h D=3Dh
A=20 E=41 / --> A=14h E=29h
Vous tapez τa dans votre Θditeur hexa et ca vous donne: %=)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
:CRAAAAAAAAAAAACCCCCCCCKKKKKEEEEEDDDD !!!!!!!!!!:
'''''''''''''''''''''''''''''''''''''''''''''''''
Le mot de la fin: j'ai fait compliquΘ parce qu'avec 5 caractΦres ca donne 44%=)
(104/2=52=34h plus les trois autres chars). sinon je suis vachement fier d'avoir
rΘsolu le truc.
voili @+ all
bon et puis les greetzs habituels bien sur...
»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
analyst, artif, Ash, +Christal, CrackerJo, cRaZy666, Detten, DOUG DC10,
Gbillou, iorior, JeK, JeN, K-509, Kahel, KuSh, LiseGrim, NuliX, Phlos,
Rebel, RocketSpawn, SILKSCALP, silvΦre, Skinny3D, slap, sNiPEr, SynApsus,
TiPiaX, TomRipley, tONiARd, ToToMaN, TuX69, TwingMustyz, wOODY^dRN
----