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 ;))