Cruehead CrackMe.exe v 2.0

CO  : crackme.exe v2.0   (plik z gatunku crackme)
skad: cracking.home.ml.org (dosyc dawno to bylo, moze bedzie na stronce Crackpl jak sie GustawKit zgodzi)
czym: Soft-Ice 

Crackme v2.0 napisane przez Cruehead/MiB jest dosyc prostym programikiem i latwo je zlamac.Poczatkujacy zazwyczaj szukaja porównania naszego seriala z wlasciwym. Tyle ze wpisany przez nas serial moze byc modyfikowany i wtedy latwo przeoczyc procedure porównania :(( Tak jest w tym przypadku !!! choc szyfrowanie jest banalne, ale o tym przekonacie sie sami Odpalamy progsa, klikamy Help/Enter Password i wpisujemy ulubiony serial np. 66667777 Zanim wcisniemy oke, zastawmy jakiegos breakpointa. Wchodzimy do Soft-Ice wciskajac ctrl+d i zastawiamy pulapke na funkcje GetDlgItemTextA (na ta zadziala :))

:bpx getdlgitemtexta

Wracamy do progsa, klikamy na Ok i jestesmy w SI, klikamy F11 aby wyskoczyc z funkcji i widzimy cosik takiego (przewin ekran w góre ctrl+strzalki):

015F:004012AA  817D10EA030000      CMP     DWORD PTR [EBP+10],000003EA
015F:004012B1  7527                JNZ     004012DA
015F:004012B3  6A11                PUSH    11
015F:004012B5  687E214000          PUSH    0040217E
015F:004012BA  68E8030000          PUSH    000003E8
015F:004012BF  FF7508              PUSH    DWORD PTR [EBP+08]
015F:004012C2  E8D5010000          CALL    USER32!GetDlgItemTextA
015F:004012C7  83F801              CMP     EAX,01
015F:004012CA  C74510EB030000      MOV     DWORD PTR [EBP+10],000003EB
015F:004012D1  72CC                JB      0040129F
015F:004012D3  B801000000          MOV     EAX,00000001
015F:004012D8  EB07                JMP     004012E1

Nie pamietam gdzie wyladujesz ale wazna jest instrukcja push 0040217e, dlaczego ???

Zobaczmy co sie kryje pod tym adresem. A wiec

:d 00402117E

Widzimy ze jest tam wpisany nasz serial :)) Zastawym breakpointa na tym adresie:

:bpm 0402117E

Klikamy Ctrl+d albo F5 i ladujemy w tym miejscu:

015F:00401365  C6051821400000      MOV     BYTE PTR [00402118],00
015F:0040136C  8B742404            MOV     ESI,[ESP+04]
015F:00401370  56                  PUSH    ESI
015F:00401371  8A06                MOV     AL,[ESI]
015F:00401373  84C0                TEST    AL,AL
015F:00401375  7419                JZ      00401390
015F:00401377  FE0518214000        INC     BYTE PTR [00402118]
015F:0040137D  3C41                CMP     AL,41
015F:0040137F  7204                JB      00401385
015F:00401381  3C5A                CMP     AL,5A
015F:00401383  7303                JAE     00401388
015F:00401385  46                  INC     ESI
015F:00401386  EBE9                JMP     00401371
015F:00401388  E825000000          CALL    004013B2
015F:0040138D  46                  INC     ESI
015F:0040138E  EBE1                JMP     00401371
015F:00401390  5E                  POP     ESI

Przygladajac sie tej procedurze mozemy zauwazyc ze sluzy ona do zamiany liter malych na duze, nie bede opisywal niech kazdy przesledzi jej dzialanie sam Jeszcze raz Ctrl+d albo F5 i teraz widzimy cosik takiego:

015F:00401399  33DB                XOR     EBX,EBX
015F:0040139B  33FF                XOR     EDI,EDI
015F:0040139D  8A8FA3214000        MOV     CL,[EDI+004021A3]
015F:004013A3  8A1E                MOV     BL,[ESI]
015F:004013A5  84DB                TEST    BL,BL
015F:004013A7  7408                JZ      004013B1
015F:004013A9  32D9                XOR     BL,CL
015F:004013AB  881E                MOV     [ESI],BL
015F:004013AD  46                  INC     ESI
015F:004013AE  47                  INC     EDI
015F:004013AF  EBEC                JMP     0040139D
015F:004013B1  C3                  RET

Tu jest generowany serial dla funkcji porównujacej zobaczmy co jest pod EDI+004021A3

:d EDI+004021A3
0167:004021A3 4D 65 73 73 69 6E 67 5F 69 6E 5F 62 79 74 65 73   Messing_in_bytes

A wiec z tego ciagu ladowane sa bajty do cl W Esi jest nasz serial i ladowany jest do bl, jak nie wierzysz to zrób:

:d Esi

Nastepnie sprawdzany czy w bl jest cosik czy jest zero, i jak zero to skok do 004013B1

Nastepnie to co w bl jest "xorowane" z tym co w cl Czyli nasz kod jest "xorowany" z ciagiem "Messing_in_bytes". Potej czynnosci wpisujemu wynik do Esi i jedziemy tak dopóki nie skoncza sie znaki w naszym serialu

Poniewaz szyfrowany kod jest umieszczany dokladnie w tym samym miejscu gdzie byl ten przez nas wpisany nie zakladamy zadnej nowej pulapki Ctrl+d i jestesmy tutaj

015F:0040122D  E833010000          CALL    00401365
015F:00401232  687E214000          PUSH    0040217E => na stos serial
015F:00401237  E87C010000          CALL    004013B8 => procka sprawdzajaca
015F:0040123C  83C404              ADD     ESP,04 
015F:0040123F  84C9                TEST    CL,CL 
015F:00401241  7407                JZ      0040124A => tu zmienic i mozna rejestrowac na dowolny ciag ale to najgorsze rozwiazanie i nie o to chodzi w tym progsie 
015F:00401243  E801010000          CALL    00401349

Dobra wejdzmy do tej procedury sprawdzajacej, gdy bedziemy na call 004013B8 klepiemy F8 i widzimy:

015F:004013B8  33FF                XOR     EDI,EDI
015F:004013BA  33C9                XOR     ECX,ECX
015F:004013BC  B110                MOV     CL,10 => dlugosc ciagu
015F:004013BE  8B742404            MOV     ESI,[ESP+04] => szyfrowany serial
015F:004013C2  BF50214000          MOV     EDI,00402150 => to z czym porównujemy
015F:004013C7  F3A6                REPZ CMPSB => porównanie
015F:004013C9  C3                  RET

Zobaczmy co jest w edi po mov EDI,00402150

:d EDI
0167:00402150 1F 2C 37 36 3B 3D 28 19-3D 26 1A 31 2D 3B 37 3E  .,76;=(.=&.1-;7>
0167:00402160 4E 6F 20 6C 75 63 6B 21-00 4E 6F 20 6C 75 63 6B  No luck!.No luck

Wazne jest 16 pierwszych znaków bo w procedurze sprawdzajacej jest mov cl,10 i tylko tyle bedzie porównywane repz cmpsb a 10h to 16 decymalnie (Pamietajcie ze to hex) Hmm czyli nasz serial powinien wygladac tak: ".,76;=(.=&.1-;7>" po szyfrowaniu.

Jak wiecie (jak nie wiecie to przesledzcie tablice prawdy dla XOR'a) funkcja XOR dziala w 2 strone, tzn "xorujac" 2 razy przez ta sama wartosc otrzymujemy z powrotem to samo!!!

Czyli wystarczy teraz wykonac Xor na ".,76;=(.=&.1-;7>" z ciagiem "Messing_in_bytes" aby uzyskac z powrotem wlasciwa postac seriala Ja to zrobilem kalkulatorem Casio fx-4500P ;) ale ty mozesz uzyc jakiego chcesz byle mial system szesnastkowy i pozwalal "xorowac" Moze byc ten z windy (ja mam Win 98 i on pozwala to zrobic, nie wiem jak w Win 95):

1F 2C 37 36 3B 3D 28 19 3D 26 1A 31 2D 3B 37 3E 
                    xor
4D 65 73 73 69 6E 67 5F 69 6E 5F 62 79 74 65 73
------------------------------------------------
52 49 44 45 52 53 4F 46 54 48 45 53 54 4F 52 4D (hex)
R  I  D  E  R  S  O  F  T  H  E  S  T  O  R  M   (AscII)

Jesli nie miesci nam sie to mozemy po bajcie to robic 1F xor 4D=52 w AscII "R" Wynik zamieniamy na ASCii dowolna metoda, mozna lopatologicznie z tabela lub wpisac do jakegos HexEdita ;))

Serial: RIDERSOFTHESTORM, RiderSoftHestorm, RIDErSOFtHESTORm Dlaczego ??? Odpowiedz sobie sam !!! ;))

Uff wreszcie koniec ;))