首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

INTHAND:鍵盤中斷攔截與 TSR 常駐程式範本

     編輯:組合語言

前言:鍵盤過濾器與熱鍵觸發的基礎架構

在 DOS 環境下,攔截鍵盤中斷 (INT 16h BIOS 鍵盤服務 或 INT 09h 硬體中斷) 是實作熱鍵啟動 TSR、鍵盤記錄器、輸入法編輯器、遊戲作弊器的核心技術。INTHAND.ASM 提供一個極精簡的範本:攔截 INT 16h (AH=00h/01h/02h 等鍵盤功能),將所有呼叫轉發給原始處理常式,並以 INT 27h 常駐結束。程式碼不含實際過濾邏輯,但完整展示了「取得向量 → 保存 → 設定新向量 → 常駐」的標準流程。

程式結構與關鍵步驟

  1. 進入點 startup:JMP setup 跳過常駐區資料/程式碼,直接執行安裝邏輯。
  2. 新中斷處理常式 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 此處或為防禦性設計。
  3. 資料區:
    save db 0
    interupt label dword
    vector db 8 dup(0)   ; 4 位元組足夠 (IP+CS),保留 8 位元組對齊
  4. 安裝邏輯 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

技術細節深度解析

1. 中斷向量表 (IVT) 操作

  • INT 21h, AH=35h:取得指定中斷向量,回傳 ES:BX = 向量位址 (段:偏移)。
  • INT 21h, AH=25h:設定中斷向量,DS:DX = 新處理常式位址。此處 DS=CS,因程式採 .COM 格式單段結構。
  • 向量儲存於 vector (雙字),供 setcom 間接呼叫 (CALL cs:[interupt])。

2. 常駐終止 (INT 27h)

INT 27h 以 DX = 常駐區大小 (段落單位? 實際為位元組偏移) 終止程式但保留記憶體。此處 DX = offset setup 表示從 PSP 起始到 setup 標籤前的所有程式碼/資料將常駐。setup 之後的安裝邏輯碼將被釋放。這是 TSR 程式的標準常駐方式 (另一種為 INT 21h, AH=31h 指定段落數)。

3. 中斷鏈結與重入考量

  • setcom 直接 CALL cs:[interupt] 轉發,未修改暫存器/參數,屬「透明攔截」。
  • 若多個 TSR 攔截同一中斷,形成鏈結:新 TSR → 舊 TSR → ... → 原始 BIOS。順序由安裝順序決定。
  • 重入風險:若 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 (讀取鍵碼),記錄按鍵序列至緩衝區/檔案。
  • 輸入法/鍵盤佈局切換:修改回傳鍵碼映射。
  • 攔截 INT 09h (硬體中斷):更底層,可捕捉所有按鍵下行/上行掃描碼,但需自行處理鍵盤控制器 (8042) 通訊、E0/E1 前導碼、斷碼/作碼轉換,複雜度高得多。

教學價值

  • 展示 TSR 程式最小骨架:JMP setup / 向量保存/設定 / INT 27h。
  • 示範 中斷向量獲取/設定 (INT 21h, 35h/25h) 標準 API 用法。
  • 說明 遠端呼叫轉發 (CALL FAR PTR) 維持中斷鏈結完整性。
  • 揭示 COM 格式單段結構 (ORG 100h, CS=DS=ES=SS) 簡化段暫存器管理。

INTHAND 雖無實際功能,卻是所有 DOS 鍵盤相關 TSR、病毒、防毒監控器、熱鍵工具的共同祖先。理解其機制,即掌握了 x86 即時模式下中斷攔截的核心樞紐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved