---crackme 1.0 by Nails---

czym: SI
protection: pass



odpalamy crackmerka i wpisujemy byle co.
ja wpisalem clever. dobra bpx getdlgitemtexta
i juz jestemy w kodzie ... lookamy... i widzimy
taki kawalek

push    30h             ; nMaxCount
.text:0040108D                 push    offset String   ; lpString
.text:00401092                 push    0BB8h           ; nIDDlgItem
.text:00401097                 push    dword ptr [edi] ; hDlg
.text:00401099                 call    GetDlgItemTextA
.text:0040109E                 sub     eax, 0Ch
.text:004010A1                 jnz     loc_401151

i widzimy z tego , ze pass musi miec 12 znakow.

tak wiec wpisujemy cleverclever i jedziemy dalej.
widzymy takie cos:

xor     eax, eax
.text:004010A9                 xor     esi, esi  ;
.text:004010AB                 xor     edx, edx ; zerowanie
.text:004010AD                 xor     ebx, ebx  ;
.text:004010AF                 mov     eax, offset String
.text:004010B4                 add     esi, offset aNails ; "Nails"
.text:004010BA                 mov     edx, [eax]   ; 1
.text:004010BC                 rol     edx, 5       ; 2
.text:004010BF                 add     edx, 12345678h  ; 3
.text:004010C5                 xor     edx, 12983476h  ; 4
.text:004010CB                 xor     edx, 1234AA99h  ; 5
.text:004010D1                 xor     esi, edx     ; 6
.text:004010D3                 add     esi, edx   ; 7
.text:004010D5                 cmp     esi, 3E585B57h   ; 8
.text:004010DB                 jnz     short loc_401151 ; 9

w linijce 1 do edx idzie dword z pierwszymi
czterema znakami (naszymi) czyli "velc".
potem to jest rolowane 5 razy :) 
nastepnie do tego jest dodawane 12345678h.
to wszystko jest xorowane 2 razy (4 i 5) 
potem adres slowka "nails" (402287) jest 
xorowane z ta mielonka z edx i do tego
jest dodawana ta mielonka.. i to wsio musi
byc rowne 3E585B57h...hm... pomyslmy jak to
obrocic teraz :) ja to zrobilem tak.

edx oznaczylem sobie jako pewne "x" i 
ulozylem sobie takie proste prymitywne
rownanie.. 

--
(ESI XOR X)+X = 3E585B57h
--

czyli 

ESI XOR 2X = 3E585B57h

czyli

2x = 3E585B57h XOR ESI

czyli

2x = (3E585B57h XOR ESI) / 2

i tym sposobem obliczamy X czyli 
wartosc EDX.

jak znamy wartosc EDX teraz mozemy
obracac dalej:

wiemy, ze w EDX po tych mieleniach musi
byc 1F0C3CE8

czyli odkrecamy:

1F0C3CE8 XOR 1234AA99h
potem 
wynik XOR 12983476h
i odejmujemy 12345678h

i mamy D6C4B8Fh teraz wystarczy
D6C4B8Fh ROR 5

i otrzymujemy: "xkb\"
czyli po obruceniu:    [\bkx]
                       ------

i mamy piersze cztery znaki. jedziemy dalej
i mamy taki kawalek:

 xor     edx, edx
.text:004010DF                 mov     eax, offset String
.text:004010E4                 add     eax, 4
.text:004010E7                 mov     ebx, [eax]
.text:004010E9                 add     edx, offset aNails ; "Nails"
.text:004010EF                 mov     bl, dl
.text:004010F1                 bswap   ebx
.text:004010F3                 xor     ebx, 0FEFEFEFEh
.text:004010F9                 mov     bh, dh
.text:004010FB                 bswap   ebx
.text:004010FD                 xor     ebx, 12345678h
.text:00401103                 xor     edx, 13579864h
.text:00401109                 xor     ebx, edx
.text:0040110B                 cmp     ebx, 910174E2h
.text:00401111                 jnz     short loc_401151


tez jest niezly. do eax jest dodawane 4 czyli
do ebx kolejne cztery znaki. do edx 402287.
do bl idzie 87 (dl). potem to jest bswapowane
(dziwnie to nazywam) i xorowane z FEFEFEFEh.
potem do bh trafia 22 (dh) i znowu to jest
bswapowane. teraz jest xorowane z 12345678h
, a edx (402287) jest xorowane z 13579864h.
i na koncu ebx jest xorowany z edx.
i ebx musi byc rowny 910174E2h.

hm... pomyslmy.. przed ostatnim porownaniem znamy
przeciez edx ! jest to 402087 xor 13579864h...
czyli 1317B8E3h... czyli wiemy, ze przed porowaniem
ebx musi byc xorowany z 13579864h.
czyli jak oblicz ebx? 910174E2 xor 1317B8E3
i mamy 8216CC01. haha teraz 8216CC01 xorujemy
z 12345678h i mamy 90229A79. przdtem byl bswap..
czyli obracamy to sobie i mamy 

przed:
90229A79

po:
799A2290

teraz wiemy ze wczesniej do BH trafila zawartosc
DH..w DH wtedy bylo 22... czyli jaki z tego wniosek?
zeby to otrzymac wystarczy 

799Axx90 xor FEFEFEFEh

gdzie xx to dowolna liczba, bo i tak potem
do bh trafi 22 :) wiec moze tam byc cokolwiek.

ja wziolem sobie 799A2090 zxorowalem z FEFEFEFEh
i mam:
8764DC6E
i po bswapie mamy:

6EDC6478

ale wiemy, ze przedtem w do BL trafia zawartosc
DL.. a w dl zawsze jest tam 87... w zwiazku z tym
wiemy, ze zamiast kolejenej litery mozemy wpisac
byle co, bo i tak trafi tam potem 87h. teraz lookamy
pod softicem:

? 6EDC6478

"nfx"        po obroceniU:      [xfn]
                                 ======

z tym, ze zamiast "x" oraz "" mozemy wpisac
byle co. dobra. jedzmy dalej. teraz na deser
prosciutki kodzik:

                               xor     ebx, ebx
.text:00401115                 xor     edx, edx
.text:00401117                 mov     eax, offset String
.text:0040111C                 add     eax, 8
.text:0040111F                 mov     ebx, [eax]
.text:00401121                 add     edx, offset aNails ; "Nails"
.text:00401127                 sub     bl, dl
.text:00401129                 bswap   ebx
.text:0040112B                 xor     ebx, edx
.text:0040112D                 cmp     ebx, 0E22B43A6h

tu widzimy do ebx kolejne cztery znaki . do edx
402287. od BL jest odejmowane 87h to jest bswapowane
i xorowne z 402287h imusi byc rowne E22B43A6h

czyli: ebx = E22B43A6h xor 402287 i na koncu
do wyniku z BL dodajemy 87h . teraz lukamy w SI:

? 21616B69

i widzimy: !aki
po obroceniU:    [ika!]
                  ----


i teraz laczymy all i mamy: \bkx*f*nika!

gdzie w * mozemy wpisac cokolwiek. dobra to mysle, ze 
tyle.

ale jest jeszcze jedno ale.. :) autorowi chodzi o jedno
konkretne slowo, a nie jakies tam nic nie znaczace literki..
tak sobie w pierwszej chwili pomyslalem.. Paktofonika!
i to jest to :)



clever                             clever_@softhome.net
home: www.develop.prv.pl



