P°esm∞rovßnφ vektor∙ p°eruÜenφ na t∞lo viru
K tomu, aby virus aktivn∞ sledoval d∞nφ operaΦnφho systΘmu, musφ p°esm∞rovat obsluhy
vybran²ch p°eruÜenφ na svΘ t∞lo. NejΦast∞ji obsazovan²mi p°eruÜenφmi je int 21h (volßnφ
jßdra DOSu) a int 13h (diskovΘ operace). Je naprosto b∞₧nΘ, ₧e jeden virus obsazuje hned
n∞kolik p°eruÜenφ.
Pro realizaci p°esm∞rovßnφ obsluhy p°eruÜenφ mß virus dv∞ mo₧nosti:
Legßlnφ pou₧itφ slu₧eb DOSu 35h (Φti vektor p°eruÜenφ) a 25h (nastav vektor p°eruÜenφ)
Tyto slu₧by manipulujφ s hodnotami ulo₧en²mi v tabulce vektor∙ p°eruÜenφ (interrupt vector table).
Tabulka vektor∙ p°eruÜenφ je v pam∞ti ulo₧ena od adresy 0000:0000 a je tvo°ena Φty°bajtov²mi
polo₧kami, reprezentujφcφmi offsetovou (2 bajty) a segmentovou (2 bajty) Φßst adresy obsluhy p°φsluÜnΘho
p°eruÜenφ. Kapacita tabulky zahrnuje rozsah adres obsluh p°eruÜenφ int 00h a₧ int ffh. UvedenΘ slu₧by
naΦφtajφ nebo uklßdajφ Φty°i bajty z adresy nebo na adresu 0000:(AL*4), p°iΦem₧ obsah registru AL
oznaΦuje po₧adovanΘ p°eruÜenφ.
mov ax, 3521h ; sluzba 35h, preruseni int 21h
int 21h ; vlastni volani DOSu
mov word ptr cs:[old_int_21h], bx ; offsetova cast
mov word ptr cs:[old_int_21h+2], es ; segmentova cast
Nynφ je tedy na adrese old_int_21h uschovßna hodnota adresy p∙vodnφ obsluhy p°eruÜenφ int 21h.
Tato hodnota b²vß nejΦast∞ji p°φmo vyu₧φvßna v Φßsti k≤du, kter² provßdφ volßnφ tΘto p∙vodnφ
obsluhy.
puvodni_obsluha:
pushf
db 9ah ; instrukce "call far ptr"
old_int_21h dd ? ; adresa puvodni obsluhy
Sekvence instrukcφ pushf a call far ptr je charakteristickß posloupnost pro
volßnφ p∙vodnφ obsluhy s mo₧nostφ nßvratu do u₧ivatelskΘ (v tomto p°φpad∞ virovΘ) obsluhy
p°eruÜenφ. Na ·plnΘm konci virovΘ obsluhy int 21h b²vß nßvrat z p°eruÜenφ realizovßn,
vzhledem k pot°eb∞ sprßvnΘho nastavenφ p°φznakovΘho registru, nejΦast∞ji instrukcφ retf 2
mφsto klasickΘ instrukce iret.
Po uschovßnφ adresy p∙vodnφ obsluhy nßsleduje sekvence provßd∞jφcφ vlastnφ p°esm∞rovßnφ na virovou
obsluhu p°eruÜenφ.
mov ax, cs
mov ds, ax ; DS=CS, segmentova cast
mov dx, offset obsluha_int_21h ; offsetova cast
mov ax, 2521h ; sluzba 25h, preruseni int 21h
int 21h ; vlastni volani DOSu
Nynφ mß virus zajiÜt∞no, ₧e vÜechny po₧adavky volßnφ slu₧eb DOSu budou obsluhovßny virem.
SkuteΦnost obsazenφ p°eruÜenφ int 21h je pro viry d∙le₧itß zejmΘna z hlediska jejich replikace.
V∞tÜina souborov²ch vir∙ monitoruje slu₧bu 4bh, provßd∞jφcφ spuÜt∞nφ programu. V tomto okam₧iku se toti₧
zaΦne virus zajφmat, zdali prßv∞ spuÜt∞n² program je Φi nenφ zavirovßn...
P°φm² zßpis do tabulky vektor∙ p°eruÜenφ
Snahou je vyhnout se pou₧itφ volßnφ slu₧eb DOSu 35h a 25h. Virus mß, na rozdφl od prvnφ
mo₧nosti, zajiÜt∞no, ₧e jeho operace nebudou p°ipadn∞ zachyceny rezidentnφm antivirov²m hlφdaΦem.
monitorujφcφm nebezpeΦnß volßnφ DOSu. Virus sice provßdφ stejnou Φinnost, nicmΘn∞ vÜe ve vlastnφ re₧ii
nezßvisle na operaΦnφm systΘmu.
Nejprve op∞t nßsleduje ·schova adresy p∙vodnφ obsluhy p°eruÜenφ int 21h.
xor ax, ax ; vynulovani registru AX
mov ds, ax ; segment "interrupt vector table"
les bx, ds:[21h*4] ; nacteni adresy obsluhy do BX a ES
mov word ptr cs:[old_int_21h], bx ; offsetova cast
mov word ptr cs:[old_int_21h+2], es ; segmentova cast
Hodnota ds:[21h*4] p°edstavuje offset do tabulky vektor∙ p°eruÜenφ pro p°eruÜenφ int 21h. Instrukce
les naΦte do registru BX slovo z adresy ds:[21h*4], a zßrove≥ do registru ES slovo z adresy
ds:[21h*4+2].
A nßsleduje nastavenφ vlastnφho p°esm∞rovßnφ na virovou obsluhu. P°edpoklßdejme, ₧e se nezm∞nila nulovß
hodnota data segmentu.
mov ds:[21h*4], offset obsluha_int_21h ; offsetova cast
mov ds:[21h*4+2], cs ; segmentova cast
Virus v tomto p°φpad∞ zapisuje p°φmo do systΘmovΘ Φßsti pam∞ti, konkrΘtn∞ do tabulky vektor∙ p°eruÜenφ.