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