在 DOS 環境下,攔截鍵盤中斷 (INT 16h BIOS 鍵盤服務 或 INT 09h 硬體中斷) 是實作熱鍵啟動 TSR、鍵盤記錄器、輸入法編輯器、遊戲作弊器的核心技術。INTHAND.ASM 提供一個極精簡的範本:攔截 INT 16h (AH=00h/01h/02h 等鍵盤功能),將所有呼叫轉發給原始處理常式,並以 INT 27h 常駐結束。程式碼不含實際過濾邏輯,但完整展示了「取得向量 → 保存 → 設定新向量 → 常駐」的標準流程。
startup:JMP setup 跳過常駐區資料/程式碼,直接執行安裝邏輯。setcom:
setcom proc far
pushf
call cs:[interupt] ; 呼叫原始 INT 16h 處理常式
RET 2 ; 遠端返回,清除 2 位元組參數 (若有)
setcom endp
使用 PUSHF / CALL far ptr 模擬 INT 指令行為 (手動推入旗標、遠端呼叫),RET 2 對應原 IRET 清除旗標 + 可能的參數。注意:標準 INT 16h 無參數,RET 2 此處或為防禦性設計。save db 0
interupt label dword
vector db 8 dup(0) ; 4 位元組足夠 (IP+CS),保留 8 位元組對齊
setup:
mov ah, 35h ; Get Interrupt Vector
mov al, 16h ; INT 16h
int 21h
mov word ptr vector, bx ; 儲存原始 IP
mov bx, es
mov word ptr vector+2, bx ; 儲存原始 CS
mov dx, offset setcom ; 新處理常式偏移
mov ax, cs
mov ds, ax ; DS=CS (同段)
mov ah, 25h ; Set Interrupt Vector
mov al, 16h
int 21h
mov dx, offset setup ; 常駐大小 = setup 之前的所有碼/資料
int 27h ; Terminate and Stay Resident
INT 21h, AH=35h:取得指定中斷向量,回傳 ES:BX = 向量位址 (段:偏移)。INT 21h, AH=25h:設定中斷向量,DS:DX = 新處理常式位址。此處 DS=CS,因程式採 .COM 格式單段結構。vector (雙字),供 setcom 間接呼叫 (CALL cs:[interupt])。INT 27h 以 DX = 常駐區大小 (段落單位? 實際為位元組偏移) 終止程式但保留記憶體。此處 DX = offset setup 表示從 PSP 起始到 setup 標籤前的所有程式碼/資料將常駐。setup 之後的安裝邏輯碼將被釋放。這是 TSR 程式的標準常駐方式 (另一種為 INT 21h, AH=31h 指定段落數)。
setcom 直接 CALL cs:[interupt] 轉發,未修改暫存器/參數,屬「透明攔截」。setcom 內部呼叫 DOS 功能 (INT 21h) 可能導致重入錯誤 (DOS 非重入)。範本未處理此問題,實際 TSR 需檢查 InDOS 標誌 (位於 INT 21h, AH=34h 回傳位址) 或使用關中斷/旗標保護。progseg segment para public 'CODE'
public setcom
assume cs:progseg, ds:progseg, es:progseg
org 100h
doscall equ 21h
oldint equ 16h
startup proc far
jmp setup
setcom proc far
pushf
call cs:[interupt]
RET 2
setcom endp
save db 0
interupt label dword
vector db 8 dup(0)
setup:
mov ah,35h
mov al,oldint
int doscall
mov word ptr vector,bx
mov bx,es
mov word ptr vector+2,bx
mov dx,offset setcom
mov ax,cs
mov ds,ax
mov ah,25h
mov al,oldint
int doscall
mov dx,offset setup
int 27h
startup endp
progseg ends
end startup
setcom 中檢查 AH=01h (檢查鍵盤狀態) 回傳的掃描碼/ASCII,匹配熱鍵組合 (如 Ctrl+Alt+X) 則啟動 TSR 主功能 (彈出選單、截圖、宏播放)。AH=00h (讀取鍵碼),記錄按鍵序列至緩衝區/檔案。JMP setup / 向量保存/設定 / INT 27h。INTHAND 雖無實際功能,卻是所有 DOS 鍵盤相關 TSR、病毒、防毒監控器、熱鍵工具的共同祖先。理解其機制,即掌握了 x86 即時模式下中斷攔截的核心樞紐。