_ _ _ _ _ _ _ / \_____/ \______ / \____ / \___________/ \ / \_______/ \____ \ \ \ \ \_ \ \ \ \ \ \ _____/ . \ . \/ /\ \ / . \ . \________\ . \ /_ _____ | / /_ / /_ /_ / \ \ /_ / \_ /_ / / \ _/ \_ | | / / \_/ \ \_/ \ \__/ \ / \_/ \ \_/ \ / / / \ | |__\ \ / \ / / \ / . \___/ \_ / /__| \ / / / \ / / \ / \ \____/ / \____ /\____/ /___\__ \\____ /\____/\ / \______/ \_____ / \_/ \____/ \_/ \_/ \__/ \_/ - t h e h o m e o f p o l i s h c r a c k e r s - proudly presents: `~*¤§[ a tutorial: Crackme by Tomkol ..........................................]§¤*~` `~*¤§[ written by: TepeX^CrackPl2ooo ..........................................]§¤*~` `~*¤§[ date: 20.06.2000 .......................................................]§¤*~` `~*¤§[ english readers note: ]§¤*~` [ [ the following tutorial has been written in polish language... if you're ] [ interested in english version please place your request for translation ] [ at http://www.crackpl.site.pl... ] Witam!!! Tym razem zajmiemy sie crackme zwanym dumnie Tomkol Bomb Crackme... Jak mozna dowiedziec sie z notki dolaczonej do crackme celem tego dziela jest znaleznienie takiej kombinacji checkbox'ow ktora spowoduje zdeaktywowanie bobmy... A wlasnie bomba... autor nie zdradza co ma na mysli... nawet po zalaczeniu crackme nie widac o co chodzi... ale wystarczy tylko 3 razy wpisac zle haslo... Niestety u mnie bomba nie dziala :((( powod??? zawsze mam zalaczony jakis program dosowy (np. Dos Navigatora), ktory pwoduje, ze... bomba pyta sie mnie czy moze wybuchnac :)... zobacz sam... UWAGA!!! Jesli jeszcze nie skonfigurowales(as?) SoftIce do pracy, to musisz pierw wyedytowac plik winice.dat i w ostatniej sekcji, usunac sredniki spredz exportami funkcji (czyli jak masz cos takiego: ;EXP=darek.dll to zamieniasz to na EXP=darek.dll...). Jesli tego nie zrobisz SoftIce nie bedzie umial zalozyc pulapek na funkcje API... No, ale do rzeczy... jak widzisz po uruchomieniu crackme mamy 9x4 checboxow... zaznaczamy na chybil trafil pare z nich... wlaczamy SoftIce i ustawiamy pulapke na sprawdzanie stanu checkbox'ow... jaka to pulapka... w tym przypadku jest to: IsDlgButtonChecked... A wiec mamy w SoftIce: bpx IsDlgButtonChecked. Wciskamy przycisk testujacy zabezpieczenie... SoftIce przejmuje kontrole, teraz tylko F11 i... mamy komunikat: "No BPX allowed", czy jakos tak... wnioski? crackme wykrylo, ze SoftIce zalozyl pulapke na funkcje IsDlg... Jest to dosc prymitywny juz nie najmlodszych lotow sposob (pierwsze uzycie tego sposobu anty-Bpx bylo chyba w Crueme by Cruehead)... Na tego typu zabezpieczenia jest jeden skuteczny sposob... zamiast ustawiac pulapke poprze BPX uzywamy BPM, czyli kasujemy poprzednia i tworzymy nowe poprzez BPM (BPM IsDlgButtonChecked)... naciskamy jeszcze raz przycisk w crackme... tym razem SoftIce przejmuje kontrole i ladujemy w takim miejscu: 0137:004010D5 MOV BL,[EAX] 0137:004010D7 MOV EAX,[0040415C] 0137:004010DC CMP EAX,EBX ; tu jest wlasnie porownanie 0137:004010DE JZ 004014EE ; czy zastawiono pulapke 0137:004010E4 MOV DWORD PTR [00404148],00000000 1. 0137:004010EE MOV DWORD PTR [0040414C],00000000 2. 0137:004010F8 PUSH 00000BB9 3. 0137:004010FD PUSH DWORD PTR [EBP+08] 4. 0137:00401100 CALL USER32!IsDlgButtonChecked 5. 0137:00401105 TEST EAX,EAX 6. 0137:00401107 JZ 00401116 7. 0137:00401109 ADD DWORD PTR [00404148],38 Popatrz wlasnie tutaj jest kawalek sposobu anyt-bpx (patrz komentarz...) Ale skoro juz to ominelismy popatrzmy na funkcje IsDlg... oraz na nastepstwa jej wywolania... W liniach 1-3 podawane sa parametry funkcji (adres checkbox'a)... W lini 4 jest wywolanie funkcji... Natomiast w linii 5 jest inteesujace nas sprawdzanie... Teraz troche poczekaj... czas na pare wyjasnien: jesli checkbox, ktory podany jest jako parametr funkcji IsDlg... jest aktywny (zaznaoczony) to funkcja zwroci w rejestrze EAX 1, jesli nie nie zwroci nic... W linii 5 porowananie EAX, sprawdza czy tym rejestrze jest jakas wartosc (czyli czy byl checkbox aktywny...), jesli tak to skok z linii 6 sie nie wykona i w linii 7 zostanie dodana wartosc 38 do zmiennej 00404148... Jesli nie byl checkbox aktywny to skok z linii 6 sie wykona i prejdzie do sprawdzania kolejnego checkbox'a... Tak to sie ciagnie.... dlugo az do tych lin... 0137:004014B8 XOR EAX,EAX 0137:004014BA XOR EBX,EBX 1. 0137:004014BC MOV EAX,[00404148] ; do EAX suma wartosci 2. 0137:004014C1 MOV EBX,[0040414C] ; ebx - ilosc aktywnych checkbox'ow 3. 0137:004014C7 IMUL EBX 4. 0137:004014C9 ROL EAX,07 5. 0137:004014CC XOR EAX,000CAE00 6. 0137:004014D1 TEST EAX,EAX 7. 0137:004014D3 JNZ 00401502 0137:004014D5 PUSH 00 0137:004014D7 PUSH 0040400B 0137:004014DC PUSH 00404023 0137:004014E1 PUSH DWORD PTR [EBP+08] 0137:004014E4 CALL USER32!MessageBoxA Tu jest wlasnie caly myk... Jak mozesz zauwazyc w linii 1 do eax idzie punktow zebranych podczas sprawdzania checkboxow, pamietasz te porowania eax i dodawania roznych sum??? To jest wlasnie suma tego wszystkiego, ktora werduje do EAX. W linii 2 do ebx idzie suma aktywnych checkboxow. Nastepnie w liniach 3-5 mamy cala procedura kodujaca... W linii 6 sprawdzanie czy w EAX jest jakas wartosc rozna od zera... jesli jest skok z linii 7 sie wykonuje i program leci dalej, gdzie czysci stan checkboxow i takie tam... Wypadalo by te procedure odwrocic... Co wiemy? EAX ma byc rowne 0... ale jak to osiagnac? Popatrz linie wyzej... EAX jest xorowane z wartoscia 000CAE00... pamietasz pewna wlasciwosc xor'u, ktora tutaj ma swoje zastosowanie??? A wiec... nie to ci przypomne... xor ma takaa wlasciwosc ze wykonany na tych dwoch samych argumentach (lub wartosciach) zeruje rejestr... Wnioski? EAX przed xorem musi byc rowne 000CAE00. No dobrze mamy teraz instrukcje rol EAX,07... czyli obrot w prawo... naszczescie funkcja ta ma swoja odwortnosc, czyli ROR... A wiec bierzemy SoftIce... kod jakiejs aplikacji... wpisujemy "r eax 000CAE00" co spowoduje danie do rejestru EAX wartosci 000CAE00, teraz dajemy "a", a nastepnie piszemy "ror eax,07".... teraz tylko przechodzimy poprzez ta instrukcje i odczytujemy pozadana wartosc rejestru... jaka to wartosc??? 195C... No to pozostala nam jeszcze tylko linia 3, komenda IMUL EBX... Co ona robi? mnozy rejestr EAX, przez EBX i wynik umieszcza w EAX... W tym momencie potrzebna jest lekka dawka matematyki... EAX jest mnozone z EBX, co w wyniku ma dac 195C... trzeba znalezc takie EBX zeby pomnozone przez EAX dalo wynik 195C... Zwazywszy na wartosc, EBX bedzie musialo miec cos kolo 10-14 znakow, czemu? popatrz na wartosci dodawane do EAX, byly by potem problemy znalezc odpowiednia sume punktow... A wiec szukamy takiego dzielnika EBX... 195C z hexow na liczby decymendalne daje nam 6492, no to szukamy...: 6492 | 2 3246 | 2 1623 | 3 541 | ... 2x2x3=12 A wiec nasz EBX bedzie sie musial rownac 12... no to wypadalo by teraz znalezc odpowiednie EAX, czyli mamy 195C:C=2D1... (czemu C? bo C na liczby decymendlane to wlasnie 12...). Teraz sie troche pobawimy musimy tak zaznaczac dwanascie checkboxow zeby daly w wyniku liczbe 2D1... Czas na pare rad: wez spisz sobie na kartce wszystkie liczby dodawane (uwaga kolejnosc jest rzedami od lewego gornego rogu!!!). I sprobuj jakos dodawac, najlepiej uzyj kalkulatora... Mi ta zabawa zajela kilka minut, a oto moje rozwiazanie: (sa to numery checkboxow do zaznaczania, idac od lewego gornego rogu, rzedami w prawo...): 1, 15, 16, 18, 9, 29, 13, 12, 4, 2, 19, 3... Milej zabawy zyczy wszystkim TepeX^CrackPl2ooo ______ ______ ______ ______ / \ / \ / \ / \ _________________________________________________/ . // / // / // / / | \__/ /_\__ /_\__ /_\__ /| |[CRACKPL!]: http://www.crackpl.site.pl / // / // / // / / | |________________________________________________/ // / // / // / /__| \___/ \_______\\_______\\_______\