e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Kdo to tam visí?

Jan Rydval

Pokud vám nestačí informace o zavěšení programů na jednotlivé interrupty v podobě, v jaké je poskytuje např. SYSINFO z balíku Norton Utilities, pak je následující program určen právě pro vás. Výše zmíněné SYSINFO uvede u každého přerušení poslední program, který přesměroval vektor přerušení na sebe. Naproti tomu je níže uvedený program kostrou programu, který umožňuje zjistit všechny programy, kterými volání přerušení prochází.

V podobě, v jaké je program uveden, vypisuje obsahy registrů CS:IP po změně registru segmentu kódu v průběhu krokování volání přerušení INT 21h, služba 9 (tisk řetězce na standardní výstup). V programu je využita možnost procesoru generovat přerušení po každé provedené instrukci. Po zapnutí režimu krokování se zavolá služba DOSu, po úpravě i BIOSu, nebo jakéhokoli softwarového přerušení, instrukcí INT x. Protože instrukce procesoru INT x by zastavila režim krokování vynulováním příznaku TF v příznakovém registru až do návratu z přerušení instrukcí IRET, je nutné instrukci INT x interpretovat. Při TF=1 se po každé instrukci vyvolá přerušení INT 1 a obsluha tohoto přerušení porovná zaznamenaný obsah CS s aktuálním. Došlo-li ke změně, CS:IP se uloží do tabulky. Tabulka se nakonec vypíše na obrazovku.

Použijeme-li informace o nedokumentovaných funkcích DOSu (viz Nedokumentovaný DOS, Bajt 6/91, str. 53) k rozšíření uvedeného programu, lze získat kompletní výpis i se jmény vlastníků úseků paměti, kudy volání přerušení prošlo, tedy seznam programů na sledovaném přerušení postupně zavěšených.

Překlad a sestavení se provede postupem:

TASM TRACE21 TLINK TRACE21 /T .model tiny .code org 100h LEN = 100 ;Délka tabulky PrintStr macro mes mov dx, offset mes mov ah, 9 int 21h endm Start: push cs pop ds PrintStr logo ;Úvodní info push cs pop ax call PrintInt ;Vypiš obsah CS call NewLine mov ax, 2501h mov dx, offset INT1 int 21h ;Nová obsluha INT1 pushf pop ax or ah, 1 push ax popf ;Povol přerušeni mov dx, offset msg21 mov ah, 9 int 21h ;Sledované volání INT21 pushf pop ax and ah, 0feh push ax popf ;Zákaz přerušení call PrintIt ;Vypiš výsledky trasovaní mov ax, 4c00h int 21h ;Ukonči program PrintIt proc near PrintStr msgINT1 mov ax, count call PrintInt call NewLine PrintStr msgXCS mov ax, countcs call PrintInt call NewLine PrintStr list mov bx, offset buffer PrintOp: inc bx inc bx mov cx, [bx] inc bx inc bx mov ax, [bx] call PrintInt PrintStr msgcol mov ax, cx call PrintInt PrintStr msgsp cmp bx, codind jb PrintOp call NewLine ret PrintIt endp INT1 proc far push ax ;Místo pro Flagy push ax ;Místo pro CS push ax ;Místo pro IP push bp mov bp,sp ;[bp+8]=IP +10=CS +12=Flagy push ax ;Ulož použité registry push bx push cx push ds push cs pop ds ;Nastav DS=CS inc count ;Zvětši čítač INT1 mov ax, [bp+10] ;Přečti CS mov cx, [bp+8] ;Přečti IP mov bx, codind ;Ukazatel do tabulky cmp bx, offset buffer+4*(LEN-1)-1 ja INT1lbl2 ;Nejsem mimo tabulku? cmp ax, [bx] ;Změnil se CS? je INT1lbl2 ;Nezměnil = skok inc countcs inc bx inc bx mov [bx], cx ;Zapiš IP do tabulky inc bx inc bx mov [bx], ax ;Zapiš CS do tabulky mov codind, bx ;Aktualizace ukazatele INT1lbl2: mov ds, ax mov bx, cx mov ax, [bx] ;Prečti další OP kod cmp al, 0cdh jne INT1lbl1 ;Je další OP INTx? mov al, ah ;Interpretace INT x xor ah, ah mov cl, 2 shl ax, cl mov bx, ax xor ax, ax mov ds, ax mov ax, [bx] ;Přečti adresu int. vektoru inc bx inc bx mov bx, [bx] add word ptr [bp+8], 2 ;IP na zás. + 2 mov [bp+6], bx ;Přichystej adresu pro RET mov [bp+4], ax mov ax, [bp+12] mov [bp+2], ax ;Ještě ulož flagy pro obnovu pop ds pop cx pop bx pop ax pop bp popf ret INT1lbl1: pop ds pop cx pop bx pop ax pop bp pop ax pop ax pop ax iret INT1 endp NewLine proc near mov dx, offset nl mov ah, 9 int 21h ret NewLine endp PrintInt proc near ;Vytiskne AX v hex push cx mov cx, 4 Repete: push cx mov cl, 4 rol ax, cl push ax and al, 0fh add al, 30h cmp al, 39h jbe PrintInt1 add al, 7 PrintInt1: mov ah, 2 mov dl, al int 21h pop ax pop cx loop Repete pop cx ret PrintInt endp .data count dw 0 countcs dw 0 codind dw offset buffer logo db "****** Trasování INT 21" db " *******", 0dh, 0ah, 0ah db "Trasovaní INT21h, služba " db "PrintString (AH=09h)", 0dh, 0ah, 0ah msgcode db "Kódový segment programu = $" msgcol db ":$" msg21 db "*$",0dh, 0ah msgINT1 db "Počet provedených instrukcí =" msgsp db " $" msgXCS db "Počet změn CS = $" list db "Seznam změn CS [nové CS:IP po INTx, " db " CALLfar, JMPfar, RETfar..]" nl db 0dh, 0ah, "$" buffer dd LEN dup ( 0 ) end Start


Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC