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


    Zdroj: Computer Press, ???