 PS 9308



                  INTERRUPT TABLOSU'NU LSTELEME

                                                         Recep Tezkol


TSR virsleri, varlklarn srdrebilmek iin baz interrupt'larn vektr
tablosundaki segment ve ofset adreslerini alp, yerine bellekteki kendi alt
programlarnn adreslerini koyarlar.Bu interruptlar ounlukla 21, 1C, 25, 26,
13, 09, 08'dur.
Interrupt 21'in adresini alp yerine kendi adresini yerletiren bir virs, en
azndan altrmak istenen dosyann adn renir. Artk almasn
istediiniz dosyann kaderi virsn programcsnn elindedir. O dosyay
silebilir, ismini deitirebilir, zerine yazarak dosyay bozabilir, kendini
bulatrabilir veya son olarak elime geen bir virs gibi yaptnz herhangi
bir almay (dBASE, 1-2-3, text ktkleri) ortadan blerek bozabilir.

Bu rnekler oaltlabilir. Zaten virs programclar da bu rnekleri
oaltmak iin srekli ter dkyorlar. Interrupt 21'in virs saldrsna
urayp uramadn DOS'un DEBUG programn kullanarak anlayabilirsiniz.


    Debug' altrp:

    a <enter>,
    int 21 <enter>,
    <enter>,
    t <enter>....


DOS 5.0 kullandm iin dier DOS versiyon'larnn nasl sonu vereceini
bilmiyorum. DOS 5.0'da ilk olarak karmza iki tane NOP komutu kar. Eer
bunlarn dnda PUSHF, CMP AX, 4B00 veya baka komutlar karsa ve int 21'e
taklan yasal bir TSR'niz yoksa bilinki bellekte bir virs almaktadr.

Burada anlattm yntemi basitletirmek iin QBASIC ile bir program yazdm.
DOS 5.0 ile gelen QBASIC yorumlaycs ile altrabilirsiniz.

Ksaca interrupt vektr tablosundan bahsetmek istiyorum. Interrupt vektr
tablosu bellein 0000 segment ve 0000 ofsetinden balayarak her interrupt iin
4 baytlk bilgi olmak zere sralanr. 256 adet interrupt olduundan bellein
256*4=1024 bayt bu tabloya ayrlmtr. Bu tablodaki interrupt rutinlerinin
bellekteki segment ve ofset adreslerini renmek iin interrupt numaras 4 ile
arplr, elde edilen deer interrupt'n vektr tablosundaki 4 baytlk
bilgisinin bulunduu ofsetini verir.

Interrupt 21h'in bellekteki adresini tablodan kk bir basic program ile
renelim.

Ŀ
 10 dim a$(4)                                                              
 20 def seg = 0                                                            
 30 for x=0 to 3                                                           
 40 a$(x)=hex$(peek(&h21*4+x))                                             
 50 next                                                                   
 60 print "interrupt 21  segment :"+a$(3)+a$(2)+" offset :"+a$(1)+a$(0)    
 70 segment=val("&h"+a$(3)+a$(2))                                          
 80 offset=val("&h"+a$(1)+a$(0))                                           
 90 def seg:end                                                            


Grld gibi ilk iki baytta offset, sonraki iki baytta segment adresi
bulunur. Yukardaki esasa gre alan INTTAB.BAS, listeledii interrupt'larn
segment offset ve ilk 16 baytn verir. Bilgisayarnzn virssz olduuna
eminseniz INTTAB.BAS' altrp baz tablolarn print screen ile dkmn
alp phelendiiniz durumlarda ilk baytlar karlatrabilirsiniz.

Unutulmamas gereken bir konu da, tablolarn dkmn aldnzda ve
karlatrma yaptnzda ayn DOS versiyonunu kullanmanz gerektiidir.