Czym sie dzisi zajmiemy ?
Bedziemy rozkrecac Crackme 3 Kaliber777 [ AAOCG ]
Co trzeba miec i znac ?
  - mi wystarczyla wiedza assemblera (jako taka)
  - SoftICE 4.05
  - cierpliwosc (Ile ja jej stracilem lamiac ten program :()
Ogolnie procedurka sprawdzajaca jest krotka i na analize kodu nie trzeba wiele czasu !!!
ale na obliczenie tego trzeba troche czasu o czym sie zaraz przekonamy !!!

Crackme mozna zdobyc na stronce www.crackmes.prv.pl/

1)                              ZACZYNAMY!!!

najpierw badamy kod !!! wpisujemy cos np. "13579" zastawiamy puapke na GetDlgItemTextA i znajdujemy sie tutaj:

:004010A1 6800020000              push 00000200
:004010A6 6860314000              push 00403160
:004010AB 68BD0B0000              push 00000BBD
:004010B0 FF7508                  push [ebp+08]

* Reference To: USER32.GetDlgItemTextA, Ord:0102h
                                  |
:004010B3 E8E6000000              Call 0040119E  > tu jest pobierane to co wpisalismy
:004010B8 BE60314000              mov esi, 00403160 > tu ladujemy oraz kopiowany jest nasz zly serial do esi
:004010BD BF29314000              mov edi, 00403129 > Tablica z ktorej pozniej bedziemy korzystac: podana ponizej kodu
:004010C2 893564334000            mov dword ptr [00403364], esi >zachowanie offsetu seriala
:004010C8 893D60334000            mov dword ptr [00403360], edi >to samo dla tablicy
:004010CE C7056833400077070000    mov dword ptr [00403368], 00000777 > zaladowanie do komorki 403368 wartosci 777 (ciekawe dlaczego ;))

:004010D8 0FB61F                  movzx ebx, byte ptr [edi] > do ebx idzie 1 bajt z tablicy
:004010DB 0FB606                  movzx eax, byte ptr [esi] > do eax idzie 1 bajt seriala
:004010DE 8A0E                    mov cl, byte ptr [esi]    >to samo tylko ze do cl
:004010E0 46                      inc esi                   > zwieksz esi o 1 (serial)
:004010E1 300F                    xor byte ptr [edi], cl    > 1 bajt z tablicy XOR z 1 bajtem seriala z zapisaniem tego w miejscu pierwszego bajta tablicy

:004010E3 33D2                    xor edx, edx > wyzeruj edx
:004010E5 8A17                    mov dl, byte ptr [edi] > to co wyszlo idzie do dl 
:004010E7 C1C203                  rol edx, 03 > i przesun to w lewo 0 3 bity
:004010EA 011568334000            add dword ptr [00403368], edx > i to co wyjdzie dodaj do komorki 403368 tam juz sie znajduje 777 wiec dodaje ta wartos do 777, proste :)
:004010F0 47                      inc edi > zwieksz edi o 1 (tablica)
:004010F1 803F00                  cmp byte ptr [edi], 00 >jezeli koniec tablicy to przejdz 
:004010F4 7410                    je 00401106 >           do drugiego stadium
:004010F6 803E00                  cmp byte ptr [esi], 00 >gdy skonczyl sie serial
:004010F9 75E0                    jne 004010DB > zaladuj go ponownie i kontynuuj dopoki
:004010FB 8B3564334000            mov esi, dword ptr [00403364] > nie skonczy sie tablica
:00401101 803F00                  cmp byte ptr [edi], 00 >
:00401104 75D2                    jne 004010D8 >

:00401106 813D68334000F77A0000    cmp dword ptr [00403368], 00007AF7 > gdy suma rowna sie
:00401110 7517                    jne 00401129           > 7AF7 wyswietl messagebox
:00401112 6A00                    push 00000000                                  |
:00401114 6809304000              push 00403009
:00401119 FF3560334000            push dword ptr [00403360] > wygenerowana wartosc z naszego seriala
:0040111F FF7508                  push [ebp+08]

* Reference To: USER32.MessageBoxA, Ord:01BBh
                                  |
:00401122 E87D000000              Call 004011A4

Tablica: 44 bajtow
02 05 04 1A 10 01 04 0D 1E 20 57 06 1C 04 0E 0E 0B 06 3F 12 44 4F 44 60 6F 37 1B 30 50 17 0B 54 27 12 16 1A 45 57 48 47
Koniec Tablicy

To tyle ANALIZY
2)                        NO TO LICZYMY :((((

nasz serial jest XORowany z tablica a nastepnie ROLowany o 3 i dodawany i jesli rowne 7AF7
to wygeneruje sie MessageBox !!!
Pierwsze co musimy zrobic to wymyslec sobie ten MessageBox :))
ja sobie wymyslilem "cracked by Lukian!" Prawda ze oryginalne ?
Co dalej ? Nie wiem :))
zartowalem. Trzeba to teraz rozpisac na bajty:
cracked by Lukian! = 63 72 61 63 6B 65 64 20 62 79 20 4C 75 6B 69 61 6E 20 21
XORowal narazie wszystko oprocz "!" , pozniej wyjdzie :) bez "!" 17 bajtow 

noto XORujemy kazdy bajt serial z kazdym odpowiadajacym mu bajtem tablicy :)
Do tych dlugich stringow mozecie zastosowac fajny programik Pixela[GANG] Small Xoring Utility :)

STRING1= 61 77 65 79 7B 64 60 2D 7C 59 77 4A 69 6F 67 6F 65   (nie chce nic mowic ale sa to pierwsze znaki naszego poprawnego seriala)

Teraz ROLujemy tych 17 bajtow( naszego stringa, ale messageboxowego "cracked..." nie tego STRING1 !!!) z osobna i liczymy sume w Hexach oczywiscie dla mnie "3260"
czyli mamy 17 pierwszych bajtow z tablicy skreslonych. Poniewaz gdy string sie z konczy jest ladowany na nowo postanowilem zostawic 10 bajtow na korygowanie poprawnej sumy :)
17 bajtow 10 bajtow na korekcje i znowu 17 bajtow seriala xor, rol i sumowanych :)
ostatni bajt seriala w drugiej czesci (drugiej 17) jest XORowany z ostatnim bajtem tablicy.
analogicznie do pierwszej czesci "cracked..." ktora byla wynikiem XOR zostala ROL i sumowana
teraz liczymy wynik STRING1 xor bajty tablicy od 27 do 44 i ROLujac kazdy z osobna o 3

od razu podam sume jaka mi wyszla po zROLowaniu =2938

Lacznie mamy juz 777+3260+2938 = 630F
teraz mamy miejsce na 10 bajtow czyli 7AF7-630F=17E8

Jeden bajt (18) przypada na "!" a bajt nr 19 ma za zadanie zakonczyc string czyli po zXORowaniu ma wyjsc bajt 00 oznaczajacy koniec stringu :) a zeby wyszlo zero 19 bajt seraila musi byc rowny z 19 bajtem tablicy
teraz aby obliczyc 18 bajt seriala robimy
"!" XOR "06" - 18 bajt tablicy == 21 XOR 06 = 27
i tak nasz 18 bajt ma kod w hexach 27 "'" nasz 19 bajt zakanczajacy string ma byc taki sam jak 19 bajt tablicy musi tak byc bo jak bysmi nie zakanczali string to wygenerowaly by sie dodatkowe znaczki typu 03 06 a  to nie wyglada przyjemnie :)
19 bajt tablicy == 3F == 19 bajt seriala :))
teraz musimy dodac do sumy te dwa bajty 21 ROL 3  == 108
2 bajt jak juz mowilem po z XORowaniu musi dac wynik 0 a 0 ROL 3 == 0
wiec dodajemy dodatkowe 108 czyli 630F+108 == 6417
odejmujemy to od 7AF7 czyli 7AF7-6417 == 16E0
zostalo juz tylko osiem bajtow co robic
Dzielimy 16E0 / 8 == 2DC, wynik musi sie konczyc na 0 lub 8 bo przy ROLowaniu o wartosc 3 zawsze na koncu jest 0 albo 8 , Jak to zrobic !!! To proste robimy cos takiego
1,2,3,4 bajt === 2DC-4 == 2D8 i o to chodzilo suma tych osmiu rowna sie 16E0
5,6,7,8 bajt === 2DC+4 == 2E0
aby uzyskac teraz te wlasciwe bajty musisz odwrocic procedurke tzn zRORowac o 3 i z XORowac odpowiednio z bajtami z tablicy !!! 
2D8 ROR 3 === 5B
2E0 ROR 3 === 5C

no i robimy 5B XORujemy po kolei z bajtami 20, 21, 22, 23 z tablicy i otrzymujemy 4 kolejne bajty do naszego seriala
5C XORujemy po kolei z bajtami 24,25,26,27 i mamy nastepne znaki do seriala :)
i zarazem juz wszystkie wystarczy wpisac i crackme uwienczy nas napisem "cracked by Lukian!"

Serial = awey{d`-|YwJiogoe'?I<3kG

w razie problemow mail me Lukian@poczta.wp.pl