P°esm∞rovßnφ vektor∙ p°eruÜenφ na t∞lo viruK 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. 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. 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]. 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φ. |
||