Blog literacki, portal erotyczny - seks i humor nie z tej ziemi
Lekcja XV - "Techniki lamamniu zabezpieczen keyfile"
Narzedzia:
1. Softice
-----------------------
WSTEPNIAK
-----------------------
czy to ptak??.. nie!
czy to samolot??.. nie!
To muSzyn piszacy swoje teksty !
hi hi.. zawsze chcialem to powiedziec.. a ty co taki smutny.. hmm.. no co ci jest?? he he.. nie martw sie bedzie dobrze.. sam jeszcze pamietam swoje wejscia na crack scene (uhh.. ile tego bylo..)..
Ja bylem trudny przypadek... przejscie przez "brame" cracku.. tzn. zlamanie pierwszego proga przyszlo mi.. ekhm... az trudno mi to przez gardlo przechodzi... ponad 1,5 roku po tym jak zaczalem sie tym interesowac.... pamietam, to bylo 23 maja 199x roku w 8 klasie podstawowki.. ach co to byl za dzien... na nim zrobilem to pierwszy raz.. ach ! co to byl za dzien !! to byl on ! taki piekny vcdrom... szczegolnie ze... jak ostatnio patrzylem tlock'iem zabezpieczony a ten kto sie interesuje to wie ze zaraz na
poczatku wystarczy tylko odpowiedni rejestr wylukac i juz mamy serialka... teraz by mi to samo zajelo 3s... a wtedy siedzialem nad tym dwa dni!.. takie zycie moi mili... tak jestem tym przejety (mam juz plazme na mozgu) ze postanowilem wszystkie nowo wy
chodzace wersje tlock'a keygenowac... juz jednego mam na koncie.. 1:0 dla mnie (yeah!) ale malo mi ciagle tego badziewia.. a i jakbys mial info o jakis nowych progach zabezpieczonych tym badziewiem to mailme < muszyn@hoga.pl > i zapodaj jakis kontakt z t ym progiem (link'a, chip itp..).. wtedy napewno podziele sie z toba efektami mojej pracy.. o kurde ale sie rozpisalem a ty czekasz i czekasz az skoncze pierniczyc i przejde do konkretow wiec zaczynajmy wreszcie nareszcie...
-----------------------
LET'S GO
-----------------------
Po (dlugim??) krotkim wejsciu czas na jakis pierniczony konkret.. nie?? Tym razem mamy cosik innego niz do tej pory wiec warto przeczytac... nauczyc sie czegos nowego az w koncu przerobic caly ten kursik i zaczac (wreszcie) lamac samemu...
-----------------------
OPIS ZABEZPIECZENIA
-----------------------
Tym razem mamy zabezpieczenie typu "keyfile". Tak chlopak, widze jak ci juz mozg sciska. To zabezpieczenie charakteryzuje sie tym ze wszystkie dane potrzebne do rejestracji znajduja sie w pliku. Ogolnie program zabezpieczony keyfile musi zrobic jedna rze cz, a mianowicie musi OTWORZYC plik... tak, juz widze ten twoj crackerski usmieszek... tu go lapiemy...
Uscislajac i zwezajac temat program zabezpieczony keyfile musi wykonac nastepujace czynnosci:
- otworzyc plik (o tym juz sobie powiedzielismy ;-])
- odczytac z niego odpowiedni string...
- jako ze pobral juz to co go interesowalo.. to moze dalej robic/mieszac/kodowac/dekodowac i wogole wszystko co normalnie robi z wpisywanym serialem/haslem,
Zabezpieczenie takie ma jedna wade.. cholernie latwo jest je zlapac... Ale znow ma zalete.. do pliku mozesz zapisywac wartosci ktorych z klawiatury nie wprowadzisz tzn. z klawiatury mozesz wprowadzic wartosci od 21h do ok. 7Eh (gornej granicy dokladnie n ie znam ale to jest cos kolo podanej wartosci plus special char). Pod win otwieranie pliku odbywa sie poprzez wywolanie funkcji:
CreateFileA
Nastepnie odczytywanie:
ReadFile
ew. zapisywanie:
WriteFile
jeszcze podczas operacji na plikach czesto spotykane sa:
SetFilePointer
GetFileSize
ale uzywanie ich do zlapania programu jest.. ekm... durne... tak nawet sobie nie wyobrazacie jak duzo moze byc setfilepointer w jednym programie podczas jego inicjacji... powiem tylko ze przeszedlem to na wlasnej skorze i moze byc baaardzo duzo... ponad
godzine ctrl-d ciskalem po zalozeniu tej pulapki...;-))
Obecnie zabezpieczenie typu keyfile jest przynajmniej przeze mnie coraz rzadziej a wlasciwie prawie wcale spotykane. Coraz wiecej programow kryje swoje zabezpiecznie w rejestrze win i chyba na tym trzeba skupic swoje dzialania. Ale my mamy keyfile i musi my to polamac bo przeciez co to za cracker co keyfile nie lamal...
-----------------------
ROZPRACUJMY TO
-----------------------
Jak juz wczesniej powiedzielismy do otwierania pliku sluzy funkcja CreateFileA, sluzy ona nie tylko do otwierania, rowniez do tworzenia i takich tam roznych zwiazanych z tym rzeczy.
Mysle ze juz mamy wszystkie informacje aby powolutku zaczac lamac keyfile. Uruchom test_crackme nr 4. Od razu dostajesz wiadomosc ze jeszcze nie scrackowales tego crackme... wiec czas mu pokazac szkole.. no ale co to.. popatrz na naglowek okna,, he .. "u ncracked".. co znaczy ze test_crackme nie jest jeszcze sccrackowane, patrzysz nie ma miejsca zeby wpisac haslo czy cos.. aaaaah tak.. no zapomnialem.. przeciez to keyfile... i wszystkie dane pobiera z pliku... ale jakiego pliku??? wogole to skad on wiedz ial ze ja go jeszcze nie zcrackowalem?? odpowiedz sie nasuwa sama... wiedzial ze nie jest zcrackowany po tym ze nie znalazl pliku.. jakiego?? zamknij crackme.. zaloz pulapke w si na createfilea:
bpx createfilea
juz masz??.. oki.. na poczatek musisz wiedziec ze si przerwie ci na kazdym wywolaniu createfilea... inaczej mowiac przerwie na kazdej PROBIE otwarcia/utworzenia pliku, a probie dlatego ze otwarcie pliku moze sie niepowiesc np. dlatego ze pliku nie ma jak rowniez tworzenie tez moze sie nie powiesc chocby dlatego ze jest pelen dysk, a dla nas to nawet lepiej bo my niemamy pliku a tak bedziemy wiedzieli kiedy i co chce otworzyc... jesli zalozyles pulapke to teraz wyjdz z si.. i uruchom test_crackme... i co ?? przerwal?? no pewnie ze tak... ale jak juz powiedzielismy wczesniej przerwie na kazdej probie otwarcia pliku a klikajac dwukrotnie na ikone test_crackme.. probowales go otworzyc a nas nie interesuje test_crackme tylko jakis plik ktory powinien byc na
zewnatrz.. wiec ctrl-d.. i juz jestesmy spowrotem.. teraz F11 i widzisz cos takiego:
015F:00401048 68000000C0 PUSH C0000000
015F:0040104D 682F314000 PUSH 0040312F <- XXX
015F:00401052 E8A7010000 CALL KERNEL32!CreateFileA
tu jest bardzo wazny kawalek kodu... poza tym ze jest to wywolanie funkcji odpowiedzialnej za tworzenie/OTWIERANIE plikow... to bardzo latwo mozna sprawdzic co jest otwierane/tworzone poprzez ta funkcje a konkretnie jaka nazwe nosi ten obiekt.. a robi si e to w sposob nastepujacy.
Pamietasz jak mowilem o getwindowtexta i o odnajdywaniu adresu pod korym jest zapisywane haslo... w ten sam sposob odnajdujemy otwierany/tworzony obiekt po wywolaniu funkcji createfilea.. z ta tylko drobna roznica ze argument nas interesujacy to nie prze dostatni tylko... ostatni, czyli to jest ten oznaczony XXX... no to jesli chcesz wiedziec co chce otwierac/tworzyc ta funkcja wystarczy ze zapodasz:
d 0040312F [enter]
i nagle jak swiatlem porazony zobaczyles tajemniczy ciag:
crackme.key
he.. pomysl, co to moze byc?? ja nic nie mowie.. sprobuj sie domyslic.. ekkh... znow musze ci powiedziec?? dobra, ale to juz ostatni raz... otoz to jest potrzebny plik.. w zasadzie to tylko jego nazwa... ale to juz bardzo wiele.... no ale mozesz przeciez zapytac, "skad komputer wie czy plik jest czy tez go nie ma?? czy to jest wbudowane w srodku funkcji czy moze programista dopisal jakas procke sprawdzajaca to??".. powiem ze sprawdzenie takie jest bardzo proste do zrobienia i jest zaraz po wywolaniu fun kcji:
015F:00401057 83F8FF CMP EAX,-01
015F:0040105A 0F84A8000000 JZ 00401108
tu mamy porownanie rejestru eax z -01. A czymze niby jest -01.... no wiec -01==FFFFFFFF a funkcja createfilea zwraca w przypadku niepowodzenia w rejestrze eax wartosc -01 czyli FFFFFFFF... a w przypadku powodzenia jakas tam inna wartosc ktora jest uchwyt em pliku, ale to material na calkiem inny tutorial... nas intersuje to ze jezeli plik nie zostanie OTWARTY/utworzony do funkcja zwraca -01 (FFFFFFFF) a w przeciwnym wypadku liczbe rozna od -01 (FFFFFFFF) czyli moze to byc 0111h jak rowniez setki innych.. .
Wiec wniosek az sam pedzi do glowy... jezeli zaraz po wywolaniu funkcji porownamy zawartosc rejestru eax z -01 (FFFFFFFF) to jesli wynik bedzie pozytywny (wartosci beda takie same - np. flaga Z ustawiona) to eax == -01 (FFFFFFFF) a to znaczy ze pliku ni e ma... czyli dla naszego kawalka kodu jesli skok "jz" sie wykona to pliku nie ma... a my znajac nazwe pliku prawidlowego mozemy go utworzyc i w ten sposob pozbedziemy sie problemu z nie znalezieniem a w konsekwencji nie otwarciem pliku, co powoduje wyko nanie skoku "jz" a my nie chcemy zeby sie wykonal wiec tworzymy plik, jaki??
to juz chyba pamietasz a jesli nie no to masz:
crackme.key
i teraz jesli go stworzyles znow zakladasz pulapke na createfilea i jedziesz dalej...
Teraz musisz dojsc do tego momentu na ktorym skonczylismy... juz jestes?? no to mozemy zawijac dalej (w te sreberka ;-])
Zobacz, teraz po wywolaniu funkcji w eax nie ma -01 (FFFFFFFF) jest jakas inna wartosc... czyli w naszym przypadku plik zostal OTWARTY... a jesli zostal otwarty to skok "jz" sie nie wykona czyli nasza przewaga i mozemy analizowac dalej kod:
015F:00401060 A351314000 MOV [00403151],EAX
mozesz sie zastanawiac co to jest ale powiem ci ze to nas nie interesuje.. jesli bys chcial wiedziec co to robi to ci powiem.. ale krotko. Pamietasz jak wczesniej mowilem, ze w eax jest zwracany uchwyt pliku.. no i tu wlasnie ten uchwyt jest przenoszony
do zawartosci adresu 00403151... no ale teraz mozesz zapytac.. "co to jest ten uchwyt??".. nie bede sie nad tym rozwijal.. mozna ta liczbe uznac za taka raczke. Wez zagotuj sobie wody w czajniku.... po zagotowaniu woda jest goraca i czajnik ma temperatur e ponad 100 C...i gdyby nie raczka ktora jest wmontowana w czajnik nie mogl bys zlapac tego czajnika.. no chyba ze jestes wytrzymaly na taki bol.. ale zakladam ze nie... a pomysl sobie ze ta raczka by byla na tym czajniku calyczas.. tylko nie wiedzialbys gdzie ona jest.. i ktos musialby ci dopiero powiedziec gdzie ona jest abys mogl wziac ten czajnik... i podobna sytuacja jest z systemem... ta liczba zwracana w eax w przypadku otwarcia jest taka "raczka" za ktora system moze zlapac plik a nastepnie nim
manipulowac.. proste.. no nie?? Bardziej lopatologicznie nie umiem tego wytlumaczyc... ale nas to nie powinno interesowac bo nie jest nam ta informacja do niczego potrzebna.. to bylo tak... w formie ciekawostki ;-))
Jak juz sobie powiedzielismy o uchwycie to mozemy analizowac dalej:
015F:00401065 6A00 PUSH 00
015F:00401067 684D314000 PUSH 0040314D
015F:0040106C 6A04 PUSH 04
015F:0040106E 6844314000 PUSH 00403144 <- XXX
015F:00401073 FF3551314000 PUSH DWORD PTR [00403151]
015F:00401079 E892010000 CALL KERNEL32!ReadFile
Tu mamy argumenty i wywolanie funkcji readfile. Wczesniej juz powiedzielismy ze sluzy ona do odczytywania z pliku... a adres gdzie zostana zapisane pobrane bajty to jej przedostatni argument (to ten oznaczony XXX).... po jej wywolaniu zwracana jest w eax ilosc odczytanych bajtow a w przypadku nie odczytania zadnego jest zwracana wartosc... zero... i chyba jest oczywiste ze czytanie nastepuje z naszego "crackme.key" a jak wiemy w nim nic nie ma wiec nic nie odczyta.. no i tutaj mozemy wyjsc z si i wpisac tam.. he.. np. swoja ksywke... no wiem myslisz sobie teraz ze tak daleko zaszedles i szkoda troche znow zaczynac od poczatku.. no to mam dla ciebie taki tips...
//Tips\\
Jezeli zaszedles daleko w analizowaniu kodu mozesz uzyc takiej skladni komendy bpx:
bpx adres_na_ktorym_chcesz_zrobic_save'a
a dla pierwszej instrukcji w naszym przykladzie z readfile bedzie to cos takiego:
instrukcja na ktorej chcemy sie zatrzymac to:
015F:00401065 6A00 PUSH 00
skladnia komendy dzieki ktorej sie zatrzymamy na naszej instrukcji to:
bpx 00401065 [enter]
i juz masz zalozona pulapke na tym adresie.. i teraz wylacz pulapke na CreateFileA wyjdz z si i uruchom test_crackme.. i co he he... no wlasnie zatrzymales sie na nazej instrukcji i zrobiles swojego pierwszego "save'a" ;-))
\\Koniec Tips'a//
No to jesli wpisales juz w pliku swoja ksywke czy cos tam innego, ja wpisalem: muSzyn, to mozesz analizowac dalej juz sam bo odtad zaczyna sie juz normalne sprawdzenie jak przy poprzednich test_crackmes'ach... wiec pozwole sobie nie opisywac tych samych
rzeczy tylko poprostu popisze co jest gdzie robione a jezeli jeszcze nie potrafisz wyciagnac z tego wnioskow to odsylam do lekcji poprzednich...
015F:0040107E BB44314000 MOV EBX,00403144 <- nasza ksywka do ebx
015F:00401083 BA2A314000 MOV EDX,0040312A <- prawidlowy ciag do edx
015F:00401088 8B1B MOV EBX,[EBX] <- znamy to juz bardzo dobrze
015F:0040108A 8B12 MOV EDX,[EDX] <- to tez
015F:0040108C 3BD3 CMP EDX,EBX <- to rowniez
015F:0040108E 7578 JNZ 00401108 <- jesli wartosci w ebx i edx sa rozne to skok (zly) a jesli rowne to skoku nie ma (dobry)..
problemu z tym nie powinienes miec zadnego.... gdy juz bedziesz mial poprawny ciag poprostu wpisz go do pliku a nastepnie uruchom test_crackme i sam zobaczysz efekty...
zdrowko, muSzyn
--
Wszelkie uwagi do projektu oraz mile i niemile skojarzenia jakie ci sie nasunely podczas czytania projektu kieruj na:
muszyn@hoga.pl
--
Wszelkie swoje pytania dotyczace cracku kieruj na:
crk_pomoc@poland.com
Na pytania dotyczace piractwa, religii oraz na prosby o cracki nie odpowiadam.
--
Jezeli wyslesz mail na muszyn@hoga.pl z pytaniem (problemem) o tematyce crackerskiej nie otrzymasz odpowiedzi jedynie gdy wyslesz na adres crk_pomoc@poland.com i tam wlasnie nalezy kierowac swoje pytania dotyczace cracku. Analogicznie z drugim adresem.