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φ.