Crackme 2 by Commander Keen - tutorial

To crackme leao u mnie rozbabrane ju od dawna, ale dotarem do takiego momentu, w ktrym ju dalej nie wiedziaem co zrobi...Ale po kolei. Nie pamietam, czym jest spakowane, bo dawno juz je rozpakowaem a orgina mi gdzie zgin, wic albo spakowano je upx-em, albo nawet wcale nie spakowano. napisane jest w Delphi, ale Dede nie chce go czyta, bo to prawdopodobnie Delphi 2, za stara dla niego wersja. Z tego te powodu chyba utknem bo nie moglem przejrze w peni resorce'w inaczej jubym na to chyba dawno wpad. Procedurka sprawdzajca jest zasadniczo prosta.

00425C25  |. CMP DWORD PTR SS:[EBP-18],669            ;sprawdzenie sumy
00425C2C  |. JNZ SHORT ck_cm_2o.00425C41		; jesli nie to BADBOY
00425C2E  |. CMP BYTE PTR DS:[427668],0			;sprawdzenie czy zmienna rwna zero
00425C35  |. JNZ SHORT ck_cm_2o.00425C4B		;jesli nie to nic nie rb
00425C37  |. NOP
00425C38  |. NOP
00425C39  |. NOP
00425C3A  |. NOP  ;<-------------tu jest kopiowane haso
00425C3B  |. NOP 
00425C3C  |. NOP
00425C3D  |. NOP
00425C3E  |. NOP
00425C3F  |. JMP SHORT ck_cm_2o.00425C4B
00425C41  |> MOV EAX,ck_cm_2o.00425C98                ;  ASCII "Nope.... to nie to :("
00425C46  |. CALL ck_cm_2o.00425834			;wyswietl BADBOY

Wprowadzony password moze byc tylko z zakresu O-F i tylko 16 znakw. Jesli jest to spenione 16 znakw grupowane jest po dwa i tworzy 8 bajtowych znakw. Znaki te s kopiowane w miejsce nopw. Jesli suma znakw rwna jest 669h i pewna zmienna rwna jest zero, to zamiast nopw wykonywany jest cig instrukcji, ktry stworzy sie z tych 8 bajtw.
Wic jest to w miare proste, trzeba dobra takie znaki, ktre stowrz logiczny kod i w dodatku ich suma bedzie 669h.
W tym miejscu utknaem, bo nie mogem rozgry co ten dodatkowy kod powienien zrobic. Szukaem jakiegos przekierowania do komunikatu GoodBoy albo chociaz Stringa, ktry moznaby wykorzysta, ale 8 bajtw to strasznie mao na tak skomplikowan operacj. 
I ostatnio bedac na forum ctrl-d cztaem wtek o Delphi i o wtyczce Godup, ktra czyta resource Delphi. Pamietaem ze Godup czyta sigi z IDY ale o tym ze resorce z Delphi to nie, wiec postanowiem sprawdzi. I jakos traf chcia e sprawdzaem te resource m. in. na tym crackme. (Ostatecznie okazao si, e ResourceHacker i Exescope te czyta dobrze to crackme ale dopiero teraz jestem taki madry) I przegladajc je trafiem na Label4, ktry jest komunikatem typu GoodBoy. Niestety nie wywietla sie bo mial waciwoc Visible=False. Nie wyswietla sie nawet po zmianie na True, bo by przykryty obiektem Label4 z informacjami o Teamie AAOCG. Wiec zmieniem rozmiar Label4 na zerowy i wreszcie komunikat si wywietli. Tylko jak to zrobi za pomoc passworda ? Niestety za pomoc 8 bajtw nie dao si spatchowa resourcw. Ale przegladajac je trafiem take na procedure obsugi timera:

00425D20  /. 55             PUSH EBP
00425D21  |. 8BEC           MOV EBP,ESP
00425D23  |. 83C4 F8        ADD ESP,-8
00425D26  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
00425D29  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX
00425D2C  |. C605 68764200 >MOV BYTE PTR DS:[427668],1    <----ustawia t sam zmienn co przy procedurze sprawdzania
00425D33  |. 803D 68764200 >CMP BYTE PTR DS:[427668],0
00425D3A  |. 75 08          JNZ SHORT ck_cm_2o.00425D44
00425D3C  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] <-----------musi byc wykonana
00425D3F  |. E8 B8FDFFFF    CALL ck_cm_2o.00425AFC

W ktrej ustawiana bya ta sama zmienna co przy sprawdzaniu.Patchujac ta instrukcje, eby zmienna byla stale rwna zero i wykonujac instrukcj, w 425d3c i nastepujacy po niej call, uzyskaem ten sam komunikat GoodBoy.
Pomyslalem wic e password musi by kawakiem kodu patchujcym instrukcje w 425d2c, ale rzne kombinacje uswiadomiy mi, e 669h podzielone na 8 znakw daje 0CDh, czyli opcody musza byc bardzo wysokie, co jest niemoliwe do uzyskania przy takich instrukcjach jakie byy mi potrzebne.
Zaczaem wiec patrzec po kodzie crackme jakie instrukcje maja tak wysokie opcody. I wyszo ze najlepeij nadaja sie do tego call-e.
Patrzc na obsug timera po raz kolejny zauwazyem ze moze nie trzeba zerowac tej zmiennej, moze wystarczy doprowadzic do tego eby wykonane zostay ponisze instrukcje:

00425D3C  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4] <-----------musi byc wykonana
00425D3F  |. E8 B8FDFFFF    CALL ck_cm_2o.00425AFC

Prbowaem wic skierowa program callem do tych instrukcji, kiedy zauwayem, ze przypadkowo te dwie instrukcje maj w sumie 8 bajtw i wysokie opcody. Wiec moe po prostu to one powinny byc passwordem?
Przenoszc je w miejsce nop-w i assemblujac niestety nie uzyskaem nic poza bedem. Bo pod [EBP-4] bya inna warto ni w tamtym fragmencie programu. Ale przegladajac stos okazao si ta wartoc nie jest daleko, bo pod [EBP-8].
Tak wiec po asemblacji  miejsce nop-w wygladao tak:

00425C37  |. 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
00425C3A  |. E8 BDFEFFFF    CALL ck_cm_2o.00425AFC

A suma opcodw rzeczywicie rwnaa si 669h.Niestety sprawdzana zmienna bya ju rwna 1, wic komunikat si nie pokaza. Dodatkowo wic okazao si ze timer zmienia ta zmienn po 18-19 sekundach na 1.
Wic ostateczne rozwiazanie to: Wpisa w ciagu 18 sekund password:"8B45F8E8BDFEFFFF" i cieszy sie z sukcesu.




 cracked by asasm/MBE 2006-09-06 00:06





