III. Ochrona programow


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:

Samosprawdzanie sie programow

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.

  1. Zadeklarowac w programie globalne zmienne z nadana dowolna wartoscia poczatkowa. Maja one pamietac odpowiednie parametry.
  2. W wyniku analizy rzeczywistych parametrow programu nada sie tym zmiennym odpowiednia wartosc poczatkowa. Zmienna okreslajaca dlugosc bedzie mozna ustalic przed kolejna komplijacja programu natomiast atrybuty, data i czas zapisu oraz dane dotyczace sumy kontrolnej beda wpisane w odpowiednie miejsce pliku .EXE.
  3. Sumy kontrolne pamietane beda w nastepujacy sposob. Zarezerwowana bedzie zmienna pomocnicza typu calkowitego, z ustalona wartoscia poczatkowa rowna zero. Po kompilacji programu nalezy zliczyc roznice symetryczna wszystkich bajtow pliku .EXE. Otrzymana wartosc trzeba wstawic w zarezerwowane na zmienna miejsce. W ten sposob uzyskamy plik .EXE o zerowej roznicy symetrycznej wszystkich bajtow.

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:

  1. Fizyczne uszkodzenie dyskietki (na przyklad igla) w jednym lub kilku miejscach.
  2. Sformatowanie dyskietki nawet jezeli byla juz ona sformatowana (ma to na celu oznaczenie jej uszkodzonych miejsc jako "bad sectors" - aby mozna bylo bez obawy nagrywac na nia zbiory).
  3. Wyodrebnienie informacji o uszkodzonych fragmentach dyskietki i na ich podstawie stworzenie procedury stwierdzajacej jej oryginalnosc. Dzialanie tej procedury jest nastepujace:

Zliczanie liczby instalacji

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.

  1. W czasie instalacji programu na dysku bedzie odczytywany fragment BIOS-u komputera i zapamietywany w pliku pomocniczym (na przyklad 40 bajtow poczawszy od adresu $F:$E874). Oczywiscie nalezy odpowiednio zaszyfrowac zawartosc tego pliku. Mozna rowniez zapisac w nim pewne nadmiarowe informacje.
  2. W trakcie kazdego uruchomienia programu bedzie on odczytywal fragment BIOS-u zawarty w pliku pomocniczym i porownywal z BIOS-em komputera, na ktorym aktualnie jest zainstalowany.
  3. W zaleznosci od wynikow porownania podejmowana bedzie decyzja o legalnosci kopii.

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).


Spis tresci

rozdzial poprzedni

rozdzial nastepny