Zagadnienie ochrony programow przygotowalem w postaci dwoch aspektow:
Ochrona programow przed modyfikacja
Zajmiemy sie tutaj sposobami umozliwiajacymi nam stwierdzenie, czy dany zasob byl modyfikowany czy nie. W szczegolnosci interesowac nas beda nastepujace kwestie:
Wlasciwosc ta jest przydatna jako pewna metoda profilaktyki antywirusowej, oraz jako swego rodzaju kontrola praw autorskich programow. O ile ta pierwsza funkcja jest realizowana przez specjalne programy antywirusowe i nie warto byloby tworzyc tych wszystkich zabezpieczen tylko i wylacznie dla niej, to druga moze stac sie wielce przydatna zarowno dla programisty jak i dla uzytkownika. Stwierdzenie zgodnosci pracujacej kopii programu z oryginalem uchroni bowiem uzytkownika przed zmianami dokonywanymi przez osoby niepowolane, a takze utrudni potencjalnym zlodziejom lamanie praw autorskich i usuwanie zabezpieczen programow przed kopiowaniem. Skutecznie tez odstraszy osoby, probujace wpisac do informacji o programie wlasne dane.
Aby pracujacy program mogl stwierdzic swoja zgodnosc z oryginalem, musi porownac pewne zapamietane cechy ze stanem aktualnym. Zazwyczaj tymi cechami sa: dlugosc programu, data i czas ostatniej modyfikacji, atrybuty oraz sumy kontrolne wszystkich lub czesci bajtow programu. Mozna te dane zapisac w jakims osobnym, zaszyfrowanym pliku, lecz lepsza metoda jest zamieszczenie ich w samym programie. A oto jeden z mozliwych sposobow wykonania tego zadania.
Sprawdzanie poprawnosci bazy danych programu
Bazy danych moga byc, pomimo ich zaszyfrowania, narazone na naduzycia, polegajace na modyfikowaniu przez osoby niepowolane. Osoby te, zlamawszy szyfr, moga modyfikowac informacje w dowolny sposob za pomoca kazdego edytora dyskowego. Mozna zatem stworzyc mechanizm, pozwalajacy na wylapywanie tego typu zapedow. Mechanizm ten moglby rownoczesnie byc pewnego rodzaju zabezpieczeniem przed przypadkowymi przeklamaniami w bazie, powstalymi na przyklad w wyniku bledow programu czy zalamania sie systemu operacyjnego.
Najlepszym sposobem sprawdzania czy informacje w bazie nie ulegly modyfikacji, jest ich kontrola na poziomie pojedynczego rekordu (mozna to stosowac zarowno dla wielkich jak i malych baz). Kazdy rekord, oprocz normalnie zdefiniowanych pol, bedzie rowniez zawieral komorke kontrolna (na przyklad bajt bedacy roznica symetryczna wszystkich pozostalych bajtow rekordu). Siegajac wowczas do bazy po rekord bedzie mozna sprawdzic, czy nie byl on bezprawnie modyfikowany. Nie ma co prawda wtedy pewnosci, ze pozostale rekordy sa nietkniete, ale odczytywana informacja na pewno jest prawdziwa. Jest to warunek do przyjecia, poniewaz zafalszowana niewykorzystana informacja nie stwarza duzego zagrozenia. Natomiast kazda proba odwolania sie do "podejrzanego" rekordu bedzie natychmiast wychwycona.
Nalezy jednak pamietac o niezaleznym zabezpieczeniu programu obslugujacego baze przed dostepem osob niepowolanych. Jezeli ten warunek nie zostanie spelniony, opisana metoda nie przyniesie spodziewanych efektow.
Zabezpieczenie programow przed sledzeniem programami typu debugger
Chodzi tu o zabezpieczenie tworzonych programow przed uruchamianiem za posrednictwem systemow, pozwalajacych na obserwowanie realizacji programu przy pomocy pracy krokowej. Programy typu debugger bardzo ulatwiaja lamanie wszelkiego rodzaju zabezpieczen, pozwalajac na obserwowanie wszystkich operacji wykonywanych przez sledzony program. Mozna zatem stworzyc mechanizm, powodujacy reakcje na wykrycie proby sledzenia programu. Wykonac to mozna na wiele sposobow miedzy innymi poprzez:
Badanie czasu realizacji procedur
Mozna tu posluzyc sie dwukrotnym odczytem zegara systemowego. Pierwszy odzczyt bedzie nastepowal przed wywolaniem pewnej procedury, a drugi po jej zakonczeniu. Nastepnie wywolana bedzie procedura sprawdzajaca oba czasy. Program sledzacy zostanie wykryty na podstawie stwierdzenia, ze czas wywolania procedury byl wiekszy od zalozonego. Przy wyborze procedury nalezy pamietac, iz czas jej trwania powinien byc znaczaco uzalezniony od czynnikow zewnetrznych (na przyklad reakcji uzytkownika, parametrow wywolania). Przy zalozeniu, ze czas dzialania tej procedury zalezy tylko od szybkosci komputera i zalozeniu odpowiednio wielkiego limitu czasowego istnieje szansa, ze podczas sledzenia zostanie on przekroczony, gdyz po kazdym kroku nastepuje oczekiwanie na reakcje uzytkownika.
Przechwycenie przerwania, pozwalajacego na prace krokowa
Programy sledzace wykorzystuja dwa przerwania BIOS'u:
Program, by nie pozwolic na sledzenie, musi zmienic obsluge ktoregos z tych przerwan. W przypadku jego wywolania moze stwierdzic obecnosc programu sledzacego i odpowiednio zareagowac (na przyklad zakonczyc dzialanie).
Ochrona programow przed kopiowaniem
W interesie kazdego producenta oprogramowania lezy na pewno stworzenie zamknietego systemu ochrony jego programu przed kopiowaniem. System ten musi byc pelny i spojny, lecz jednoczesnie jak najmniej dostrzegalny i absorbujacy dla legalnego uzytkownika. Istnieje kilka podstawowych funkcji, ktore powinien on spelniac. Niektore z nich wymagaja szerszego omowienia i dla nich mamy odnosniki do osobnych podrozdzialow.
Ochrona dyskietki dystrybucyjej przed kopiowaniem
Chodzi nam tu o stworzenie tzw. dyskietki kluczowej, ktora bedzie miala kilka praktycznych zastosowan. Moze mianowicie sluzyc jako dyskietka instalacyjna. Oryginalnosc takiej dyskietki bedzie sprawdzana przy probie instalacji. Skopiowanie jej wersji dystrybucyjnej nic nie da - programu instalacyjnego nie bedzie mozna uruchomic. Moze taka dyskietka byc rowniez swego rodzaju "kluczem" osobistym, otwierajacym dostep do tajnych danych na dysku. Wtedy program przed umozliwieniem operacji na bazie bedzie sprawdzal tozsamosc uzytkownika na podstawie dyskietki i hasla.
Taka dyskietka musi zawierac pewne cechy ja identyfikujace, dzieki ktorym program bedzie mogl poznac, ze dyskietka jest kluczowa. Konieczne rowniez jest, aby cechy te ulegaly zmianie przy probie skopiowania dyskietki (zarowno poszczegolnymi zbiorami, jak i fizycznie - sektorami). Algorytm postepowania przy tworzeniu dyskietki kluczowej bedzie nastepujacy:
Ma ono przyczynic sie do stworzenia takiego programu instalacyjnego, przy pomocy ktorego bedzie mozna zainstalowac pakiet jedynie pewna, okreslona przez producenta liczbe razy.
Mozna do tego zagadnienia podejsc w nastepujacy sposob. Informacja o liczbie uruchomien bedzie pamietana w osobnym zbiorze na dysku. Kazdorazowe uruchomienie programu instalacyjnego bedzie powodowalo sprawdzenie, ilokrotnie byl on wykorzystywany do tej pory. Jezeli limit uruchomien zostal juz przekroczony, spowoduje to koniec dzialania. W przeciwnym wypadku w zbiorze zostanie zapamietana informacja o kolejnym uruchomirniu i program bedzie dzialal.
Plik z informacja o liczbie uruchomien moze byc plikiem tekstowym. Jego brak na dysku, zapisanie w nim blednych informacji badz tez liczba uruchomien wieksza lub rowna ustalonemu limitowi bedzie sygnalem, ze program instalacyjny nie powinien sie uruchomic. W przeciwnym razie powinien on dzialac normalnie. Oczywiscie nalezy pamietac o szyfrowaniu informacji w tym pliku. Wskazane jest rowniez maksymalne komplikowanie jego zawartosci. Mozna zapisac w nim pewna ilosc nadmiarowych informacji, najlepiej losowo modyfikowanych przy kazdym uruchomieniu. Wtedy stwierdzenie, ktora wartosc niesie wazna informacje bedzie dla osob postronnych wielce utrudnione.
Ochrona zainstalowanego programu przed kopiowaniem
Istnieje wiele metod pozwalajacych na realizacje tego zadania. Jedna z nich jest pamietanie fragmentu BIOS-u komputera, na ktorym zostal zainstalowany program. Wiekszosc firm produkujacych komputery, tworzy rowniez wlasne BIOS-y, mniej lub bardziej zgodne ze standardem IBM (caly czas chodzi nam o komputery typu PC). Roznia sie one, oczywiscie na poziomie kodu. Ten wlasnie fakt mozna wykorzystac do ochrony zainstalowanego oprogramowania przed kopiowaniem (mozemy oczywiscie trafic na identyczna konfiguracje sprzetowa - wtedy nasz system ochrony staje sie nieskuteczny). Sposob dzialania naszej metody jest nastepujacy.
Inna metoda ochrony zainstalowanego programu przed kopiowaniem jest pamietanie i sprawdzanie polozenia na dysku jednego z plikow pakietu. Przy kopiowaniu uzyskanie na innym dysku takiej samej lokalizacji jest bardzo malo prawdopodobne (na pewno mniej niz trafienie na taki sam BIOS tego samego producenta). Pamietac nalezy jedynie, by plikowi, ktory bedzie sprawdzany nadac atrybut System, uniemozliwiajacy jego przemieszczenie na dysku (na przyklad przez programy sluzace do defragmentacji). Z tego powodu zbior ten nie moze byc wykonywalny (inaczej nie mozna byloby go uruchomic). Metode te nalezaloby jednak polaczyc z innymi systemami ochrony (potencjalny "pirat" nie powinien na przyklad miec mozliwosci ustalenia polozenia sprawdzanego pliku na naszym dysku).