ThunderBYTE AntiVirus Rezidens programjainak keresõje

    A TBAV-vel jön egy kis TbMon nevû programocska ami azt nézi, hogy a TBAV-nek mely rezidens részei vannak betöltve a memóriába. Ezt a programot Sourcer-ral visszafejtettem, kommenteztem, stb... És most  itt van. Ezt szabadon felhasználhatod a vírusodban...
   A program elõször a DOS-tól lekéri a DOS adattábla címét, majd kiolvassa belõle az elsõ FCB  (File Control Block) címét. A FCB-n belül 0Ah címen van a "FCB-tulaj" neve. Ezt hasonlítja össze 6 névvel (TBFILXXX,TBDSKXXX, stb..). Ha talált egyet akkor azt be-mixeli a res_drivers-ba, oly módon, hogy mindegyik rezidens résznek van egy saját értéke, ami kettõnek egy hatványa. Ezeket az ertékeket egybe OR-olja, amit más programok aztán könnyedén felbonthatják úgy ahogy akarják. Ezt addig folytatja, amíg csak el nem jut az utolsó FCB-ig, majd visszatér a res_drivers értékkel.

Formater [FCF]

; TBmon.asm
TBMon           segment byte public
                assume  cs:TBMon, ds:TBMon

                org     100h
main            proc    far
start:
                jmp     real_start         ; Ugrás a program igazi elejére
program_name    db      'TbMon - ThunderBYTE Installed Device checker - '
copyright       db      '(C) 1995 ThunderBYTE B.V.',0Ah, 0Dh, 00h
res_drivers     db      0    ; Ebben tárolja a talált rezidens TBAV
                             ; programok listáját

;                           Név     nullával lezárva    Saját ‚éték
TBNames         db      'SCANX   ',        00,           01  ;000001b
                db      'TBCHKXXX',        00,           02  ;000010b
                db      'TBMEMXXX',        00,           04  ;000100b
                db      'TBFILXXX',        00,           08  ;001000b
                db      'TBDSKXXX',        00,           10h ;010000b
                db      'TBLOGXXX',        00,           20h ;100000b

;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU
;
;                       ThunderBYTE Installed Device checker
;
;UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU

real_start:     push    ax cx ds             ; Elrakjuk az ax,cx,ds-et
                push    cs                   ; \ A ds-be rakjuk a cs-t
                pop     ds                   ; /

                mov     ah,52h               ; Ez es:bx-en a DOS adattáblát
                int     21h                  ; adja vissza (get list of lists)

                les     bx,dword ptr es:[bx+22h] ; Az es:bx az elsõ FCB-re fog mutatni

scan_next_FCB:
                test    word ptr es:[bx+4],8000h ; Ha a mostani FCB-ben 8000h
                                                 ; fájl van, akkor...
                jz      next_FCB                 ; nézzük a következõ FCB-t
                mov     di,bx                    ; di<-bx
                add     di,0Ah                   ; FCB+0Ah -> név
                mov     cx,6                     ; összesen 6 rezidens TB van
                mov     si,offset TBnames        ; Az si a TB neveire mutat

scan_next_drv:  call    CompareString           ; összehasonlítjuk az si-n
                                                ; és a di-n lévõ sztringet
                add     si,9                    ; A mostani rezidens TB meghajtó
                                                ; saját értékere mutat a si
                or      ax,ax                   ; Nulla az ax? Tehát a két
                                                ; sztring nem egyezett
                jnz     next_string             ; Akkor nézzük a következõ
                                                ; TBAV nevet
                mov     al,[si]                 ; Ha mégis egyezett, akkor al-be
                                                ; rakjuk a talált TBdriver értékét
                or      res_drivers,al          ; Majd hozzá mixeljük a többi
                                                ; talált rezidens TBdriverhez

next_string:    inc     si                      ; Növeljük az si-t, hogy a
                                                ; következõ névre mutasson
                loop    scan_next_drv           ; Addig ugrik amíg cx>0, de
                                                ; minden alkalommal cx=cx-1
next_FCB:       les     bx,dword ptr es:[bx]    ; Beolvassuk a következõ FCB
                                                ; szegmens:offszet-ét.
                cmp     bx,0FFFFh               ; Utolsó FCB táblázat?
                jne     scan_next_FCB           ; Ha nem akkor vizsgáljuk át
                mov     ah,4Ch                  ; Máskülömben lépjünk ki...
                mov     al,res_drivers          ; a TB driver-ek értékével
                int     21h                     ; Kilépés...

main            endp

;ßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßßß
;                             COMPARE STRINGS
;ÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ

CompareString   proc    near
                push    di si                   ; Elrakjuk a di,si-t
                xor     ax,ax                   ; Lenullázuk az ax-et
                cld                             ; Az irány bit-et is nullázzuk
loop1:
                lodsb                           ; Az [si]->al (si=si+1)
                or      al,al                   ; Nulla? (elértük-e a sztring
                                                ; végét? )
                jz      exit_scan               ; Ha igen, akkor ki innen
                cmp     al,es:[di]              ; Hasonlítsuk össze a két
                                                ; sztring egy-egy byte-ját
                jne     not_equal               ; Ugor, ha nem egyeznek
                inc     di                      ; di=di+1
                jmp     short loop1             ; Ugrás a loop1-re
not_equal:      mov     ax,0FFFFh               ; Ha nem egyeztek akkor az ax
                                                ; FFFFh értékkel tér vissza,
exit_scan:                                      ; máskülömben az ax=0
                pop     si di                   ; Visszállítja az si,di-t
                retn                            ; Visszatér
CompareString   endp
TBMon           ends
                end     start
; --- EOF ----