Oszukać oszusta

Wielu Czytelników CHIP-a pisało pewnie kiedyś jakiś program. Nie jest żadną tajemnicą, że w stworzenie naprawdę dobrej i sprawnej aplikacji trzeba włożyć wiele pracy i trudu. Napisanie dobrego programu zajmuje także mnóstwo czasu. Niektórzy zatem nie chcą, aby ich dzieło było używane bez jakichkolwiek ograniczeń. Ponadto część autorów pragnie na swoich aplikacjach zarabiać, a inni z kolei chcą tylko, aby informowano ich o korzystaniu z programu. Tu właśnie przydają się różne rodzaje zabezpieczeń, których zadaniem jest nie dopuścić, by osoby nieuprawnione używały danej aplikacji.

Większość programów dostępnych na rynku (w tym także sporo produktów znanych firm) ma jednak bardzo słabe zabezpieczenia, które za pomocą dobrych i zaawansowanych narzędzi crackerskich bez trudu mogą być złamane. Wystarczy wpisać w wyszukiwarkę słowo “crack”, aby otrzymać adresy setek stron oferujących nam klucze i kody do praktycznie każdego produktu, jaki ukazał się na rynku. To mówi samo za siebie…

Pierwsza linia obrony

W jaki sposób crackerzy łamią zabezpieczenia, którymi staramy się chronić nasze programy? Zacznijmy od przeglądu prostych metod zabezpieczeń. Pierwszym i najprostszym sposobem jest po prostu poproszenie użytkownika o podanie kodu produktu. Często osiągamy to za pomocą następującego mechanizmu (przykład w pseudokodzie):

Write(‘Prosze wprowadzic kod
produktu: ‘); ReadLn(kod);
If (kod=WLASCIWY_KOD) Then
Program dziala
Else
Wyswietl komunikat o blednym
kodzie

Program wyświetla proste okienko i czeka na wprowadzenie danych. Kod takiego produktu jest zapisany gdzieś w programie i porównywany z tym, co wpisze użytkownik. Takie zabezpieczenie może być jednak złamane w bardzo prosty sposób: w okienko wpisujemy cokolwiek (dowolny kod), a następnie na przykład w programie SoftICE (omówionym dalej) ustawiamy tzw. pułapkę na jedną ze znanych funkcji pobierających tekst z okienek oraz szukamy kodu, który wpisaliśmy. Jedyny krok, który należy wtedy zrobić, to przejrzeć kod programu odpowiedzialnego za przetwarzanie tego niewłaściwego klucza. Po poznaniu algorytmu, którym posługuje się aplikacja do sprawdzenia poprawności wpisanych danych, cracker preparuje właściwy klucz. Zabezpieczenie polegające na podaniu samego kodu produktu jest już bardzo rzadko spotykane i ogólnie odradzane ze względu na swoją prostotę.

Inna, również łatwa – zarówno w implementacji (napisaniu), jak i w złamaniu – metoda polega na pobraniu od użytkownika jego nazwy i wygenerowaniu klucza na jej podstawie. Użytkownik musi najpierw wysłać formularz do twórcy danej aplikacji, podając tam swoje nazwisko, po czym na podstawie tego nazwiska producent generuje klucz i odsyła go do klienta, a ten wpisuje swoje nazwisko i kod. Program zawiera własny generator klucza, taki sam jak ten, którym posłużył się producent. Aplikacja tworzy kod na podstawie nazwiska i porównuje go z wpisanym przez użytkownika. Jest to również proste zabezpieczenie, które crackerzy łamią w podobny sposób jak poprzednie. Wpisują oni jakiekolwiek dane w pola dialogowe, a następnie ustawiają tzw. pułapkę (ang. breakpoint) na funkcję pobierającą tekst z pól dialogowych i po pobraniu danych przez aplikację szukają tego, co wpisali, oraz analizują kod źródłowy. W ten sposób znają algorytm użyty do otrzymania klucza. Pewnym urozmaiceniem tej metody jest dodanie do formularza godziny wygenerowania klucza przez program (czas ten jest zapisany zarówno w formularzu, jak i w aplikacji, która go stworzyła). Godzina służy jako dodatkowa informacja, na podstawie której generowany jest kod produktu. Niemniej, mimo iż wydaje to się bardziej skomplikowane, zabez- pieczenie takie jest łamane w taki sam sposób jak poprzednie.

Warsztat crackera

Czym posługują się crackerzy podczas łamania naszych aplikacji? Mogłoby się wydawać, że głównie swoją ogromną wiedzą, ale nie do końca jest to prawda. Większość “łamaczy” to ludzie znający temat pobieżnie, osiągający jednak zadziwiające rezultaty za pomocą dostępnych powszechnie programów. Jednym z najpopularniejszych narzędzi crackerskich jest SoftICE, doskonały debuger, w starciu z którym niewiele aplikacji ma szanse. Innym znanym programem używanym przez komputerowe podziemie jest WDasm. Jest to deasembler, czyli program, który tłumaczy program wykonywalny na kod źródłowy w asemblerze. Poza tą parą aplikacji crackerzy dysponują ogromną liczbą innych narzędzi, które czynią łamanie zabezpieczeń łatwym i przyjemnym. Nie pozostajemy jednak całkiem wobec nich bezradni – grunt to przemyśleć metody obrony.

Umacniamy fortecę

Każda osoba pragnąca skutecznie ochronić swój program powinna najpierw dobrze się zastanowić nad wyborem metody zabezpieczenia. Prawda jest niestety taka, że nie ma mechanizmu doskonałego – każdy można złamać. Rzecz w tym, jak szybko zabezpieczenie zostanie złamane i przez kogo. Za pomocą kilku prostych sztuczek możemy jednak odstraszyć wielu początkujących i średnio zaawansowanych crackerów, którzy nie będą wiedzieli, o co w naszym programie chodzi, i prawdopodobnie szybko zrezygnują z jego łamania. Na prawdziwych crackerów nie ma, niestety, jednego skutecznego sposobu – zawsze się znajdzie jakaś luka.

Pierwszym krokiem powinno być uczynienie procedury sprawdzającej hasło maksymalnie nieczytelną i zagmatwaną. Początkujący “łamacze” dadzą sobie spokój, gdy nie będą mogli zrozumieć kodu. Rzadko stosowane metody sprawdzania klucza działają najlepiej. Przykład: aby dostać pełną wersję programu, trzeba wysłać formularz ze swoimi danymi. Program zapisuje wiele danych do formularza, po czym na ich podstawie generuje kod. Brzmi znajomo? Tak, bardzo podobną sytuację opisywałem parę akapitów wyżej. Ale na czym polega trudność? Otóż nasz program NIE pobiera żadnych danych – wraz z potwierdzeniem wysłania formularza użytkownik otrzymuje drogą elektroniczną plik. W zbiorze tym zawarty jest klucz produktu – program zapisał sobie nasze dane oraz wygenerował klucz. Teraz tylko za każdym uruchomieniem sprawdza, czy w katalogu z główną aplikacją znajduje się plik np. system.vxd (który w rzeczywistości będzie zawierał kod) i, jeśli tak jest, pobiera klucz z tego właśnie zbioru i sprawdza z tym zapisanym wewnątrz programu. Jest to bardzo skuteczna metoda, działająca doskonale na początkujących crackerów – nie wiedzą oni, który fragment kodu odpowiada za sprawdzenie klucza, a nawet jeżeli uda im się odgadnąć, że program poszukuje pliku z kluczem, to nadal nie będą znali sposobu jego generowania. Jest bardzo mało prawdopodobne, że dojdą do tego, w którym miejscu muszą sprawdzić aplikację, aby otrzymać przepis na stworzenie działającego klucza.

Więcej:bezcatnews