************************************************************************* ************************************************************************* ****************Witaj w tutorze #6 by TepeX !!!************************** ************************************************************************* ************************************************************************* Bytom woj.Slaskie 10.03.2000 Witaj!!! Znalazles sie w 6 czesci mojego tutorlaia... Dzis zajmiemy sie crackme stworzyonym przez Anton_one. W/g autora jest na poziomie medium, ale sadzac po wynikach jest to hard easy. Przed rozpoczeciem czytania sproboj najpierw sam sobie z nim poradzic - uda ci sie to jesli uwaznie czytales poprzednie teksty. UWAGA!!!! (znowu) Mama plytke crackersk'a. 650 mb cracerskich stron, programow itp. Jesli chcesz mail'me. Cena 20zl + wysylka. Lub przyjazd do Bytomia bez wysylki! -------------------------Kontakt ze mna:-------------------------------- zhrbytom@friko.internet.pl Ewentualnie od czasu do czasu siedze na IRC'u (kanal #crackpl). ----------------------------------------------------------------------- Zaczynamy!!! Zacznijmy jak zwykle od wstepnych ogledzin programu. Widac jedno okieneczko w sam raz na serial :-). O hasle informuje nas zwykly messagebox. Zacznijmy wiec zabawe. Wpiszmy przypadkowe dane np. TepeX. Zaloz pulapki na pobranie informacji z okna dialogowego... pamietasz je??? GetDlgItemTextA i GetWindowTextA, czyli bpx GetDlgItemTextA i bpx GetWindowTextA. Kliknij na przycisk, zobaczysz mniej wiecej cos takiego: Break due to BPX USER32!GetDlgItemTextA (ET=1.44 seconds) A w oknie kodow, taki kawalek: 0137:BFF61640 0CE8 OR AL,E8 0137:BFF61642 A84C TEST AL,4C 0137:BFF61644 0000 ADD [EAX],AL 0137:BFF61646 50 PUSH EAX 0137:BFF61647 FF150612F6BF CALL [BFF61206] 0137:BFF6164D 98 CWDE 0137:BFF6164E E8014D0000 CALL KERNEL32!SUnMapLS_IP_EBP_16 0137:BFF61653 C9 LEAVE 0137:BFF61654 C20C00 RET 000C USER32!GetDlgItemTextA 0137:BFF61657 B196 MOV CL,96 0137:BFF61659 55 PUSH EBP 0137:BFF6165A 8BEC MOV EBP,ESP 0137:BFF6165C 51 PUSH ECX 0137:BFF6165D 83EC3C SUB ESP,3C 0137:BFF61660 66FF7508 PUSH WORD PTR [EBP+08] 0137:BFF61664 FF750C PUSH DWORD PTR [EBP+0C] 0137:BFF61667 E8824C0000 CALL KERNEL32!SMapLS_IP_EBP_16 0137:BFF6166C 50 PUSH EAX 0137:BFF6166D 66FF7514 PUSH WORD PTR [EBP+14] Jak widzisz znalazle sie w srodku windowsa... swiadzcza chociazby o tym offsety (ades skalda sie z segment:offset, np. 0137:BFF6165C, w windowsie prawie zawsze bedziesz operowal tylko na offseta'ch, czyli tego po prawej, ). Wiec co nalezy zrobic... nacinac F11 aby przejsc do miejsca wywolania funkcji. Nacisnales??? Break due to G (ET=197.43 microseconds) Powinienes zobaczyc taki napis ( z innym ET!!!) po nacisnieciu. A w oknie kodow, cos takiego: 0137:004010A1 EBA8 JMP 0040104B 0137:004010A3 6A50 PUSH 50 1.0137:004010A5 680D304000 PUSH 0040300D 0137:004010AA 6A65 PUSH 65 0137:004010AC FF7508 PUSH DWORD PTR [EBP+08] 2.0137:004010AF E838010000 CALL USER32!GetDlgItemTextA 0137:004010B4 E8A6000000 CALL 0040115F 3.0137:004010B9 E818000000 CALL 004010D6 0137:004010BE EB8B JMP 0040104B 0137:004010C0 6A00 PUSH 00 0137:004010C2 FF7508 PUSH DWORD PTR [EBP+08] 0137:004010C5 E816010000 CALL USER32!EndDialog 0137:004010CA 6A00 PUSH 00 0137:004010CC E8FD000000 CALL KERNEL32!ExitProcess 0137:004010D1 E975FFFFFF JMP 0040104B 4.0137:004010D6 EB21 JMP 004010F9 Widzisz wywolanie funkcji GetDlgItemTextA (polecenie call funkcja!). Jesli znasz (a powinies!) asmeblera to wiesz ze przed wywolaniem funkcji API (czyli np. GetWindowTextA i wszystkich innych) program musi polozyc na stos (poleceniem PUSH) pewne argumenty. W przypadku funkcji GetDlgItemTextA na stos beda kladzione nastepujace argumenty: -uchwyt do okna, skad pobierany bedzie tekst -identyfikator kontrolny -adres gdzie ekst poleci po wywolaniu funkcji -maxymalny rozmiar pobieranego tekstu. No dobrze, wiemy co zobaczyc aby dowiedziec sie co za teskt program pobiera. Wiec co... gdzie sia on znajduje ??? Jest argumentem 2 push'a zobacz wiec co tam jest (komenda d rejestr,wartosc np. d eax - sprawdza co siedzi pod rejestrem eax).W tym przypadku aby zobaczyc co program pobiera musisz wpisac d 0040300D. Co widac??? Wow nasz wpisany serial! No dobrze wiemy juz gdzie on siedzi, idzmy dalej... Zaraz po wywolaniu funkcji widac dwa call'e. Na razie zostawmy je w spokoju. Przejdzmy sie troche po kodzie programu, aby poszukac momentu w ktorym program pokazuje komunikat o blednym serial'u. A wiec F10 i idziemy. Przechodzimy przez pierwszego call'a, przez drugiego. Ale co to? Program wywalil nas z komikatem o zlym serial'u! Wiemy stad, ze w drugim call'u najprawdopodobniej rozgrywa sie cala akcja. A wiec jeszcze raz to samo z tym, ze w tym razem wejdziemy w drugi call! No dobrze zrobiles to, wszedles w call??? Nie pamietasz sluzy do tego klawisz F8 zamiast F10! co widzisz? 1. 0137:004010F9 BE0D304000 MOV ESI,0040300D 2. 0137:004010FE 33C9 XOR ECX,ECX 3. 0137:00401100 33D2 XOR EDX,EDX 4. 0137:00401102 4E DEC ESI 5. 0137:00401103 46 INC ESI 6. 0137:00401104 8A06 MOV AL,[ESI] 7. 0137:00401106 0FB6C0 MOVZX EAX,AL 8. 0137:00401109 03D0 ADD EDX,EAX 9. 0137:0040110B 23C0 AND EAX,EAX A. 0137:0040110D 7402 JZ 00401111 B. 0137:0040110F EBF2 JMP 00401103 C. 0137:00401111 81FA1E060000 CMP EDX,0000061E D. 0137:00401117 7416 JZ 0040112F E. 0137:00401119 7500 JNZ 0040111B 0137:0040111B 6A10 PUSH 10 0137:0040111D 6800304000 PUSH 00403000 0137:00401122 6871304000 PUSH 00403071 0137:00401127 6A00 PUSH 00 F. 0137:00401129 E8C4000000 CALL USER32!MessageBoxA 0137:0040112E C3 RET Wyladowales w lini oznaczonej numerem 4 (patrz wycinek kodu powyzej!) stamtad zostales odeslany skokiem do lini nr 1 (wycinek ponizej!). Co tam sie dzieje? Program wklada do rejestru EAX wartosc o adresie 0040300D. Co ma taka wartosc??? Tak, twoj serial. Idzmy teraz dalej w lini nr 2 i 3 czyszczone (zerowane) sa rejestry ECX i EDX - polecenie xor wykonane na tych samych argumentach/wartosciach zeruje dana rzecz.W linii 4 i 5 rejestr ESI jest zmniejszan a nastepnie powiekszane o 1 (DEC - zmniejsz o 1, INC zwieksza o 1). W linii 6 do al wedruje znak z rejestru ESI - czyli znak naszego seriala! W linii 7 AL jest kopiowane do EAX, a nastepnie w linii nr 8 zawartosc EAX dodaje sie w EDX. Wnioski??? Pod koniec linii 8 w edx dodaje sie wartosc znaku z naszego seriala. Nastepnie w linii 9 na rejstrze EAX wykonuje sie operacja logiczna bez zaglebiania sie w nia widzimy, ze skok z linii nr A wykona sie tylko wtedy gdy w EAX nie bedzie nic - a kiedy nie bedzie nic? gdy nie pojdzie tam zadna wartosc, czyli bedzie koniec seriala! No dobra zosatwmy to na razie idzmy dalej. Gdy juz przejdziemy przez ten caly bajzel i wykona sie skok z linii nr B dojdziemy do linii C, gdzie rejestr EDX bedzie porownywany z wartoscia 61E! UWAGA!!! Aby nie powtarzac caly czas tych wszystkich operacji zrob tak... Wykasuj wsyztkie pulapki - polecenie bc *. A nastepnie zaloz pulapke na linii nr C! - polecenie bpx offset, u mnie bpx 00401111. Gdy to zrobisz program altomatycznie przerwie prace w momencie dojscia do tej linii! No dobra przejdzymy wiec teraz do linii D. Jesli skok ten sie wykona (czyli suma znakow bedzie rowna 61E!) program skoczy dalej, a jesli sie nie wykona dojdzie do sytuacji ze wykona sie skok z linii E i program wyswietli komunikta o zlym kodzie. Mamy juz pierwszy warunek - suma znakow rowna 61E, idzmy wiec dalej... Ale jak zrobic aby skok z linii D sie wykonal i zebsmy mogli pojsc dalej??? Wystarczy podejsc (F10) do tej linii i uzyc komendy : r fl z. Troche wyjasnien: gdy program wykonuje/niewykonuje skok warunkowy sprawdza odpowiednie (dla danego skoku) wartosci rejestru znaczniku. Oto spis skokow, wraz z wartosciami jakie sprawdza (zarzniete z turoialu Gustaw'a, jesli nie znasz asmeblera zapoznaj sie z nim!): Instrukcja Opis Skok jesli..... JA skok gdy powyzej CF=0 i ZF=0 JAE skok gdy powyzej lub rowny CF=0 JB skok gdy ponizej CF=1 JBE skok gdy ponizej lub rowny CF=1 or ZF=1 JC skok gdy przeniesienie CF=1 JCXZ skok gdy CX=0 CX=0 JE skok gdy jest rowny ZF=1 JG skok gdy wiekszy ZF=0 and SF=OF JGE skok gdy wiekszy lub rowny SF=OF JL skok gdy mniejszy SF != OF JLE skok gdy mniejszy lub rowny ZF=1 or SF != OF JMP skok bezwarunkowy bez warunku JNA skok gdy nie powyzej CF=1 or ZF=1 JNAE skok gdy nie powyzej ani rowny CF=1 JNB skok gdy nie ponizej CF=0 JNBE skok gdy nie ponizej ani rowny CF=0 and ZF=0 JNC skok gdy nie ma przeniesienia CF=0 JNE skok gdy nie rowny ZF=0 JNG skok gdy nie wiekszy ZF=1 or SF != OF JNGE skok gdy nie wiekszy ani rowny * SF != OF JNL skok gdy nie mniejszy * SF=OF JNLE skok gdy nie mniejszy ani rowny * ZF=0 and SF=OF JNO skok gdy niema przepelnienia * OF=0 JNP skok gdy nie parzystosc PF=0 JNS skok gdy brak znaku * SF=0 JNZ skok gdy rozne od zera ZF=0 JO skok gdy jest przepelnienie * OF=1 JP skok gdy parzystosc PF=1 JPE skok gdy parzystosc parzysta :-) PF=1 JPO skok gdy parzystosc nieparzysta PF=0 JS skok gdy jest znak * SF=1 JZ skok gdy jest zero ZF=1 Odpowiednie wartosci rejestru znacznikow usatwiaja rozne insrukcje np. cmp, text, repns itp. Zalozmy ze mamy sytuacje: cmp eax,edx jnz xxxxxxx Program porownuje dwa rejestry - eax i edx. Skok jnz jak widac powyzej wykonuje sie gdy "rozne od zera" - czyli nie rowne sobie. Wnioski: skok wykona sie gdy rejestry beda od siebie rozne! Sprawdza przy tym wartosci zwoch rejestrow znacznikow Z i F. A wiec komedna "r fl z" powoduje zmiane znacznika Z, czyli np. skok ktory sie ma wykonac nie wykona sie, albo na odwrot! Czyli komenda r fl z spowoduje, ze skok z linii D wykona sie przy nierownym wyniku operacji cmp. Idzmy dalej, co teraz sie dzieje? 1. 0137:0040112F BE0D304000 MOV ESI,0040300D 2. 0137:00401134 8B06 MOV EAX,[ESI] 3. 0137:00401136 C1E80C SHR EAX,0C 4. 0137:00401139 3DF5960600 CMP EAX,000696F5 5. 0137:0040113E 7498 JZ 004010D8 6. 0137:00401140 EBD9 JMP 0040111B 0137:00401142 803DAF31400001 CMP BYTE PTR [004031AF],01 0137:00401149 74D0 JZ 0040111B 0137:0040114B 6A40 PUSH 40 0137:0040114D 6800304000 PUSH 00403000 0137:00401152 6886304000 PUSH 00403086 0137:00401157 6A00 PUSH 00 0137:00401159 E894000000 CALL USER32!MessageBoxA 0137:0040115E C3 RET Tym razem w linii pierwszej do ESI laduje ilosc znakow naszego pieknego seriala. W linii 2 znowu wszystko laduje do EAX. A nastepnie EAX - czyli ilosc znakow naszego seriala jest "przesuwana logicznie w prawo"! A nastepnie porownywana (linia 4) z 696F5. I znowu powtarza sie stara bajeczka - zle wynocha z tad, dobrze? skocz dalejjjj. Wnioski??? Trzeba sprawic, aby ilosc znakow po komendzie shl,0c byla rowna 696F5. Jak??? Trzeba ten proces odwrocic! Jak? popatrz: SHR - obrot logiczny w prawo Wartosc 696F5 na jedynki i dwojki wynosi 1101001011011110101 1111 Komedna SHR eax, 0c przesuwa go 12 razy (0C decymednalnie wynosi 12). No dobrze wiemy juz ile powinien mic znakow nasz ukochany serial. Wpiszym wiec pozadana przez autora ilosc i jedzmy dalej! Skok z lini 5 nam sie teraz ladnie wykonuje, pedzmy wiec dalej... Przejdzmy przez skok i powinnismy zobaczyc cos takiego: 0137:004010D8 BF0D304000 MOV EDI,0040300D 1. 0137:004010DD 33C9 XOR ECX,ECX 2. 0137:004010DF 8A0439 MOV AL,[EDI+ECX] 3. 0137:004010E2 41 INC ECX 4. 0137:004010E3 22C0 AND AL,AL 5. 0137:004010E5 7402 JZ 004010E9 0137:004010E7 EBF6 JMP 004010DF 0137:004010E9 49 DEC ECX 0137:004010EA C1E105 SHL ECX,05 0137:004010ED 81F9E0010000 CMP ECX,000001E0 0137:004010F3 7526 JNZ 0040111B 0137:004010F5 744B JZ 00401142 0137:004010F7 EB22 JMP 0040111B Ciekawe adresy: www.crackpl.site.pl - polska kultowa juz strona, poprostu THE BEST www.cookiecrk.z.pl - strona grupy CookieCrk. Duzo toolsow, crackme www.ptasiek.x.pl - newsy ze sceny crack www.provider.com.pl/~beanus/ - mirror fravii i Crackstore www.corleone.net/a_s_s_e_m_b_l_y.htm - Art Of Asmebly Language - genialna ksiazka o Asmeblerze (moze kiedys ja przetlumacze) GREATS: mNICH - nauczyl mnie wiele (i na pewno nie tylko mnie ), gbyby nie on dalej bylbym "zwyczajny" +HCU - za to co robia i jak robia CrackPl - za postawe ( fundament ) polskiej sceny crack GustawKit - za to, ze trzyma caly ten burdel ( bez urazy, chodzi o balagan :PPPP ) BART - dzieki niemu wiem ze nie jestem JEDYNY w swoim miesice (Bytom) tato - dzieki niemu wiem ze nie jestem JEDYNY w swoim miesice (Bytom) Dulek - dzieki niemu wiem ze nie jestem JEDYNY w swoim miesice (Bytom) A takze dla wszystkich cracker'ow na swiecie ( + Rafal Platek ) !!!!!!! zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl*** zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***zhrbytom@friko.internet.pl***