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

禁用 Ctrl+Alt+Del 經典實作:CTRLADEL 組合語言源碼深度解析

     編輯:組合語言

歷史背景與動機

CTRLADEL(NOCAD)由 Antonio Quezada-Duarte 於 1989 年編寫,針對 DOS 2.0+ 環境,透過攔截鍵盤中斷(INT 09h)過濾 Ctrl+Alt+Del 組合鍵,防止使用者誤觸發系統重啟。作者在標題以大量警語強調:載入後僅能透過關機、Reset 鍵或產生 INT 19h 重啟,且必須在 SideKick 等 TSR 程式之前載入,否則無效。

核心機制:鍵盤中斷鉤掛與過濾

安裝流程(BEGIN)

  1. 檢查向量 INT 0CDh 是否已指向本程式版權字串(防重複安裝標記)
  2. INT 21h/3509h 取得原 INT 09h 處理器位址 → 儲存於 OLD_INT_9_OFS/SEG
  3. INT 21h/2509h 設定新 INT 09h 指向 NEW_INT_9H
  4. INT 21h/25CDh 將 INT 0CDh 指向版權字串(常駐標記)
  5. INT 21h/3100h (TSR) 常駐保留前段記憶體(含代碼、資料、堆疊)

新 INT 09h 處理器(NEW_INT_9H)

PUSH AX, DS
XOR AX, AX ; DS=0000h (BIOS 資料區段)
MOV AL, DS:[417h] ; 鍵盤旗標位元組
AND AL, CTRL+ALT  ; 只保留 Ctrl(bit2) 與 Alt(bit3)
CMP AL, CTRL+ALT  ; 兩鍵同時按下?
JNE GO_AHEAD      ; 否 → 直接轉交原處理器
AND BYTE PTR DS:[417h], NOT ALT ; 清除 Alt 旗標,欺騙 BIOS 以為未按 Alt
GO_AHEAD:
PUSHF
DB 9Ah, OLD_INT_9_OFS, OLD_INT_9_SEG ; 硬編碼 CALL FAR 原處理器
POP DS, AX
IRET

關鍵技術細節

  • BIOS 鍵盤旗標位址:0000:0417h,Bit 2=Left Ctrl, Bit 3=Left Alt, Bit 5=Right Ctrl, Bit 6=Right Alt。程式僅檢查左鍵組合,右鍵組合仍可觸發重啟(作者未處理)。
  • 硬編碼遠端 CALL:DB 9Ah, OFFSET, SEGMENT 直接嵌入機器碼,避免間接記憶體存取,節省指令位元組與時脈。
  • 旗標暫存器保留:PUSHF 將原處理器所需的 Flags 傳遞下去,確保 BIOS 例程正常運作。
  • 防重複安裝機制:利用閒置向量 INT 0CDh 儲存版權字串作為「已安裝」標記,極具巧思。

局限與風險

  • 僅攔截 BIOS 層面的 Ctrl+Alt+Del,若程式直接產生 INT 19h 或操作鍵盤控制器命令位元組(60h/64h)仍可重啟
  • 若先載入 SideKick 等攔截 INT 09h 的 TSR,NOCAD 的鉤子會在 SideKick 之後,導致過濾失效
  • DOS 6.0+ 內建 KEYB.COM / DOSKEY 可能改變鍵盤處理流程

現代啟示

雖然現代作業系統在核心層處理 Ctrl+Alt+Del(Windows Secure Attention Sequence、Linux ctrlaltdel 系統呼叫),但「中斷鉤掛、旗標篩選、狀態竄改、鏈式轉發」這套 TSR 核心模式,在 UEFI 執行階段驅動、Hypervisor 中斷虛擬化、EDR 核心回調監控中依然是基礎範式。

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