Faq crackerskie #5 by mNICH

=====================================
TEXT napisany przez mNICH-a         |
CRACKING - REVERSE ENGINEERING !!!  |
wydanie nr. 5 !!!                   |
=====================================

WSTEP :

Hmmm ... co tym razem ... :

Znowu bez WDASM <-) ... zreszta uzywam go rzadko ... wole S-ice'a <-) ..... heh ... no dobra ... w tym "odcinku" ... NIE, nie zgadles nie bedzie CrackME 4 <-) (CureME 1.0) poniewaz porcedura kodujaca jest "troche" skomplikowana i dopiero po tym jak +CrueHead da mi zrodlo swojego CureME zobacze jakie "kruczki i sztuczki" uzyl <-) ... (moze w nastepnym odcinku) ... chociaz watpie ... bo sproboje opisac cos innego ... <-) ... Dobra ... wracamy do terazniejszosci ... w tym (przerosnietym <-) ) odcinku bedzie wszystko wymieszane ... tzn. troche roznych tematow ... natomiast zadnego NOWEGO "celu" ... bedziesz potrzebowal tylko (ewentualnie) starego dobrego CrackMe 1.0 <-) ... bedzie o : ... zmienianiu na stale plikow ... i sposoby podejscia ... DOBRY sposob na lamanie okienkowo-zorientowanych programow <-) ... troche o DOS ... troche o VB i ... FILOZOFII <-) ... Jak widzisz duza rozbieznosc tematow <-) ... hmmm ... doszlem juz do ponad 80 KB textu ... eh ... szkoda tylko ze cos mi sie nie chce wiecej pisac ... prawdopodobnie nastepny numer bedzie po jakims (dlugim) czasie (chyba ze mi wroci "natchnienie" albo ktos sie przylaczy do pisania textow <-) ) ... kurde ... sorry ... ze odeszlem (ALE TYLKO NA TEN TEXT !) od mojego stylu MAX praktyki MIN teorii i zamiast tego wyszlo MAX teorii MIN praktyki <-( ... musisz to przebolec i NAPRAWDE nad tym textem przysiasc aby WSZYSTKO zrozumiec ... od nastepnego textu wracamy do praktyki <-) ... ale w tym texcie przysiadz i przeczytaj WSZYSTKO (bo w niektorych dzialach sa wzmianki o tematach nie zwiazanych z dzialam !!!) dokladnie i ze ZROZUMIENIEM ... jesli nie zrozumiesz zagadnien tu zawartych moze Ci byc NAPRAWDE CIEZKO w dalszej "karierze" <-) ... Mam nadzieje ze NIE bedzie zbyt ciezko <-) ...

BEGINNERS ... :

heh ... wiem ze wszystkie texty ktore pisze sa raczej przeznaczone dla NAJBARDZIEJ poczatkujacych crackerow/reverserow ... no ale coz ... ktos to musi zrobic <-) ... moze za jakis czas zaczne opisywac cos bardziej zaawansowanego <-) ... wiec jesli znasz sie troche na rzeczy to nie masz raczej po co czytac dalej <-) ...

POPRAWNE ? :

hmmm ... mam nadzieje ze nie ma w tym texcie zadnych bledow ... ale ze wzgledu na objetosc nie chcialo mi sie sprawdzac tego dwa razy ... wiec moglo sie cos pokrecic ... jak cos zauwazysz to mnie o tym poinformuj ...

CD-CHECK :

DUZO osob "CHCE" abym napisal jakis text na temat zabezpieczen typu CD-check ... czyli jak zlamac program aby uruchamial sie na HDD bez plyty ... albo zeby sie uruchamial z nie-oryginalnej plyty CD ... moja odpowiedz (na razie - bo moze zmienie kiedys zdanie <-) ) : (znowu na razie) NIE napisze textu o tym ! ... bo nie chce zbytniego rozpowszechnienia piractwa ! ... a ten typ zabezpieczenia najbardziej interesuje "CIEMNA" strone cracker-ow <-) ... ech ... ja nie pisze tych textow po to aby rozprzestrzenic piractwo ! ... chodzi mi zakrzewienie umiejetnosci logicznego rozumowania ... analizowania kodu ... znajomosci ASM-a (aby nie powstawaly nowe "rzesze" Visual Basic-owcow <-) ) ... i ogolnie WIEDZY (ZABAWY <-) ) ... <-) ... (prawdopodobnie) i tak zdobedziesz gdzies info jak lamac takie CD-check ... trudno ... mam przynajmniej nadzieje, ze nie zostaniesz kolejnym piratem na "rynku" ... a, poza tym to tego typu zabezpieczenia NIE sa (w wiekszosci przypadkow) trudne do zlamania - wrecz przeciwnie bardzo latwe ...aj, juz wiecej nic nie mowie ... to na tyle o CD-check <-) ...

XWA :

Pamietaj ze jesli spotkasz gdziekolwiek jakas osobe o xywie : mnich , MNICH , Mnich , MnicH , mn1ch , Mn1cH , mnICH ... to NIE JA !!! Tylko i wylacznie mNICH !!! ... to oswiadczam, bo juz pare osob pytalo sie co to jest Dongle mnicha z klasztoru bernardynow <-) ... heheh (moze przesadzilem <-) ) ...<-) :

Jesli zobaczysz w texcie znak "<-)" to to nie jest zadna strzalka ... czy cos takiego ... to zwykly ":-)" ... tylko ... Jak kazdy szanujacy sie mNICH zaslaniam pol twarzy kapturem ... eheheh <-)))) ...

DOSKONALE ??? ... :

Dziwne, ze nikt nie ma zastrzezen do moich textow ... same pochwaly ... hmmm ... nie wydaje mi sie zeby to byly doskonale texty <-) ... kazdy tworca chce udoskonalac swoje dzielo ... a moze to robic tylko przez jakies krytyczne opinie ... wiec piszcie co jest nie tak ... i co by sie przydalo zmienic ... tylko nie cos takiego : TWOJ TEXT JEST DO DUPY ... i koniec ... koniecznie wyjasnienie ... OK ? ...

KOMERCJA VS CRACKMES <-) :

Wiem ze myslisz sobie dlaczego nie lamiemy czegos pozytecznego z jakichs plyt CHIP-a czy cos takiego ... hehe ... po prostu ktos kto bedzie czytal ten text za rok nie bedzie juz mial dostepu do tego programu (tej wersji) a ja mysle ze bez praktyki i wlasnych rozwazan na temat zabezpieczenia programu cala wiedza ktora przekazuje zmniejsza sie o 50-60% i dlatego unikam tego jak ognia ! ... Natomiast taki CrackMe mozna latwo dolaczyc do textu i wszystko OK ... (jesli nawet wersja komercyjnego programu ktory MIALBYM opisac jest aktualna to i tak lepiej zamiescic maly Crackme (za darmo !) niz musialbyc kupowac jakies plyty !) ... Poza tym jestem ETYCZNY i wole lamac CrackMEs <-) ... btw: i tu mam prosbe ... jesli ktos zna jakies CrackMEs dotyczace zabezpieczen typu trialware (30-dni), ilosc uruchomien, itp. ... w kazdym razie inne niz SERIAL ... NAME/SERIAL ... czy PLIK REJESTRACYJNY ... to niech da mi znac koniecznie ! ...

SPOLKA Z O.O. <-) :

NIE ODPOWIADAM ZA NIEZGODNE Z PRAWEM UZYCIE WIADOMOSCI NABYTYCH DZIEKI TEMU TEXTOWI ... ANI ZA ZADNE SZKODY KTORE CZYTELNIK ZROBI SOBIE/KOMUS ... UMIESZCZONE MATERIALY SA W CELACH EDUK... oh! ... sorry ...ROZRYWKOWYCH ! <-) ...

Jesli chcesz zadac pytanie, wyslac kase ... eh ... to co zwykle <-) to :

KONTAKT -

E-mail : mnich@biosys.net
IRC    : IRCnet - #cracking #crackpl #cracker #crackers 
EFnet - #cracking #cracking4newbies #massive #phrozencrew #crackers

lub szukaj na jakis innych kanalach - czasami sie wlocze tu i tam <-)

xwa - mNICH lub mNICH-RE (jesli nie ma DUZYCH liter z mala na poczatku - to jeszcze raz powtarzam : NIE ja !!! <-) ) ...

UIN : 18963457

ZASADY KONTAKTU <-) :

O ... teraz bedzie typowe FAQ ... jesli chcesz sie ze mna skontaktowac, PROSZE, przestrzegaj kilku zasad !!! <-) .... :

1) Tylko prosze ! ... nie przysylajcie mi maili z pytaniami na temat sieci, hackingu, czy phreakingu !!! ...

2) I NAWET NIE PROBOJ PYTAC SIE MNIE O JAKIES CRACKI !!! ... I ZEBRAC ZEBYM CI JE PRZESLAL/POSZUKAL/DAL URL !!! ... CHOCBY NIE WIEM JAKIE TO PILNE BYLO CZY SPRAWA ZYCIA I SMIERCI ... NIE ODPOWIEM BO TO JEST SPRZECZNE Z MOIMI IDEALAMI (MAM SWOJA ETYKE "ZAWODOWA" <-) ) ... WIEC NAWET NIE MASZ CO PROBOWAC !!!

3) Niestety nie jestem w stanie odpowiadac na kazdy mail z pytaniami w stylu : 1) Jak lamac zabezpieczenia typu trialware (30-dni) ? 2) Jak usuwac NAG-screen-y ? 3) Jak lamac Dongle ? 4) itp. itd. ... Poniewaz sa one zbyt OGOLNE ... musialbym kazdemu z osobna przesylac nie krotka odpowiedz ale cale tutoriale !!! ... Dotad staralem sie odpowiadac na takie pytania ... przynajmniej NAKIEROWAC ... ale raczej juz nie mam czasu ... wiec sproboj raczej zadawac KONKRETNE pytania ...\

4) NIE PYTAJ MNIE GDZIE PRZESYLAC SWOJE CRACKI !!! ... po prostu wejdz na IRC-EFnet (nie IRCnet !) na kanal #cracking pogadaj z kilkoma gosciami (in english of course) i zaraz sie znajdzie dla Ciebie miejsce w jakiejs (jakichs) grupie(ach) <-) ... Polskie grupy tez sobie gdzies poszukaj ... chyba grupa CrackPL przyjmuje cracki wiec tam sie zglosic do kogos ... lub popytaj na IRC-IRCnet na #crackpl ...

5) NIE pytaj mnie skad sciagnac popularne narzedzia ... po prostu POSZUKAJ ! ... albo poproboj w linkach ktore sa na koncu textu ... wiem ze interesuja was POLSKIE miejsca ... ale to tez nie jest problem (wiekszy <-) ) ...Te najbardziej "standardowe" sa ... gorzej z tymi mniej "standardowymi" ... eh ... nie martw sie, niedlugo zrobie gdzies strone z narzedziami ... w zasadzie to sa juz zaladowane narzedzia na jeden FTP i nawet przygotowana strona wiec jest tylko kwestia wyslania kilkubajtowego .html na jakis serwer ... jednak moja najwieksza wada jaka jest LENISTWO proboje mi w tym przeszkodzic... <-) ... mam nadzieje ze ja pokonam i w koncu to zaladuje <-) ...

6) Wiele osob pyta mnie gdzie mozna znalezc inne polskie texty (niz moje) ... hmmm ... o ile mi wiadomo to sa tylko na tej stronie (grupa CrackPL) : http://www.crackpl.site.pl/

No ... mysle teraz ze juz sie troche "odchudzi" lista standardowych pytan ktore sa do mnie kierowane <-) ... jesli zastosowales sie do powyzszych regul a nie dostales odpowiedzi na twoj list to najprawdopodobniej ulegl on zniszczeniu na skutek skasowania/sformatowania dysku/nie dotarl ... albo twoj serwer pocztowy padl i nie moglem wyslac a ja nie lubie powtarzac wysylania wiec list poszedl do kosza <-) ... w takim wypadku wysylaj az do skutku (oczywiscie listy zgodnie z REGULAMI)

DLA ZALAMANYCH :

Jesli nie mozesz zlamac zadnych programow ... nie rozumiesz wogole o czym ten mNICH pieprzy ... i nawet nie potrafisz zlamac programow przytoczonych na koncu tego tekstu ... to ... sie NIE PRZEJMUJ ! ... jesli znasz ASM (to jest po prostu PODSTAWA !) to jest tylko kwestia czasu ze zaczniesz lamac kazdy program z zamknietymi oczami ... jesli dojdziesz juz do pewnego poziomu to NAPRAWDE zlamanie programu jest TYLKO kwestia czasu ... mozesz go lamac przez 2 min. albo przez 2 miesiace (oczywiscie troche wyolbrzymione - chyba <-) ) ... ale NAPEWNO w koncu go zlamiesz !!! ... NIE ma zabezpieczenia ktorego nie dalo by sie zlamac (i prawdopodobnie NIGDY nie bedzie) !!! ... Jesli czytasz jakis text i go nie rozumiesz to wroc do niego za jakis czas !!! (po jakims czasie praktyki) a napewno zrozumiesz <-) ... Wiekszosc poczatkujacych zawsze chcialaby cos takiego :

         MOV   EAX,[ESI]
         MOV   EBX,[EDI]
         CMP   EAX,EBX
         JZ    xxxxxxxx

heh ... w kazdym razie cos podobnego ... i rzeczywiscie jest to obecne w WIELU programach (jak sie przekonasz <-) ) ... Jednak po kilkudziesieciu (kilkuset(kilku tysiecy)) programach tak zabezpieczonych zacznie Cie to nudzic ... i bedziesz chcial czegos trudniejszego (czego znalezienie przyjdzie Ci z trudnoscia <-) ) ... chociaz wiem ze narazie to bardzo fajne uczucie dla was znalezc cos takiego, spisac zawartosc [EDI] (czy [ESI]) i wpisac to do okna rejestracyjnego - i poczucie wlasnej MOCY gdy program "mysli" ze jest zarejestrowany <-) ... (nawet nie bede mowil co niektorzy (jak mi pisali) DOSTAJA ! <-) ) ... Jednak uwierz mi ! im trudniejsze zabezpieczenie tym wieksza radosc ze zlamania (tym wiekszy x dostaniesz <-) ) ... choc wiem ze niektorzy mimo lat lamania dalej dostaja przyplywu adrenaliny na widok powyzszego kawalka kodu <-) ...

============================== ATTENTION !!! =================================

WHO IS ABLE TO TRANSLATE MISCELLANEOUS ENGLISH (CRACKING BUT NOT ONLY !!!) TEXTS PLEASE CONTACT WITH ME !!! ... I HAVE SOME "HOMEWORK(S)" FOR YOU ! <-) ...  NEW GENERATIONS OF FUTERE POLISH CRACKERS (REVERSERS) WILL BE THANKFUL TO YA !!! ... I WON'T MANAGE TO DO IT JUST ONLY MYSELF (ESPECIALLY, AS U SEE, MY ENGLISH  IS RATHER POOR ... ISN'T IT ? <-) ) ... THE MOST OF GOOD TUTORIALS HAS BEEN  WRITTEN IN ENGLISH LANGUAGE ALREADY ... AND ARE WAITING FOR GOOD TRANSLATION TO MONOLINGUAL PPL ON THIS WORLD ... <-) ... OKAY ... I'M WAITING FOR PROPOSITIONS ... YEAH, I KNOW, NONE WILL PAY ATTENTION TO THIS ... EH... WELL, AT LEAST I'VE TRIED <-) ...    

========================== END OF ATTENTION <-) ==============================

================================ UWAGA !!! ===================================

KTO MOGLBY SIE PRZYLACZYC DO PISANIA TEXTOW TO JESTEM OTWARTY NA PROPOZYCJE  HMMM ... TYLKO RACZEJ DOBREJ JAKOSCI ... HEHEH ... CHYBA ZA DUZO WYMAGAM OD ZYCIA <-) ... W KAZDYM RAZIE (RACZEJ) NIE POWIEM "NIE" I KTO CHCE TO MOZE SPROBOWAC SWOICH SIL I "POBAWIC" SIE W "NAUCZYCIELA" <-) ...

============================  KONIEC UWAGI <-) =============================== 

Heh ... Tutaj byl oryginalnie DLUUUUUUGI text filozoficzny na temat REALITY CRACKING i roznica miedzy CRACKEREM a REVERSE ENGINEEREM ... jednak go wycialem bo mysle ze nie spotkal by sie ze zrozumieniem <-( ... moze kiedys to opublikuje ... na razie raczej wolicie jezyk zero-jedynkowy <-) ...

(NIE ?)SLUSZNE ... i ... poszukiwacz CRACKOW :

Hmmm ... czy to sluszne ze rozpowszechniamy (rozpowszechniacie) "wykryte" SERIALE czy swoje cracki w sieci ??? ... hmmm ... Moim zdaniem - Oczywiscie MOIM, bo NIKOMU i NIC nie narzucam - to raczej nie sluszne ... Po to pisze te texty zeby ktos sie czegos nauczyl a nie bezmyslnie wpisal SERIAL sciagniety z ASTALAVISTY czy cos takiego ... Jesli koniecznie potrzebujesz PELNEJ wersji to sobie ja KUP ! ... Eventualnie mozesz zlamac program i uzywac go - nie popieram - ale to juz o WIELE lepsze niz poszukanie SERIALA i "bezlitosne" zarejestrowanie ... Fakt, ze wiekszosc programow nie zasluguje na oplate, ktorej zada programista (producent), ale sa tez "perelki" (ktore zdarzaja sie raz na 1000(0)) ... za ktore NAPRAWDE warto wylozyc troche kasy - przeznaczonej pierwotnie na zakup pirackich plyt <-) ... No dobra, jesli RAZ (co najwyzej KILKA) raz(y) zdazy Ci sie skads sciagnac cracka, bo 30 dni to za malo do przetestowania to jeszcze mozna podarowac ... Ale do POGARDZENIA sa ludzie ktorzy ciagle, malo tego ze staraja sie o te cracki, to jeszcze GNEBIA innych zeby im je DAC !!! ... To jest juz totalna przesada ! ... zeby sobie nie moc samemu znalezc (jesli juz koniecznie MUSI miec) !? ... ... bo to naprawde przesada ...

Jesli kogos urazilem ... to ... NIE ... NIE PRZEPRASZAM ! ... Naprawde czlowieku - zmien swoje nastawienie !!! ... No chyba ze ktos lubi jak mu sie ciagle zawraca glowe zeby przeslac cracka ... jak sobie znajdziesz taka osobe to nie ma sprawy ... ja sie nie wtracam <-) ...


WINICE.DAT I SREDNIKI :

Jeszcze musze powiedziec o jednym pytaniu ktore mi zadaje WIELE osob ...mam juz dosc odpowiadania na nie po raz 2000 ... wiec podaje odpowiedz ...po raz OSTATNI !!! ... mianowice problem jest taki ze po wpisaniu np. komendy <bpx getdlgitemtexta> (czy jakiejs innej 32-bitowej) S-ice wypisuje blad : "Symbol not defined (getdlgitemtexta)" Spowodowane jest to tym ze S-ice NIE "WIE" co to znaczy 'getdlgitemtexta'musimy go tego "NAUCZYC" ... te standardowe nazwy (API) zdefiniowane sa w roznych DLL-ach ... te "najbardziej" standardowe sa w KERNEL32.DLL i USER32.DLL ... teraz co musimy zrobic zeby S-ice je "widzial" ? ... Trzeba w pliku WINICE.DAT (ktory jest w katalogu z S-ice) w sekcji :

; ***** Examples of export symbols that can be included for Windows 95 *****
;  Change the path to the appropriate drive and directory   

ktora znajduje sie na koncu pliku usunac sredniki z paczatkow linijek sciezek do DLL-ow ktore sa ponizej powyzszej sekcji ! ... nie musisz usuwac srednikow z wszystkich linijek (chociaz dla nie znajacych API i w jakich DLL-ach one sie znajduja to wskazane jest usunac wszystkie sredniki <-) ) ... wystarczy usunac te sredniki z linijek w ktorych sa sciezki do :

;EXP=c:\windows\system\kernel32.dll
;EXP=c:\windows\system\user32.dll

potem juz wedlug uznania mozna usuwac takze sredniki z innych linijek ale tu juz musisz wiedziec ktore DLL-e maja jakie funkcje !!! ... (moze jednak lepiej usun wszystkie sredniki <-) ) ... mozna tez dodawac swoje wlasne !!! ... sprawdz jeszcze czy na pewno sciezki sa poprawne tzn. czy windows nie znajduje sie u Ciebie na innym dysku czy w innym katalogu !!! ... Teraz juz powinno byc wszystko jasne ... jesli jeszcze nie (to QUAKE <-) ) to dolaczylem do tego textu moj przykladowy WINICE.DAT ... mozesz nim zastapic swoj wlasny ... i potem wszystko powinno byc OK. <-) ... Jesli dalej nie dziala to ... teraz nic mi nie przychodzi do glowy ... po prostu MUSI dzialac <-) ... jesli kiedys zobaczysz znowu ten komunikat przy probie ustawienia breakpoint-a na jakiejs (nie)standardowej funkcji to problem NA PEWNO (?) tkwi w WINICE.DAT i srednikach <-) ... Jesli jeszcze raz ktos mi postawi to pytanie to NIE ODPOWIEM !!! ... KONIEC ... kropka ... 3 kropki ... <-)


MAKRA :

Uzywaj roznych makr ! ... to ci moze ulatwic zycie ... np. zobacz na dolaczony do tego textu moj WINICE.DAT przeanalizuj go i zwroc uwage na makra jakie tam sa ... i sproboj stworzyc swoje wlasne ... a potem mi je podeslij (jak beda ciekawe) <-) ...


SPOSOBY PODEJSCIA :

Nie panikuj gdy nie dziala zaden standardowy breakpoint ... jest zawsze o WIELE wiecej drog do zlamania jakiegos zabezpieczenia niz kiedykolwiek bys pomyslal !!! ... oto kilka roznych drog (dla zabezpieczen typu SERIAL) :

1)Na poczatku zawsze GetDlgItemTextA i GetWindowTextA ... oczywiscie gdy mamy 16-bitowy program to NIE mozemy uzyc powyzszych funkcji !!! uzywamy wtedy funkcji GetDlgItemText i GetWindowText (bez "A" na koncu !!!)

2) Jesli powyzsze nie dziala ... to probojemy na innych standardach ...np. GetDlgItemInt albo GetWindowTextW ... mozna to sobie ulatwic tworzac makro ... np. takie jakie podalem w przykladowym WINICE.DAT ...

3) Jesli inne takze nie dzialaja to probojemy ustawic breakpoint na funkcji HMemCpy (<bpx hmemcpy>) ... UWAGA ! ... tutaj musimy ustawic ten breakpoint PO wpisaniu swoich danych w okno rejestracyjne ... jesli tego nie uczynimy to S-ice bedzie przerywal na KAZDYM wpisaniu jakiegokolwiek znaku w okno ... chociaz czasami to moze byc uzyteczne ...(HMemCpy jak latwo sie domyslic operuje na pamieci i na roznych danych kopiujac je z jednej czesci "czegos" do drugiej (Jesli sie nie myle <-) )) ... Nastepnie gdy juz nacisniemy klawisz "OK" i S-ice sie pojawi (prawie ZAWSZE sie pojawi bo ta funkcja jest niemalze WSZECHOBECNA ... np. jest takze czescia GetWindowTextA czy GetDlgItemTextA i innych) to musimy kilkakrotnie (kilkunastokrotnie) nacisnac klawisz F12 ktory robi to samo co komenda <p ret> ktora natomiast powoduje ni mniej ni wiecej jak wykonanie programu az do napotkania instrukcji RET (przy czym program ja takze wykonuje i ladujemy zawsze zaraz za jakims CALL-em z ktorego wlasnie wrocilismy !!!) ... no wiec naciskamy ten F12 iles tam razy AZ do pojawienia sie na lini oddzielajacej okno kodu od okna komend jakiejs "znajomej" nazwy ... np. jesli program nazywa sie I-M-SHIT to MOZLIWE ze we wspomnianej linii pojawi sie napis "IMSHIT" albo cos podobnego ... albo np. jezeli program jest VB to naciskamy F12 az do pojawienia sie napisu np. VB40032 czy nazwy innej wersji biblioteki VB ... w kazdym razie badz czujny gdy pojawi sie cos innego niz USER albo VMM itp. ... ... no i od tej pory mozesz juz normalnie sledzic kod programu <-) ...

4) W wiekszosci przypadkow wystarcza 3 pierwsze punkty do dostania sie do kodu zabezpieczenia ... no ale mozemy tez sprobowac innych drog np. : ... ustwiamy breakpoint na MessageBoxA (czy odpowiednio MessageBox) wpisujemy dane rejestracyjne klikamy OK i wtym momencie S-ice moze przerwac ... ale co to spowodowalo ??? ... Otoz MessageBoxA to funkcja ktora wyswietla na ekranie okienko z jakas informacja np. "Incorrect password" ... niektore aplikacje wykorzystuja ta wlasnie funkcje do wyswietlenia wiadomosci o blednym kodzie ...gdy juz S-ice nam przerwie to niciskamy F11 (wyjscie z funkcji) i jestesmy w miejscu z kad zostala wywolana wlasnie ta funkcja ... i co teraz ? ... teraz patrzymy sie do gory czy przypadkiem nie ma tam jakis "ciekawych" JNZ/JZ/JE/JNE/JMP... itp. ktore wystepuja po jakims CALL albo TEST albo CMP itd. i patrzymy czy ten JZ/... nie "skacze" ZA naszego CALL-a z MessageBoxA !!! ... dalej juz powinniscie wiedziec co robic <-) ...

5) Tak samo jak z MessageBox(A) sproboj z DialogBoxParam(A) !!! ...

6) Jesli breakpoint na MessageBox(A) nie dziala to moze slyszymy jakies pikniecie gdy program wyswietla info o zlym kodzie ??? ... jesli tak to MOZE program uzywa funkcji MessageBeep do tego dzwieku ? ... a wiec ustawiamy w S-ice breakpoint na MessageBeep (bez "A" bo nie ma 2 wersji) (<bpx messagebeep>) ... i wprowadzamy dane i klikamy OK ... mozliwe ze S-ice teraz przerwal wiec naciskamy F11 (jesli jeszcze nie wiesz dlaczego ... to QUAKE czeka <-) ) i dalej tak samo jak przy MessageBoxA ...

7) Mozesz sprobowac tez jesli program pokazuje okno ale NIE uzywajac MessageBox(A) ani DialogBoxParam(A) wykorzystac funkcje API : ShowWindow ktora jest wywolywana (chyba miedzyinnymi <-) ) przy wyswietleniu jakiegos okna ... ech ... nie bede wchodzil w szczegoly po prostu sproboj jej uzyc (podobne do MessageBox(A) i drugiej <-) ) ...

8) WIELE, WIELE innych sposobow !!! ... po prostu sproboj wymyslic swoje ... powyzej podane sa tylko te najpopularniejsze i najczesciej spotykane ... Przeczytaj jeszcze dzial "PODEJSCIE "ZAAWANSOWANE"" ... Jest to BARDZO skuteczna metoda ... <-)


PODEJSCIE "ZAAWANSOWANE" <-) :

Teraz podam sposob ktory jest PRAWIE ze nie zawodny !!! Oczywiscie odnosi sie to do zabezpieczen ktore generuja JAKIEKOLWIEK okna tzn. okna dialogowe , NAG-screeny , jakies infa ... itd. Itp. ... mianowicie jesli np. wpisales zly SERIAL i program generuje okno z taka informacja, to oto co mozemy zrobic : Majac ukazane okienko z informacja ze podalismy zly serial wchodzimy do S-ice'a (Ctrl-D ... jakby ktos jeszcze nie pamietal <-) ) ... teraz wykonujemy komende

task       

Wyswietli nam sie kilka kolumn ... Jedyna ktora nas na razie interesuje (znaczenie innych pozostawiam do odkrycia czytelnikowi <-) ) ... to kolumna PIERWSZA (pod naglowkiem TaskName)... widzimy tu kolumne z roznymi nazwami ... jesli sie im blizej przypatrzysz to pewnie wydadza Ci sie znajome <-) ... Tak, masz racje ... Te nazwy oznaczaja PROCESY (Programy) ktore sa akurat uruchomione (sa w pamieci) ... hmmm ... co my mozemy z tym zrobic ??? ... Okay ... juz mowie ... Teraz musisz odszukac nazwe programu (w tej kolumnie) ktory akurat masz zamiar zlamac ! ... np. takie nazwy :

Powbar   --> PowerBar 
Getright --> GetRight
Rpmodem  --> Rejestrator polaczen
Connectp --> ConnectPal proffesional 
...          ...

Eh ... napewno znajdziesz nazwe swojego programu <-) ... Poza tym to te programy po komendzie <task> ulozone sa tak ze pierwszy w kolumnie jest zarazem ostatnim ktory uruchomiles w swoim W95/98 ... czyli jesli program ktory chcesz akurat zlamac uruchomiles bezposrednio przed komenda <task> to NAPEWNO jest on pierwszy na liscie !!! Dobra ... znalazles juz nazwe swojego programu ... teraz znajac ja wpisujesz komende :

hwnd i_tutaj_nazwa_tego_programu
np.
hwnd powbar
hwnd rpmodem 
...  ...

(((Wprawdzie mozna wykonac ta komende bez nazwy programu i nie musimy jej znac (ale jednak lepiej znac ta nazwe i uzyc komendy HWND na nazwie jakiegos konkretnego programu) ... czyli dajemy sama komende <hwnd> ... tylko teraz wyswietli nam sie spis wszystkich okien jakie sa obecne akurat w systemie !!! Przy czym "wlasciciel" poszczegolnego okna jest w kolumnie czwartej pod naglowkiem "QOwner" ... spis okien jest tak ulozony ze ... hmmm ... dokladnie nie wiem <-) moze wedlug priorytetu albo czegos ... w kazdym razie nie wedlug kolejnosci uruchomien ... jesli nie rozumiesz tego kawalka od poczatku nawiasu to przeczytaj jeszcze raz ten kawalek po przeczytaniu calego dzialu ... gdyz dodalem go na ostatku ... dalej czytaj tak jakby tego nie bylo <-) ... ))) Znowu pojawi sie kilka kolumn ... i znowu interesuje nas tylko PIERWSZA (pod naglowkiem Window Handle) (no moze tez PIATA - pod naglowkiem Class Name) ... i znowu reszte pozostawiam czytelnikowi <-) ... hmmm ... co to jest ??? ... hmmm ... HWND (Handle WiNDow) jest to jakby identyfikator okna ... taki wskaznik ... ten wskaznik jest przedstawiony w postaci liczyby 4-cyfrowej (hexadecymalnej) ktora widzimy w pierwszej kolumnie !!! ... natomiast piata kolumna to nazwa klasy do ktorej nalezy dane okno ... eh ... nie musisz tego (NARAZIE) rozumiec ... (Jak troche popraktykujesz to zrozumiesz <-) ) ... Nazwa tej klasy sugeruje nam ktorego okna dotyczy dany HWND ! ... kurde ... lepiej to zobaczymy na przykladzie ... hmmm ... akurat mam pod reka starego dobrego WordPad-a <-) co bede daleko szukal <-) ... juz szukam jakiegos okna ... ... ... Okay ... wchodzimy do Pomoc/WordPad-informacje ... ukazuje nam sie okienko z jakimis tam informacjami i przyciskiem OK ... majac wlaczone to okno wchodzimy do S-ice'a i dajemy komende :

hwnd wordpad

(bo akurat taka nazwe ma ten program) ... ukazuje nam sie lista okien nalezacych do WordPad-a !!! (no wiesz te kolumny <-) ) ... oto ta lista :

         Window Handle   ...   Class Name
          08A8(1)        ...   #32770 (Dialog)
           0BB8(2)       ...   Static
           08B8(2)       ...   Static
           08BC(2)       ...   Static
           08C0(2)       ...   Static
           08C4(2)       ...   Static 
           08E8(2)       ...   Static
           08AC(2)       ...   Static
           08B4(2)       ...   Static
           08C8(2)       ...   Static
           08A4(2)       ...   Static
           0B9C(2)       ...   Static
           0C88(2)       ...   Static
           0C90(2)       ...   Static
           0C30(2)       ...   Button
          02E8(1)        ...   tooltips_class32
          ...            ...   ...

hmmm ... okay ... numery (HWND) z pierwszej kolumny prawie NA PEWNO sie u Ciebie roznia gdyz sa bardzo "dynamiczne" tzn. ze jesli zamkniesz okno i je na nowo otworzysz to HWND bedzie calkiem inny !!! ... W95/98 przydziela ten HWND kazdemu oknu ktore powstaje ... Wszystkie powyzsze HWND sa identyfikatorami okien ktore sa "wlsnoscia" programu WordPad ... tzn. ze tak sobie zaprogramowal programista ... i kazde okno w programie WordPad ma swoje HWND !!! ... Dobra ... przechodzimy dalej ... widzisz te numerki w nawiasie kolo kazdego z HWND ??? ... okay ... to sa oznaczenia ktore S-ice daje nam dla wygody ... oznaczaja one stopien zagniezdzenia okien ! ... tzn. wszystkie okna tworza jakby drzewo ... no takie drzewo jak masz w tym swoim Exploratorze (FAR rules <-) ) ... to oznacza ze : istnieje jedno glowne okno programu a od niego "odchodza" inne ... i tworzy sie hierarchia ... zmierzam do tego ze wszystkie HWND "dwojki" (dwojki w nawiasie) sa czescia poprzedzajacego je HWND (okna) "jedynki" (Class Name - #32770) ... Ostatni HWND (02E8(1)) na liscie nas nie interesuje (gdyz nie jest czescia pierwszego HWND "jednyki" lecz jest jakims osobnym oknem) ... Teraz wyjdz na chwile z S-ice'a i zerknij na to okienko co otworzyles w WordPadzie i jeszcze raz na powyzej przytoczone kolumny ! ... byc moze zauwazyles byc moze nie ... ale ... To okno w WordPad reprezentuje pierwszy HWND na liscie i wszystkie odchodzace od niego czesci (wszystkie "dwojki") ! ... po czym to poznac ??? ... po Class Name !!! ... mozna sie latwo domyslic patrzac na ta strukture i na okno w WordPad e : jak widac okno sklada sie z jakichs tam (statycznych) czesci czyli textow, jakiejs ikonki ... itp. ... ORAZ z przycisku OK !!! a w powyzszej strukturze wyraznie widac ze HWND 0C30(2) odnosi sie do przycisku (button) !!! Przy odrobinie inteligencji ZAWSZE rozpoznasz ta wlasciwa strukture swojego okna !!! Dobra ... powiesz ze wiesz juz co to HWND, jak wyglada struktura okien, nazwe programu (identyfikator), jaki HWND maja poszczegolne czesci okna ... itp. itd. ... ale ... co to ma wspolnego z Crackingiem (Reversingiem) ????? ... uh ... juz wyjasniam ... Do pelnego wykonania zadania potrzebna nam jeszcze jedna komenda <BMsg> !!! Oto jej postac :

bmsg hwnd wm_xxx (wm_xxx...)

Gdzie "hwnd" to znany nam juz identyfikator okna (lub jego elementu) ... Natomiast wm_xxx to operacja ktora zostanie (lub nie) wykonana na oknie (lub jego elemencie) ... co prawda jest tez tam drugi wm_xxx (w nawiasie) i jakos to mozna wykorzystac ... ale ja z tego nie kozystalem ... moze kiedys sie naucze <-) ... zamiast xxx musisz podstawic nazwe komendy ktora Ci odpowiada ... te komendy sa spisane w "API reference" (No wiesz ... w kazdym kompilatorze 32-bit jest taki .HLP) ... musisz dokladnie przeczytac ktora robi co ... po prostu wyszukaj w tym "API reference" w indexie wszystko co zaczyna sie na "wm_" i przeczytaj jak najwiecej (in english of course <-) ) ... Chociaz ja uzywam tylko trzech ktore zaraz przytocze, ALE dobrze bedzie jak poznasz wszystkie ! ... ja dlatego innych nie uzywam ze za bardzo ich nie znam <-(( ... jak bede mial wolny czas to doczytam <-) ... Okay ... trzy komendy ktore powinienes poznac to :

wm_move  
wm_destroy
wm_command 

(((Jeszcze moze byc WM_GETTEXT ktora uzywamy przy znanych nam dobrze oknach dialogowych ... no wiesz tam gdzie wpisujesz dane rejestracyjne jednak raczej z tego NIE korzystam ... powyzsze trzy sa bardziej "uniwersalne" <-) ... a poza tym jest HMEMCPY <-) ))) ... Pierwsza z nich dotyczy poruszania oknem ! ... tzn. ze jesli poruszysz oknem (normalnie wjedz myszka na pasek i poruszaj <-) ) to W95/98 jakos wywoluje ta procedure (nie znam szczegolow bo nie jestem wybitnym programista <-) ) ... Dla NAS wazny jest tylko ten fakt ze WYWOLUJE ... Druga z procedur jest wywolywana przy zamykaniu jakiegos okna ! ... natomiast trzecia przy jakiejs "akcji" (chyba) ... np. glownie o to chodzi ze przy kliknieciu na jakis przycisk ta procedura jest wywolywana ! ... dwie pierwsze raczej uzywamy na HWND okna ... natomiast trzecia na HWND jakiegos okna LUB przycisku ! ... heh ... dalej nie rozumiesz co to moze nam dac ??? ... hmmm ... najpierw przetestujmy jak dzialaja te procedury z pomoca WordPad-a ... przypuszczam ze znasz HWND okna (#32770 (Dialog)) oraz HWND przycisku (button) ! Sprobojmy najpierw WM_MOVE ... czyli majac wlaczone okno Pomoc/WordPad-informacje w WordPadzie wchodzimy do S-ice'a i oczywiscie najpierw szukamy HWND do tego okna ! (i od razu do przycisku) ... nastepnie wykonujemy komende :

          bmsg 8a8 wm_move
          |      |     |
          |      |     |
       Komenda  HWnd  Procedura

Przyjalem ze okno ma HWND takie jak w przytoczonej na poczatku tabeli, oczywiscie prawie NA PEWNO u Ciebie bedzie inny !!! ... okay ... teraz gdy juz wykonalismy ta komende wychodzimy z S-ice'a ... Co teraz ??? ... Nic sie nie dzieje ??? ... heh ... Jesli uwazales to wiesz ze procedura wm_move jest wywolywana przy poruszeniu oknem ... wiec nim PORUSZAJ !!! ... No ... Jestesmy juz znowu w ukochanym S-ice <-) ... hmmm ... i co z tego, powiesz ??? ... Czesto dzieki temu wm_move mozemy dostac sie do czesci kodu glownego programu w ktorym zostala wyswietlona informacja/NAGscreen/jakiekolwiek_okno !!! ... chyba juz domyslasz sie co to znaczy !? i jak mozemy to wykorzystac !?!?!? eh ... dla tych co nie wiedza : prawdopodobnie wyladujemy w tym glownym programie zaraz za jakims CALL-em ktory spowodowal wyswietlenie jakiegos okna - przy czym oczywiscie nas nie interesuje jakies okno pomocy w WordPadzie tylko ... no wlasnie co ? ... kurde ... zadajesz zbyt duzo pytan <-) ... no dobra ... interesuja nas takie okna jak :

1)Po wprowadzeniu kodu program pokazuje OKNO ze jest on zly

2)Przy uruchamianiu programu wyswietla jakies paskudne okienko z przypomnieniem o koniecznosci rejestracji (NAGscreen) ... albo co gorsza program pokazuje to okienko z licznikiem (odliczanie czasu po ktorym mozesz zamknac okno) ... ufff ... tego NIENAWIDZE !!! ... tak marnowac czas czlowieka <-(( ... 3)Informacja ze skonczyly sie 30 dni pracy programu ... itp.

4)Informacja o bledzie w pracy programu ... np. zmienimy jakas instrukcje w HIEW-ie i program zaczyna "narzekac" ...

5)itp. itd ...

Dobra ... wracamy do WordPad-a (nie placz ze tu nie ma zadnego z przytoczonych punktow ... to tylko jako przyklad <-) ... bo pewnie kazdy ma ten program na swoim W95/98) ... A wiec S-ice przerwal wykonywanie WordPad-a na tym wm_move ... widzimy jednak ze nie jestesmy w kodzie glownego programu - zobacz na linie oddzielajaca okno komend od okna danych, pisze tam KERNEL.alloc co znaczy ze jestesmy gdzies na zewnatrz glownego kodu (w DLL-u (KERNEL32.DLL)) - jednak zobacz jeszcze na dolny prawy rog ... pisze tam "Wordpad" ... co oznacza ze jestesmy w jakims API ktory program wywolal !!! ale nadal w programie (tylko nie w glownym kodzie) !!! ... My CHCEMY sie dostac do glownego kodu, gdyz sledzenie jakis standardowych DLL-ow NIC nam nie da !!! ... a wiec naciskamy F12 ... jeszcze raz ... i jeszcze ... jeszcze ... jeszcze ... itd. ... jednak w koncu wyjdziemy z S-ice nie dochodzac do glownego kodu ... co jest grane ??? ... heh ... widocznie WordPad nie ma wlasnej procedury ktora obsluguje to poruszanie okna ... Jak sie pozniej przekonamy obsluga tego poruszania jest WEWNATRZ funkcji API i ta API nie musi sie odwolywac do kodu programu gdyz sama "wie" kiedy i jak przesunac okno !!! ... tak wiec raczej dajmy sobie spokoj z ta procedura i przejdzmy do nastepnej, ale UWAGA ! w innych programach na ktorych nam zalezy (bo chcemy zlamac) ta procedura moze z POWODZENIEM dzialac !!! ... na WIELU programach to stosowalem i na WIELU z nich zastosowanie tej procedury konczylo sie SUKCESEM !!! eh ... No wiec wchodzimy jeszcze raz do S-ice'a i kasujemy poprzedni breakpoint :

bc 0

Nie dajemy komendy <bd 0> bo raczej nie bedzie nam juz potrzebny ten breakpoint ... I poniewaz ta procedura nie zlikwidowala okna (jak wm_destroy i wm_command (raczej tez) by zrobilo) HWND sie NIE zmienil !!! ... Wiec zabierzemy sie za procedure ... (entliczek, pentliczek ... <-) ) ... moze WM_COMMAND ... wiec powiedzialem ze czasami wm_command odnosi sie albo do okna albo do przyciskow ! ... jesli sprobojemy komende :

bmsg c30 wm_command 

Wiadomo ze c30 to HWND przycisku (nie calego okna !!!) ... jesli teraz po tej komendzie wyjdziemy z S-ice i klikniemy przycisk OK to S-ice sie NIE pojawi a okno po prostu zniknie !!! ... hmmm ... wiec sprobojmy zalozyc ta komende na calym oknie ! ... ALE uwaga ! jesli sprobowales to wm_command na przycisku i jak wiadomo to NIE zadzialalo (bo S-ice sie nie pojawil) to okno ZNIKLO ! ... i jesli ponownie otworzyles to okno to jego HWND sie ZMIENILO !!! ... musisz na nowo je odkryc !!! (chyba wiesz jak ? <-) ) ... okay ... ja przyjmuje taki sam HWND (dla wygody) choc wiadomo ze u Ciebie jest INNY ! ... komenda na calym oknie to :

bmsg 8a8 wm_command

I teraz wyjdz z S-ice'a i kliknij OK ... no ... jestesmy w S-ice ... teraz normalne jest ze chcemy dostac sie do kodu programu ... krotkie zerkniecie na linie oddzielajaca okno komend od okna danych (od teraz bede ja nazywal "Linia com/dat" <-) ) ... i widzimy znajome KERNEL.alloc ... co informuje nas ze jestesmy w DLL-u ... a wiec wydostanmy sie z tego ! ... klikamy F12 ... i klikamy ... klikamy ... klikamy ... po drodze napotykamy MFC42 (Microsoft Fundation Class (?)) ...

USER ... SHELL32 ... KERNEL32 ... (to chyba wszystko) ... ponaciskamy sobie to F12 dobre KILKADZIESIAT (!!!) razy ... zanim ... dojdziemy do tego co nas interesuje ! ... wiec naciskamy to F12 dotad az w linijce com/dat wystapi cos podobnego do tego :

WORDPAD!.text+00010274

((((zupelnie poza tematem powiem ze mozemy tak rozpoznac czy program jest spakowany/skompresowany czyms ... wtedy zamiast tego "text" moze pisac np. "shrink0" albo "WWPack" (oczywiscie wszystko mowiace nazwy - zobacz "zmienianie plikow na stale" i wszystko bedzie jasne <-) )))) ...

A wiec doszlismy do glownego kodu programu !!! ... hmmm ... co my tu mamy ? ... Wiemy ze F12 powoduje powrot z funkcji ... widzimy takze ze pierwsza instrukcja ponad instrukcja na ktorej jestesmy to CALL !!! ... a wiec wszystko prawidlowo ... tylko ... ten CALL to nie zwykly CALL lecz API-CALL <-) ...

Postac CALL-a :

CALL   [SHELL32!ShellAboutA]

mhmmm ... Co nam to mowi ?! ... heh ... to znaczy ze cale okno jest wyswietlane (i obslugiwane) za pomoca tej jednej procedury !!! ... I np. dlatego NIE moglismy dojsc do kodu programu przy pomocy wm_move gdyz obsluga tego poruszania zajmowala sie funkcja API - ShellAboutA znajdujaca sie w DLL-u SHELL32.DLL ... i nie bylo potrzeby aby programista sie tym w jaki kolwiek sposob przejmowal <-) (lenistwo-komercjalizacja) ... Okay ... teraz WIEMY co jest odpowiedzialne za wyswietlenie (i obsluge) tego naszego OKNA ... eh ... powiedzmy ze NIE podoba nam sie to okno ! ... yeak ! ... uh ! ... fuj ! ... i go tam nie chcemy ... chcemy aby po kliknieciu na Pomoc/WordPad-informacje NIC sie NIE pojawilo !!! ... eh ... byloby COOL <-) ! ... przy pomocy powyzszej techniki : NIC PROSTSZEGO !!! ... pewnie sie domyslasz co zrobic, nie ? ... Okay ... wystarczy ze zastapisz calego tego CALL-a ... NOP-ami !!! ... (Jesli nie wiesz jak to przeczytaj nastepny punkt o zmienianiu na stale plikow !) I to okienko nie bedzie sie NIGDY wiecej pokazywalo <-) ... czujesz juz potege tej techniki ? <-) ... Jeszcze na koniec sprobojemy WM_DESTROY bo jest to (chyba) najlepsza (?) z wymienionych wczesniej <-) ... oczywiscie chyba jeszcze nie wyNOP-owales tego CALL-a ??? <-) ... no wiec otwieramy znowu znane okno z WordPad-a ... wchodzimy do S-ice i poniewaz znowu okno zniknelo wiec przy ponownym otwarciu zmienil sie jego HWND !!! ... szukamy jak zwykle jego HWND ... Okay, mamy ... oczywiscie ja przyjme stary HWND z przytoczonej na poczatku tabeli ... teraz znana komenda :

bmsg 8a8 wm_destroy

Oczywiscie nie na HWND przycisku tylko OKNA ... Jak wiemy wm_destroy jest wywolywane (jak sama nazwa mowi) kiedy okno znika czyli kiedy je wylaczamy (niszczymy) ... wiec wychodzimy z S-ice'a i wylaczamy okno - czy to przez klikniecie na OK czy tradycyjne klikniecie na krzyzyk <-) ... Oczywiscie jestesmy w S-ice (jak by moglo byc innaczej <-) ) ... i znowu oczywiscie chcemy sie dostac do kodu programu ... postepujemy tak jak w przypadku wm_command (czyli F12, F12, F12 ... itd.) ... na szczescie tutaj nie bedziesz musial naciskac dlugo ... juz po kilku(nastu) razach jestesmy w glownym programie (Linia com/dat - WORDPAD!.text...) ... No i wyladowalismy w tym samym miejscu co przy wm_command ... a wiec te dwie procedury doprowadza nas do tego samego ... czyli z naszego punktu widzenia sa jednakowo uzyteczne ze wskazaniem na wm_destroy gdyz SZYBCIEJ dojdziemy do glownego kodu programu !!! ... Okay ... Powyzszej techniki mozemy uzyc na REALNYCH celach ... wtedy gdy dostaniemy sie do glownego kodu programu prawdopodobnie wyszlismy wlasnie z jakiegos CALL-a ktory jest odpowiedzialny za wyswietlenie jakiegos OKNA ... wiec wtedy trzeba poszukac jakiegos skoku (JZ,JNE ... itp.) przed tym CALL-em ale takiego skoku ktory "skacze" ZA ten CALL !!! ... (chyba wiadomo dlaczego) ... wtedy prawdopodobnie znajdziemy w poblizu tego skoku procedure (CALL) sprawdzajaca SERIAL albo czy wersja (NIE)Zarejestrowana albo cokolwiek ... wtedy juz bedzie latwo dobrac sie do tego zabezpieczenia <-) ... teraz MUSISZ juz widziec potege tej techniki <-) ... MOWIE POWAZNIE ! ... radze Ci te technike DOBRZE opanowac !!! ... gdyz jest ona NIE ZASTAPIONA ! ... Jesli teraz nic z tego nie zrozumiales to zrob sobie przerwe ... idz na pivo ... do kina z dziewczyna ... jesli jestes mnichem to pomedytowac <-) ... i przeczytaj jeszcze raz (101 RAZY !!!) ... az to zrozumiesz i bedziesz umial wykorzystac ... pamietaj ! ... to jest bardzo wazne ! ... popraktykuj z WordPad-em i potem z jakims komercyjnym gownem ... PRAKTYKUJ ! ... THE END <-) ! ...


CO DALEJ ... ?!?!?! :

Hmmm ... powyzej opisalem jak sie mozna dostac do kodu zabezpieczenia ...ale co zrobic dalej ??? ... hmmm ... troche juz powinienes wiedziec po przeczytaniu textow wczesniejszych <-) ... eh ... no ale dobra przeor klasztoru reverserow wam podpowie <-) ... hmmm ... np. w poprzednich textach opisywalem CrackMEs ktore uzywaly standardowej funkcji API GetDlgItemTextA i podawalem ze znajdujemy nasz SERIAL w pamieci przez sprawdzenie adresu zawartego w argumencie PUSH-a ktory natomiast znajdowal sie przed wywolaniem funkcji GetDlgItemTextA (oczywiscie wiemy ze jako jej argument <-) ) ... jednak nie jest to metoda ktora jest zawsze odpowiednia ... argument moze byc rejestrem np. EAX przy czym GetDlgItemTextA modyfikuje ten rejestr i juz po wykonaniu procedury GetDlgItemTextA komenda <d eax> NIC nam nie da ! co prawda mozemy uzyc rejestru stosu ESP do tego celu (np. Zobacz na dolaczony WINICE.DAT na makro dotyczace GetDlgItemTextA i GetWindowTextA i zwroc uwage ze gdy je uruchomie to S-ice przerwie na wywolaniu tcyh funkcji AUTOMATYCZNIE pokazujac w oknie danych NAME/SERIAL - to BARDZO ulatwia zycie - lepiej to przeanalizuj !) Jednak ja nie robie tak jak podalem w poprzednich textach (no ... kiedys tak robilem <-) ) ... ZAWSZE wykonuj komende :

s ds:0 l ffffffff "twoj_SERIAL"

Komenda ta powoduje przeszukanie okreslonego obszaru pamieci w poszukiwaniu twojego SERIALA ... skladnia komendy to : <s> to komenda <ds:0> to adres poczatkowy (ds to Data Segment ... czyli rejestr segmentowy danych ... wsakazuje na aktualny segment w pamieci gdzie przechowywane sa dane !!!) przeszukiwania pamieci <l> trzeba dac ale nie ma (?) to celu ... <ffffffff> jest to adres koncowy przeszukiwania pamieci ... <"twoj_SERIAL"> wiadomo - string jaki chcesz znalezc w pamieci ... Okay ... wykonales ta komende i S-ice znalazl twoj SERIAL w pierwszym miejscu - wyswietlil twoj SERIAL w oknie danych !!! ... teraz spisujesz adres pod jakim jest ten SERIAL w oknie danych (bez segmentu - to (zazwyczaj) nie potrzebne) ... i aby znalezc nastepne miejsce w pamieci z twoim SERIALEM wykonujesz komende :

s    

ta ... bez zadnych argumentow ... S-ice znalazl (lub nie) nastepne miejsce wystepowania ... i znowu spisujesz ... ale musisz wiedziec ze : Zazwyczaj tylko kilka (lub jeden albo zero) "najnizszych" adresow ktore wskazuja na miejsce w pamieci z twoim SERIALEM sa tymi ktore nas interesuja i zazwyczaj zaczynaja sie one od cyfry "0" ... czyli np. adres 01234567 jest ciekawy ... i czesto ten adres jest jeszcze nizszy np. 00123456 albo 00012345 ... natomiast jesli S-ice napotka twoj SERIAL w wyzszym adresie to on nas NIE interesuje ... tzn. glownie chodzi o DWA adresy : adres zaczynajacy sie od cyfry "8" np. 80123456 ... wszystkie adresy zaczynajace sie od tego "8" okreslaja pamiec EKRANU (video) ... drugi adres to adres zaczynajacy sie od cyfry "C" np. C0123456 i te adresy okreslaja pamiec S-ice'a (w koncu S-ice tez musi gdzies trzymac dane <-) ) ... Teraz tak ... przypuszczam ze spisales wszystkie miejsca w pamieci zaczynajacej sie od adresu 0xxxxxxx (zazwyczaj) ... ALE ... prawdopodobnie wystapilo raczej tylko jedno takie miejsce (oczywiscie jesli wykonales ta komende bezposrednio po przerwaniu S-ice'a na funkcji GetDlgItemTextA - bo jesli to zrobiles "gleboko" w kodzie programu to moze byc caly SZEREG takich miejsc !!!) ... hmmm ... w zasadzie to nie musisz spisywac tych adresow (adresu) bo od razu mozemy zastawic na nich breakpointy ! ... Chyba wiesz jak to zrobic, prawda ? ... <-) ... no wiesz komenda <bpm> ... tylko teraz jesli ustawisz breakpoint komenda <bpm> to S-ice automatycznie zamienia komende <bpm> na <bpmb> co oznacza (breakpoint on memory - byte) ze S-ice przerwie na odczycie/zapisie danych pod adres okreslony argumentem komendy <bpm> ALE tylko na JEDNYM BAJCIE !!! ... chyba wiesz co to oznacza ? ... <-) ... huh ? znowu nie ? <-) ... ajajaj ... no dobra niech Ci bedzie ... wyjasnie ... przypuscmy ze mamy SERIAL "1234567890" czyli 10-cyfrowy i jest zapisany pod adresem "0009A3FE" czyli wiadomo ze zajmuje 10 bajtow ... ustawiamy breakpoint na tym adresie

bpm 9a3fe

oczywiscie S-ice zamienia to na <BPMB> i pozwalamy programowi sie dalej wykonywac (wychodzimy z S-ice) ... i ... nic ... program nie przerwal ... hmmm ... dlaczego ? ... przeciez musi pobrac dane z tamtego adresu ! ... musi odczytac nasz SERIAL ! ... Oczywiscie ze MUSI ! ... wiec co ? ... hmmm ... program mogl zrobic np. cos takiego : odczytac 5-ty bajt w naszym SERIAL-u i porownac go z jakas stala !!! i na podstawie TYLKO tego osadzic czy dobry/zly SERIAL !!! ... Chyba sie juz wiesz dlaczego S-ice NIE przerwal !? ... no to dobrze ... ale jak temu zaradzic ??? ... czy musimy ustawiac <bpm> na kazdym znaku w SERIAL-u ??? ... oczywiscie NIE ... S-ice przychodzi z pomoca i latwo mozemy temu zaradzic ... najpierw gorsze rozwiazanie : mozemy zastosowac zamiast komendy <bpm> (bpmb) komende <bpmw> (word) albo <bpmd> (doubleWord) chyba nie musze tlumaczyc co to zrobi (odpowiedz sie sama nasuwa <-) ) ... ALE ja nie uzywam powyzszej metody (bo widac oczywiste ograniczenia) ... Zamiast niej robie cos takiego : uzywam komendy <bpr> np. :

bpr 9a3fe 9a3fe+a rw

hmmm ... co to oznacza ? ... otoz komenda <bpr> (breakpoint on memory range) robi to samo co komenda <bpm> z tym ze OKRESLAMY obszar na ktorym ten breakpoint ma dzialac ! ... skladnia tej komendy to oczywiscie : <bpr> - komenda, <9a3fe> - poczatkowy adres, <9a3fe+a> to koncowy adres <rw> (ReadWrite) to opcja ktora nakazuje S-ice'owi przerwanie i na ODCZYCIE danych z danego miejsca w pamieci jak i ZAPISIE do tego miejsca (jesli bysmy NIE dali tej opcji - standardowo bylaby tylko opcja <w>) ... Jeszcze wyjasnienie dlaczego ten koncowy adres to <9a3fe+a> ? ... poniewaz jak wiemy adres poczatku naszego SERIALA w pamieci to "9a3fe" SERIAL ma 10 znakow ... przy czym to "10" to jest decymalnie natomiast hexadecymalnie to wiadomo ze "0A" !!! ... czyli jesli chcemy ustawic breakpoint na odczycie/zapisie KAZDEGO bajtu z naszego SERIALA to musimy podaj jego poczatkowy i koncowy adres w pamieci !!! ... ufff ... chyba jasne, nie ? ... <-) ... czyli podsumowujac komenda <bpm> mozemy ustawic breakpoint odczytu/zapisu danych TYLKO na JEDNYM bajcie w pamieci (bpmw - na odczycie slowa (dwoch bajtow) i bpmd - na odczycie podwojnego slowa (czterech bajtow)) ... natomiast komenda <bpr> na odczycie/zapisie DOWOLNIE duzego obszaru pamieci !!! ... ech ... jeszcze tego nie widzisz ? ... jeszcze ostatnia proba zoobrazowania tego <-) :

        BPM:             BPR:
         __               __
        |31| <----P----> |31|   :0009A3FE
         --       R      |--|   :0009A3FF
         32  <----O----> |32|   :0009A400
         33       G      |33|   :0009A401
         34       R      |34|   :0009A402
         35  <----A----> |35|   :0009A403
         36       M      |36|   :0009A404
         37       |      |37|   :0009A405
         38       |      |38|   :0009A406
         39       |      |39|   :0009A407
         30  <----|----> |30|   :0009A408 => (0009A3FE+0A)     
                          --

Rysunek symbolizuje BPMB VS BPR ! <-) ...

Jak zauwazyles pewnie ciag "31 32 33 34 35 36 37 38 39 30" to nasz SERIAL (1234567890) w postaci hexadecymalnej ... i tutaj widac czym roznia sie obie komendy ... miedzy kolumnami BPM i BPR jest nazwa "PROGRAM----" ktora symbolizuje program ktory lamiemy (a cozby innego <-) ) ... od niego odchodza strzalki ktore symbolizuja poszczegolne dostepy programu do komorek pamieci zawierajacych nasz SERIAL ... i teraz, jesli dana komorka jest zakreslona to S-ice przerwie na odczycie/zapisie do niej !!! ... a widzimy ze przy BPM zakreslona jest TYLKO 1 komorka podczas gdy przy BPR zakreslone sa WSZYSTKIE !!! ... eh ... kurde ... nie wiem po co rysowalem ten rysunek, przeciez to jest bardzo proste ... w kazdym razie juz pewnie rozumiesz jaka jest roznica pomiedzy komenda <bpm> i <bpr> ... tylko teraz ktora lepiej stosowac ??? ... hmmm ... to zalezy ... przy BPM w zwiazku z tym ze S-ice przerwie na odczycie/ zapisie TYLKO jednej komorki mozemy kilku rzeczy NIE zauwazyc, ale za to S-ice nie musi przerywac w WIELU miejscach o ktorych wiemy co robia ! ... Natomiast przy BPR S-ice przerwie na odczycie/zapisie WSZYSTKICH (oczywiscie jesli tak sobie zazyczy cracker/reverser, bo mozna okreslic dowolny "zasieg" tej komendy !!!) komorek z SERIALA (czy czegokolwiek) i w zwiazku z tym mozemy miec lepszy wglad na to co sie dzieje wokol nas ! ... np. jesli widzimy ze S-ice przrwal 10 (tyle znakow ma nasz SERIAL) razy na jakims okreslonym miejscu kodu to mozemy wnioskowac ze program "przerobil" kazdy znak z naszego SERIALA i cos z nim zrobil ! ... ale za to, przy BPR mozemy sie niezle nameczyc naciskajac F5 tu i tam, poniewaz np. jesli program stosuje procedure zamiany kazdego znaku z twojego SRIALA na duza litere to przy BPR S-ice przerwie wewnatrz procedury zamiany przy zamianie KAZDEGO znaku ! ... a przy BPM przerwalby tylko raz, zorientowal bys sie co robi ta procedura i juz S-ice by na niej NIE przerwal ... hmmm ... wiec jaki wybor ? ... hmmm ... ja robie tak : najpierw BPM jesli to nie wystarczy do zorientowania sie o co biega to robie BPR i to wydaje mi sie jest najlepsze rozwiazanie <-)... ... No i w zasadzie to jest standardowe podejscie do zabezpieczen typu SERIAL ! ... po tym jak S-ice przerwie na BPM czy BPR juz powinienes wiedziec co robic - po prostu ANALIZOWAC ! <-) ... acha ! ... i CZESTO podczas sledzenia kodu wykonuj komende <s 0 l ffffffff "twoj_SERIAL"> bo mozliwe ze nie zauwazyles a program skopiowal twoj SERIAL w jakies inne miejsce w pamieci !!! ...

END...

JAK ZMIENIAC NA STALE PLIKI :

Wiadomo ze jezeli zamieniesz jakas instrukcje w S-ice na inna to to nie powoduje zmian w pliku programu tylko w pamieci (RAM) ... i jezeli na nowo uruchomimy program to wprowadzone przez nas dane NIE istnieja !!! Dlatego jesli chcemy zmienic jakas instrukcje na stale to musimy dokonac modyfikacji na okreslonym pliku programu ... !!! hehe ... prawdopodobnie juz wiesz jak to zrobic bo kazdy poczatkujacy cracker/reverser woli znalezc ten "odpowiedni" skok i zwykle go "przestawic" z wlasnym upodobaniem niz zmudnie odkodowywac proces kodowania SERIALA ... no moze nie reverser <-) ... ale cracker raczej na pewno <-) ... heh ... Mimo ze z pewnoscia 80-90% czytelnikow juz wie jak to zrobic to pokaze tym mniej "ambitnym" <-) zeby nie zalewali mnie tonami poczty jak to zrobic ... A wiec tak dla przykladu wrocimy jeszcze do CrackMe 1.0 ... Przyjmuje ze przeczytales moj text nr. 2 ... tam jest opisane cale zabezpieczenie i jesli czegos nie rozumiesz to tam przeczytaj <-) ... Do naszego zadania wystarczy przytoczyc koncowy fragment zabezpieczenia :

         58             POP   EAX
         3BC3           CMP   EAX,EBX
         7407           JZ    0040124C (x) <---|
         E818010000     CALL  00401362         |
         EB9A           JMP   004011E6         |
         E8FC000000     CALL  0040134D <-------|

Wyjasninie tych linijek macie w text #2 ... teraz to co musimy wiedziec to ze jesli skok (x) nastapi to jestesmy zarejestrowani natomiast jesli nie to jestesmy nie-zarejestrowani ... proste i logiczne <-) ... heh ... w tym programie akurat BARDZO latwo jest odkodowac prawidlowy SERIAL wiec tutaj nie maja sensu patch-e ... PAMIETAJCIE : PATCHE (czyli zmiany w pliku) wykonujemy TYLKO w tedy gdy NIE ma INNEGO wyjscia !!! ... w zabezpieczeniach typu SERIAL robimy to tylko w 1% przypadkow !!!, bo w 99% przypadkow MOZEMY odkodowac SERIAL chociaz mielibysmy sie meczyc pare miesiecy <-) ... jesli pojdziesz na latwizne i zrobisz zwyklego patcha to NIE jestes prawdziwym reverser-em tylko co najwyzej crackerem !!! <-) ... Dobra, wracamy do kodu ... Pomysl teraz co mozesz zrobic aby program "myslal" ze jest zarejestrowany ??? ... No, teraz to juz wszystko zalezy od twojej fantazji ... jest wiele metod zlamania (zpatchowania) tego programu ... musimy jednak zwrocic uwage na to ze kazda instrukcja ASM zajmuje w pamieci iles tam BAJTOW ... Jesli chcemy zastapic ja jakas inna to musi ona miec DOKLADNIE TA SAMA ilosc bajtow !!! ... natomiast jesli chcemy zastapic ta instrukcje KILKOMA innymi instrukcjami to SUMA ich bajtow MUSI byc taka sama jak ilosc bajtow zastepowanej instrukcji np.

3BC3        CMP EAX,EBX    (ta instrukcja ma 2 bajty) 
                 =   
         90          NOP            (ta instrukcja ma 1 bajt) 
         90          NOP            (ta instrukcja ma 1 bajt)

Jak widzimy, 2-bajtowa instrukcje CMP EAX,EBX mozemy zastapic dwoma pojedynczymi instrukcjami 1-bajtowymi !!! inny przyklad to np.

         E818010000  CALL  00401362 
                 =
         90          NOP
         90          NOP
         90          NOP
         90          NOP
         90          NOP
                 =
         83E201      AND   EDX,01
         90          NOP
         90          NOP

Chyba juz teraz wszystko jasne ? ... chyba wiadomo ze liczba hexadecymalna skladajaca sie z dwoch cyfr czyli 00-FF to BAJT ? ... eh ... jesli nie to konicznie musisz sie wziasc za ASM !!! ... Musze tu polecic dla wszystkich znajacych English WSPANIALY tutorial ASM : "ART OF ASSEMBLY LANGUAGE" ... Nic tylko przylepic mu etykiete "A MUST READ" <-) !!! ... Okay ... Jesli DALEJ mi nie wierzysz ze NIE MOZNA zmienic jednej instrukji w programie na inna ktora ma wieksza/mniejsza liczbe bajtow to zrob cos takiego (UWAGA ! ... nie ponosze odpowiedzialnosci jesli zrobisz sobie tym krzywde !!!) : wejdz teraz do S-ice'a (Ctrl+D) i po prostu wpisz komende <a> (btw: jest to BARDZO pomocna komenda - jesli wie sie jak ja uzywac <-) ) ... powoduje ona zastapienie aktualnej instrukcji (tej na ktorej masz pasek w oknie kodu) jakas inna ... Po komendzie <a> wpisz dowolna komende w ASM np. "mov eax,ebx" albo "nop" (sprawdz czy ma napewno inna ilosc bajtow niz ta ktora chcesz zastapic) teraz nacisnij enter i (Jeszcze raz mowie : NIE ponosze odpowiedzialnosci !!!) wyjdz z S-ice (F5) ... Oczywiscie Win sie totalnie zawiesil !!! ... ale moze tez to spowodowac inne rzeczy ... nie wiem jakie ale tak na wszelki wypadek mowie <-) ... No chyba teraz juz mi wierzysz ze NIE mozna zmieniac instrukcji instrukcja o wiekszej liczbie bajtow !!!?!!! ... No nic, wracamy do kodu ... Podaje np. standardowe rozwiazanie problemu (zlamanie programu) : mozemy skok (x) czyli dwubajtowa instrukcje "JZ 0040124C" zamienic na takze dwubajtowa instrukcje "JNZ 0040124C" co spowoduje ze program zarejestruje sie dla jakichkolwiek danych (Jakikolwiek NAME i SERIAL), no chyba ze podamy te wlasciwe dane (ale to graniczy z cudem, zeby trafic wlasciwa "kombinacje") ... No chyba ze nie jestes tak przekonany ze to graniczy z cudem, to mozemy zastapic ten skok czyms takim : "JMP 0040124C" co tez jest 2-bajtowe !!! ... heh ... mozliwosci jest naprawde DUZO ... moglibysmy np. wy-NOP-owac "CALL 00401362" i "JMP..." za nim, czyli zastapic te dwie instrukcje kilkoma instrukcjami NOP (zalezy ile te dwie instrukcje maja bajtow) ... albo zamiast instrukcji "CMP EAX,EBX" dac "CMP EAX,EAX" i skok (x) zawsze nastapi ... mozliwosci jest naprawde DUZO ! ... Okay ... przypuscmy ze juz wiesz co chcesz zmienic ... ale teraz JAK to zrobic ??? ... eh ... a wiec tak, potrzebujemy HEXedytora ... obojetnie jakiego ... Ja uzywam "Hacker's View" , ale to naprawde OBOJETNE ... Opisze tu jak to zrobic przy pomocy HIEW-a (potocznie Hacker's View), lecz mniej wiecej tak samo to bedzie wygladalo u Ciebie ... No wiec tak, przyjmijmy na przyklad ze chcesz zmienic "JZ 0040124C" na "JMP 0040124C" ... co musimy zrobic ? ... po pierwsze wiadomo ze w pliku dane zapisane sa w postaci bajtow ... aby znalezc w nim interesujaca nas instrukcje musimy znac jej "OPcode" czyli np. "OPcode" instrukcji "JZ 0040124C" to 7407 (Jesli w S-ice w twoim "oknie kodu" nie widzisz nic pomiedzy kolumna adresow a kolumna instrukcji to wykonaj komende <code on> - wtedy zobaczysz OPcod-y instrukcji !!!) ... Teraz jesli znamy juz "OPcode" danej instrukcji mozemy ja znalezc w pliku !!! ... eh ... Teraz tylko nasuwa sie pytanie : "a co jesli w pliku jest wiecej takich instrukcji - z kad mozemy wiedziec ktora jest ta "wazna" ??? " ... no wlasnie ... w takim razie musimy takze spisac OPcod-y instrukcji z "otoczenia" ... Czyli dla naszego przykladu jakim jest CrackMe 1.0 aby zlokalizowac ten "interesujacy" skok spiszemy OPcod-y kilku instrukcji z otoczenia, oto co powinienes zapisac sobie na kartce :

58,3B,C3,74,07,E8,18,01,00,00        

(Chyba rozpoznajesz w tym ciagu instrukcje z otoczenia i ta "glowna" - 7407) Okay ... to powinno wystarczyc ... Teraz tworzymy kopie zapasowa pliku ktorego kod chcemy modyfikowac ... chyba wiadomo dlaczego ? <-) ... i jeszcze kopiujemy ten plik do katalogu z HIEW-em ... w wyniku mamy 3 pliki ! ... Jeden - oryginal ... dwa - kopia zapasowa ... trzy - do pracy z HIEW-em ... teraz uruchamiamy HIEW-a albo zwykle (nowsze wersje) i pokazuje nam sie "menadzer plikow" <-) z ktorego szukamy i wybieramy plik ktory chcemy edytowac albo mozemy go uruchomic bezposrednio z prompt-a DOS-a podajac jako argument plik ktory chcemy edytowac, czyli :

hiew crackme.exe

Ukazuje nam sie okno ktore przypomina wbudowany edytor NC/FAR ... hmmm ... teraz przechodzimy do trybu hexadecymalnego (bylismy w ASCII) naciskajac F4 ... Aby znalezc wycinek kodu ktory szukamy naciskamy F7 ... mozemy teraz szukac zarowno ASCII jak i Hex ... nam zalezy na hex-ach wiec przechodzimy do okna przy ktorym pisze Hex i wpisujemy to co sobie zapisales na kartce ... Naciskamy Enter ... Teraz HIEW powinien szybko znalezc to co szukamy ... w oknie z wartosciami hexadecymalnymi na samej gorze powinien pojawic sie bajt 58 (pierwszy ktory wpisalismy do szukania) Oczywiscie widac wyraznie nasz ciag : 58 3B C3 74 07 E8 18 01 00 00 ... Wiemy ze bajty 74 07 odpowiadaja instrukcji "JZ 0040124C" a my ja chcemy zmienic na "JMP 0040124C" ... heh ... powinniscie wiedziec ze niektore bajty w instrukcji odpowiadaja za sama instrukcje a inne za jej argumenty ... w instrukcji "JZ 0040124C" bajt 74 odpowiada za okreslenie samej instrukcji czyli ze jest to "skok warunkowy gdy zero" natomiast bajt 07 odpowiada za jej argument czyli "0040124C" ... my argumentu nie chcemy zmieniac, tylko sama instrukcje !!! ... wiec bajt 07 zostawimy bez zmian natomiast zajmiemy sie bajtem 74 ... hmmm ... Co mamy z nim zrobic ??? ... Tu musisz wiedziec ze do okreslenia instrukcji JMP sluzy bajt EB ... czyli jesli chcemy aby instrukcja "JZ..." zmienila sie na "JMP..." to musimy zmienic pierwszy bajt z jej OPcod-u : 74 na bajt EB !!! ... proste nie ? <-) ... hmmm ... zapytasz skad masz wiedziec jaki bajt(y) charakteryzuja jaka instrukcje ??? heh ... Musisz sobie skads zalatwic taki wykaz !!! ... (nie pytaj mnie skad <-) ) ... A wiec chcemy zmienic bajt 74 na EB ... zaraz go zmienimy ... ale NAJPIERW ! : A wiec tak ... jestesmy w HIEW ... znalezlismy te instrukcjie ... Teraz KONIECZNIE zrob jeszcze jedno szukanie (F7) aby byc PEWNYM ze w kodzie programu nie wystepuje wiecej miejsc z naszymi instrukcjami ... w tym przypadku nie bedzie ... ale co by bylo gdyby byly ??? ... musielibysmy jeszcze raz wejsc do S-ice'a i spisac WIECEJ bajtow (OPcod-ow) z "okolicy" interesujacego nas kodu ... Dobra, wiec wiemy ze NAPEWNO kod ktory znalezlismy w HIEW odpowiada temu z S-ice ... aby byc jeszcze bardziej pewnym nacisnij F2 - zobaczsz kod ASM - jesli odpowiada on temu z S-ice to wszystko OK ... dobra wracamy do trybu HEX naciskajac ponownie F2 ... teraz chcemy zamienic bajt 74 ktory widzimy w oknie HIEW-a (no wiesz - ten z ciagu 58 3B ...) na EB ... Aby to zrobic naciskamy F3 i widzimy ze kursor jest na oknie z wartosciami HEXadecymalnymi ... teraz wystarczy tylko najechac na bajt 74 i wpisac EB !!! (Jesli jeszcze nie wiesz dlaczego EB - to przeczytaj KILKA razy powyzszy text) ... Jesli sie pomyliles albo wpisales cos innego to mozesz nacisnac ESC i wszystko wroci do normy ... natomiast jesli chcesz aby zmiany zostaly zapisane w pliku to wystarczy nacisnac F9 (zaraz po wpisaniu EB) !!! Gdy zmiany juz zostaly zapisane mozemy spokojnie wyjsc z HIEW-a ... teraz wystarczy zastapic oryginalny plik programu tym ktory wyszedl po "obrobce" w HIEW-ie <-) i uruchomic CrackMe ... wchodzimy do Help/Register wpisujemy DOWOLNE dane ... i ... yeah ! ... program zarejestrowany dla dowolnych danych <-D !!! Mam nadzieje ze wszystko zrozumiales ... bo to jedna z podstawowych rzeczy <-) ... Jesli nie to KONIECZNIE przeczytaj jeszcze kilka razy powyzszy text, az do skutku <-) acha ... i oczywiscie NAJWAZNIEJSZY moral to : PRZECZYTAJ "ART OF ASSEMBLY LANGUAGE" !!! <-) to jest "lektura obowiazkowa" dla kazdego szanujacego sie (przyszlego) crackera/reversera - i wez sobie dluzszy urlop bo jest tego cos 5 MB w PDF !!!!! ... Czasami sie moze zdarzyc ze tych OPcod-ow ktore spisales w S-ice ani rusz nie mozesz znalezc w pliku programu uzywajac HEXedytora !?!?!? ... To prawdopodobnie znaczy ze albo :

a) Zle spisales bajty (sprawdz 3 razy)

b) Szukasz w zlym pliku !!! tzn. ze np. procedura sprawdzajaca jast w jakims zewnetrznym DLL-u albo jakimkolwiek innym pliku !!! (w S-ice gdy jestes przy procedurze sprawdzajacej sprawdz co pisze w linijce oddzielajacej okno komend od okna kodu - czy to nie przypadkiem nazwa czegos innego niz tego co sie spodziewales !?!?!)

c) Plik jest albo spakowany albo szyfrowany ... nie to nie znaczy ze plik jest w ZIP-ie ... <-) ... tzn. ze plik jest tak pakowany ze jest rozpakowywany dopiero w momencie uruchomienia (rozpkowowywuje sie w PAMIECI operacyjnej (RAM)) ... Sa takie rozne standardowe sposoby kompresji np. WWPACK(32) (btw : wymyslony przez polaka <-) ), PKLite , Shrinker , VBox ... i wiele innych ... Te moze i bylyby trudne do zdekompresowania dla poczatkujacych ale sa gotowe automatyczne programy ktore to za nas robia, a my jak wiadomo jestesmy tacy LENIWI ze zaraz siegniemy po to co nam chocby troche ulatwi "prace" <-) ... Takie narzedzia to UNP (dla 16-bit) i ProcDump (dla 32-bit) ... przy czym ten drugi jest na tyle konfigurowalny (za pomoca skryptu) ze BARDZO latwo mozemy go "nauczyc" dekompresowac/dekodowac rozne sposoby kompresji/kodowania !!! Jesliprogramista wymysli sobie jakis swoj sposob kompresji/kodowania to ZAZWYCZAJ jest to bardzo prymitywne ... i nawet poczatkujacy sobie z tym poradzi ... a majac ProcDump-a to nawet dziecko <-) ... Na koniec wyjasnie cos jeszcze ... mianowicie mozesz sobie zadawac pytanie dlaczego musimy spisywac te wszystkie bajty z okolicy naszej instrukcji zamiast po prostu spisac offset danej instrukcji i ja znalezc w HIEW-ie ... hmmm ... poniewaz te offsety w S-ice to NIE to samo co offsety w pliku !!! ... te w S-ice to sa offsety uzaleznione od W95/98 i pamieci RAM !!! ... a te w pliku to sa liczone od zera od poczatku pliku do konca pliku (jak zobaczysz sa ulozone rosnaco i sa uzaleznione od dlugosci pliku !) ... dlatego NIE mozemy po prostu spisac offsetu z S-ice i znalezc go w pliku w HIEW-ie ... natomiast umozliwia to WDASM ktory podaje offset instrukcji w pliku ! ...

heh ... Ok ... to by bylo na tyle na temat wprowadzania zmian w plikach <-)


LAMANIE POD STARYM DOBRYM DOS-em

... (ech to byly czasy <-) ) ...

hmmm ... w zasadzie to nie ma duzo roznic ... cracking (reversing) to cracking (reversing) ... moze taka z wiekszych roznic to PRZERWANIA, w programach W95/98 NIE zobaczysz ich zbyt wiele ... ale w DOS sa WSZECHOBECNE ! ... Najlepiej zdabadz jakis spis wszystkich przerwan ... oczywiscie najlepszy to slynny "Ralf Brown's interrupt List" ... i zobacz co robia ... eh ... zreszta przypuszczam ze ludzie to czytajacy znaja sie na komputerach wiec wiedza co to przerwanie i ktore odpowiada za co (przynajmniej przypuszczam ze znacie te najpopularniejsze) ... w zasadzie to jest ta glowna roznica - nie ma API ... bo chyba nikt z was nie probowal GetDlgItemTextA na programie DOS-owym <-)) ... jest jeszcze szereg innych drobnych ... ale to juz sam zobaczysz <-) ... wiec np. wiecie ze odczyt SERIALA z okna dialogowego moze wystapic przy pomocy przerwania 21h (chyba najpopularniejsze w DOS-ie) fukcji AH=0Ah ... oczywiscie takze moze za pomoca innych np INT 16h albo czegos innego (po prostu zapoznaj sie z przerwaniami) ... no dobra ale jak zmusic S-ice'a zeby sie pojawil na tym przerwaniu ... hmmm za pomoca komendy <BpInt> (Breakpoit on interrupt) ... np. :

bpint 21 if ah==a

Musimy tu zastosowac wyrazenie warunkowe gdyz jesli dalibysmy samo <bpint 21> S-ice przerwal by na kazdym wywolaniu tego przerawania ktore jak wiesz jest stosowane przez programy DOS-owe troche czesto <-) ... Nawiasem mowiac to to wyrazenie warunkowe mozna stosowac nie tylko przy komendzie <bpint> ... mozna je stosowac przy WIELU komendach ... chy to <bpx> czy <bpm> i innych ... zwroc uwage ze maja byc dwa znaki '=' !!! ... (notacja C/C++) ... i przy okazji powiem ze w S-ice domyslnym systemem liczbowym jest hexadecymalny czyli szesnastkowy !!! i jesli chcesz jakas liczbe uzyc do czegos w systemie dziesietnym to musisz postawic przed nia znak '+' !!! ... czyli np. jesli chcemy zobaczyc jaka wartosc w hex ma liczba dziesietna 21 to stosujemy komende :

? +21

No ale to tak poza tematem <-) ... Czyli jesli postawiles ten breakpoint na przerwaniu 21h funkcji 0Ah to zobacz czy to dziala ! ... jesli nie to sproboj z innym przerwaniem i funkcja (po prostu zapoznaj sie z jak najwieksza liczba przerwan) ... oczywiscie ja nie znam wszystkich dlatego mam pod reka ksiazke ktora musze polecic ! ... Ksiazka ma tytul : "ENCYKLOPEDIA INFORMATYKI" napisana przez Stanislawa Kruka ... miedzy innymi ma w sobie wyjasnienia 1000 terminow informatycznych, wykaz instrukcji koprocesora 80387 (!), wykaz wszystkich instrukcji ASM procesorow x86 (!!), wykaz wszystkich przerwan (!!!), i kilka innych rzeczy ! ... po prostu musisz ja miec ... wszystkie informacje co Crackerowi (Reverserowi) sa potrzebne sa w niej zawarte (nie wiem dlaczego nie ma tytulu "ENCYKLOPEDIA CRACKERA") <-) ... paskudna reklama co ? <-) ... no ale nic ... eh ... Nie bede sie dalej rozwodzil nad DOS-em ... gdyz i tak juz umiera (bedziemy tesknic przyjacielu <~~-( ) ... Pamietaj o tych przerwaniach ... potem juz postepujesz podobnie pamietajac o zasadach zadzacych sie w 16-bit (16-bitowe adresy itp.) ... aha ... nie potrzebujesz specjalnie Debuggera dla DOS gdyz rownie dobrze mozesz uruchomic program DOS-owy pod W95/98 ... albo skorzystac z narzedzia ktore udostepnione jest wraz z S-ice : dldr.exe ... jest ono w katalogu UTILS16 (nazwa mowi sama za siebie) i ladujesz nim program :

dldr programx.exe

i ladujesz na poczatku kodu programu ... potem juz robisz wszystko "normalnie" ... Jesli jednak MUSISZ w DOS-ie go lamac to jest tez S-ice 2.80 dla DOS-a ... znajdz go w sieci i uzywaj ! <-) ... No dobra ... to tyle <-) ...


LAMANIE VB-SHIT <-(

Eh ... nawet nie chce mi sie o tym pisac bo to przykre ... jednak trudno ... robota to robota <-) ... VB to takie cos co nie jest jakby zwyczajnym programem (tylko gownem <-) ) tylko programem ktory jest zwiazany ze standardowymi bibliotekami VB (DLL-e) ... zaleznie od wersji - VB3 , VB4 , VB5 , VB6 (VB 1 i 2 to nie wiem czy to bylo czy nie ... w kazdym razie nie pod W32) ... - nazwy bibliotek sie roznia np. dla programow napisanych w VB4 (32-bitowych) nazwa biblioteki to : VB40032.DLL albo dla VB5 to : MSVBVM50.DLL ... prawde mowiac to nie pamietam reszty nazw i nie chce mi sie sprawdzac ale mozesz gdzies na to zerkanac ... Nie znam dlatego ze po prostu nie musze ... zawsze udaje mi sie rozpoznac ktory program jest VB a ktory nie ... to proste ... wystarczy zobaczyc podczas sledzenia kodu na DLL-e jakie program "przerabia" jesli sa w ktorejs nazwie DLL-a literki "vb" to prawdopodobnie jest to program VB ... nie ma tu zadnej filozofii ... Rozpoznac mozna tez czy to program VB przy instalacji ... jesli widzisz ze instalowane sa jakies "podejrzane" biblioteki to latwo to rozpoznac ... W zasadzie jest tylko kilka roznic w lamaniu "zwyklych" programow i VB ... przedstawie to w punktach :

1) Do kodu zabezpieczenia NIE dostaniemy sie przez GetDlgItemTextA czy tym podobnych standardow ... dostaniemy sie za to przez HMemCpy !!! ... (chociaz to tez w zasadzie mozna uznac za standard <-) ) ... Zobacz na dzial "SPOSOBY PODEJSCIA" na dokladniejsze info o HMemCpy ... Tylko tutaj po tym hmemcpy nie dostaniemy sie do kodu wlasciwego programu lecz do BIBLIOTEKI !!! ... czyli po ilus tam F12 w linijce com/dat nie bedzie nazwa programu tylko nazwa biblioteki np. VB40032.DLL ... i musimy sledzic biblioteke (w zasadzie to nie musimy (zazwyczaj) wystarczy znalezc ciag bajtow odpowiadajacy za okreslony ciag instrukcji poznasz to przy okazji <-) )

2) Jak wiadomo programy VB korzystaja ze standardowych bibliotek to wykonania nawet najdrobniejszych zadan (takich jak np. porownanie SERIALI <-) ) ... w zwiazku z tym sprawdzenie czy SERIAL byl wlasciwy (zazwyczaj) zostanie przeprowadzone w tej wlasnie bibliotece (DLL-u) ... I tu przestroga ! ... jesli juz znajdziesz kod sprawdzajacy poprawnosc SERIALA w DLL-u to NIE mozesz zmienic w kodzie DLL-a jakiegos bajtu np. skoku JZ na JMP czy JNZ ... hmmm ... dlaczego ? ... poniewaz z tego DLL-a NIE korzysta tylko program ktory akurat lamiesz, lecz TAKZE inne programy VB4 (jesli to byl program VB4) i te inne tez by korzystaly ze zmienionej biblioteki powodujac nie przewidziane konsekwencje ... a jesli nawet tylko program ktory lamiesz korzysta z danego DLL-a to i tak jest niebezpieczenstwo ! ... gdyz odcinek kodu w bibliotece ktory jest odpowiedzialny za sprawdzenie SERIALA i ktory zpatchowales NIE jest prawdopodobnie odpowiedzialny tylko i wylacznie za sprawdzenie tego SERIALA lecz jest odpowiedzialny tez za porownanie JAKICHKOLWIEK lancuchow znakow !!! ... uh ... dalej nie lapiesz ? ... no coz ... zobrazuje to na przykladzie ... WYOBRAZMY sobie program X ktory formatuje dyski ... jest to program VB4 ... ma pole textowe w ktorym wpisujesz litere dysku do sformatowania ... jest to shareware i mozna go zarejestrowac przez podanie numeru licencyjnego ... Znalazles miejsce w DLL-u gdzie jest porownywany twoj SERIAL z prawidlowym ... okay ... zmieniles skok JZ ktory odpowiada za zarejestrowany/niezarejestrowany program w hexedytorze na JMP (w pliku VB40032.DLL !!!) ... uruchamiasz program, wpisujesz dowolne dane i spoko, program zarejestrowany ... a teraz chcesz sobie sformatowac dyskietke, wiec wpisujesz litere dysku "A" ... przypuscmy ze program NAJPIERW porownuje czy zostalo wpisane "C" ... a jesli ty patchowales tego DLL-a to program "pomysli" ze to co wpisales jest ZAWSZE "C" ! ... i co ? ... i zamiast sformatowanej dyskietki masz sformatowany HDD <-) ... (dzieci : nie probojcie tego w domu <-) ) ... Oczywiscie program jest fikcyjny, ale to tylko jako przyklad - abys zrozumial problem <-) ... Program VB moze porownywac KAZDE stringi ta metoda i BEDA sie dzialy nie przewidziane rzeczy !!! ... WIEC PAMIETAJ ! ... NIE EDYTUJ VB-DLL-a !!! (przynajmniej w zabezpieczeniach typu SERIAL <-) ) ...

3) W VB-DLL-ach istnieja standardowe miejsca gdzie sa porownywane stringi (jesli zerkniesz nadolaczony WINICE.DAT do tego textu to zobaczysz w makrach jakie to miejsca) ... jednak sproboj najpierw standardowo ... tak dla praktyki pozniej zaczniesz stosowac te "wzorce" <-) ...

4) Wszystkie (chyba) wersje VB zanim zrobia cos ze stringami zamieniaja ich format na WIDE CHAR ! tzn. ze oddzielaja kazdy znak bajtem "00" !!! ...

Obrazowo :

ZWYKLY :   "12345"  (okno danych : 12345)           
WIDE CHAR :   "1",0,"2",0,"3",0,"4",0,"5",0 (okno danych : 1.2.3.4.5.) 

Jesli zobaczysz w oknie danych twoj SERIAL wlasnie w formacie WIDE CHAR to mozesz podejzewac ze VB sie gdzies tutaj krecil <-) ... taka konwersja pomiedzy zwyklym formatem textu a WIDE CHAR jest wykonywana (zazwyczaj) przy pomocy funkcji API : MultiByteToWideChar ... mozemy na niej zastawic BPX i od razu przechwycic miejsce w pamieci z naszym przekonwertowanym SERIALEM zastawic na nim BPM/BPR i juz dalej standardowo ... UWAGA ! to jest bardzo wazne z tym WIDE CHAR, jesli nie bedziesz o tym pamietal mozesz sobie nie poradzic z programami VB ! ...

5) Istnieja dekompilatory dla VB3 i VB4 ... mozesz sprobowac ta droga <-) ... Istnieje takze program o nazwie SmartCheck jest to "program flow analyzer" tzn. sledzi okreslone dzialania w programie i wykonuje "raport" ... Jednak ten program nie jest tylko dla programow VB (chociaz wydaje sie ze do tego zostal przeznaczony <-) ) lecz takze do innych ... Po prostu uruchom go i sie z nim zapoznaj (poproboj opcje I PRZECZYTAJ helpa) ma "idioto-odporny" interface (zreszta tak jak WDASM) <-) ... (moze kiedys napisze cos jeszcze o SmartCheck) ...

EEE ... dobra ... wiecej nie chce mi sie pisac ... spadam z tego dzialu <-) ...


PREZENCIK !!! <-) :

A teraz na koniec jako "prezent" <-) - "zadania domowe" ...

Wiele osob pyta mnie o to wiec postanowilem to tutaj zamiescic ... <-) ... Jest to zbior 35 programikow ktore sa albo BARDZO proste albo BARDZO banalne <-) do zlamania ... tzn. ze macie na kazdy program 1-5 min ... wszystkie zabezpieczenia w nich sa typu SERIAL czyli sam SERIAL albo NAME/SERIAL ... nawet nie ma zadnego z plikiem rejestracyjnym (nie mialem zadnego prostego pod reka <-) ) ... Postarajcie sie je zlamac ... tak w ramach treningu <-) ... ... nie napisalem ktore wersje - bo nie chcialo mi sie sprawdzac ... <-) ... Ze zdobyciem programow nie powinno byc wiekszych problemow ... w kazdym razie w okolicy czasu gdy to pisze <-) ... wszystkie (chyba) programy sa z magazynow : CHIP/PC WORLD KOMPUTER/WWW ... numery : 12/98 , 1/99 , 2/99 ... programy oznaczone znaczkiem "(VBx)" znaczy ze sa napisane w Visual Basic-u (niezbyt ich duzo <-) ) ... no ale "programisci" VB tworza ich coraz wiecej <-(( ) ... (przynajmniej zadbalem o wszystkie wersje VB <-) ... wersja 3 juz praktycznie wychodzi z uzytku)

Oto "CZARNA LISTA" <-) :

Okay ... Okay ... wiem mistrze ze to dla was za proste <-) ...

jeszcze podam 2 programiki ktore sa na troche wyzszym poziomie ... (ale nie mysl ze to sa BARDZO dobre zabezpieczenia !!!) programy te to :

wskazowka do FAR-a :

Rejestracja odbywa sie przez uruchomienie programu z opcja -r ! ...czyli w prompt DOS-a (bezposrednio z FAR-a ... tak jak NC - jest prompt) wpisujemy (bedac w katalogu FAR-a) komende : far.exe -r ... !!! program jest 32-bit ale pracuje w trybie textowym ! ... nie zadziala tu zaden API (tzn. zaden do pobrania textu z okna np. GetDlgItemTextA) ... Sa zapewne inne metody dostania sie do kodu programu ... ale powiem wam jedna (najbardziej oczywista) ... eh, powinniscie to sami wykombinowac ... JESLI CHCESZ TO NIE CZYTAJ DALEJ KILKU LINIJEK !!! Ta oczywista metoda to oczywiscie : wpisz dane rejestracyjne ... wejdz do S-ice'a przeszukaj pamiec czy nie ma w niej twojego SERIALA (s 0 l ffffffff "xxx") Jesli znajdziesz to breakpoint (BPM/BPR) wychodzisz z S-ice'a i naciskasz OK ... Jesli nie to wyjdz i znowu wejdz i znowu poszukaj i tak w kolko <-) (albo F12) ... dalej juz sam ...

wskazowka do FIRE HAND EMBER PRO :

Nie ma <-) ...

Jesli powiedzie Ci sie z FAR-em i FIRE HAND EMBER PRO to juz sobie mozesz odpuscic czytanie textow ! ... po prostu dalej mozesz isc juz bez ich pomocy ... przynajmniej moich ... (az do pewnego numeru <-) ) ... co najwyzej czytaj texty o jakichs nieznanych trickach (najlepiej na fravia.org) ... a tak to mozesz polegac na swojej inteligencji i wprawiac sie w naszej "sztuce" ... <-) ... (ale powtarzam : nie popadnij w MEGALOMANIE bo to nie sa BARDZO trudne zabezpieczenia !!!) ... <-)

UWAGA !!! ... WSZYSTKIE programy TRZEBA skasowac zaraz po zlamaniu ... bo podalem je TYLKO jako zadanie praktyczne ... i da sie je zastapic jakimis FREEWARE ... oczywiscie jak chcesz to mozesz je kupic <-) ... ale dla mnie (prawie) wszystkie z nich sa BEZUZYTECZNE ... (tzn. (prawie) wszystkie mam zastapione przez FREEWARE - i zmierzam do tego aby wszystkie (nie tylko prawie) zastapic FREEWARE-ami a te co mam SHAREWARE to chodza na zasadach przyjetych przez autora !) ... hehe <-) ... TO NIE ZADEN ZART ! ... MOWILEM POWAZNIE <-| ... podsumowujac macie zrobic tak : a)INSTALL, b)CRACK, c)UNINSTALL !!! ... przynajmniej ja tak zrobilem i mam nadzieje ze zrobisz to samo ... !!!

Linki :

Wiecej roznego rodzaju stron poszukaj w linkach na Fravia.org ... Jest tam wszystko czego potrzebujesz <-) ...

KONIEC. END. FIN. TERMINO. ENDE. KONEC. UTOLSO. <-) ...