VxD 作為系統監管者,透過修改被中斷程式的暫存器映像來影響其行為。Client_Reg_Struc 正是 VMM 保存中斷點暫存器狀態的關鍵結構。本文完整解析結構佈局、V86/保護模式雙線程映射、位址取得方式,並以動態 VxD 呼叫 INT 21h AH=2 輸出蜂鳴字元為實戰範例。
Client_Reg_Struc STRUC
Client_EDI DD ?
Client_ESI DD ?
Client_EBP DD ?
Client_res0 DD ?
Client_EBX DD ?
Client_EDX DD ?
Client_ECX DD ?
Client_EAX DD ?
Client_Error DD ?
Client_EIP DD ?
Client_CS DW ?
Client_res1 DW ?
Client_EFlags DD ?
Client_ESP DD ?
Client_SS DW ?
Client_res2 DW ?
Client_ES DW ?
Client_res3 DW ?
Client_DS DW ?
Client_res4 DW ?
Client_FS DW ?
Client_res5 DW ?
Client_GS DW ?
Client_res6 DW ?
; 替代暫存器組 (另一執行緒)
Client_Alt_EIP DD ?
Client_Alt_CS DW ?
Client_Alt_res7 DW ?
Client_Alt_EFlags DD ?
Client_Alt_ESP DD ?
Client_Alt_SS DW ?
Client_Alt_res8 DW ?
Client_Alt_ES DW ?
Client_Alt_res9 DW ?
Client_Alt_DS DW ?
Client_Alt_res10 DW ?
Client_Alt_FS DW ?
Client_Alt_res11 DW ?
Client_Alt_GS DW ?
Client_Alt_res12 DW ?
Client_Reg_Struc ENDS
Client_xxx 存放 當前執行緒 暫存器,Client_Alt_xxx 存放 另一執行緒 暫存器。Client=V86 狀態,Client_Alt=PM 狀態;反之亦然。Client_Byte_Reg_Struc:Client_AL, Client_AH, Client_DL 等位元組欄位。Client_Word_Reg_Struc:Client_AX, Client_DX 等字欄位。ASSUME EBP:PTR Client_Byte_Reg_Struc 切換視圖。VMMCall Get_Cur_VM_Handle ; EBX = 當前 VM 控制代碼 (VCB 線性位址)
assume ebx:ptr cb_s
mov ebp, [ebx].CB_Client_Pointer ; EBP → Client_Reg_Struc
cb_s (VM Control Block) 關鍵欄位:
cb_s STRUC
CB_VM_Status DD ?
CB_High_Linear DD ?
CB_Client_Pointer DD ? ; ← 目標指標
CB_VMID DD ?
CB_Signature DD ?
cb_s ENDS
.386p
include vmm.inc
include vwin32.inc
include v86mmgr.inc
DECLARE_VIRTUAL_DEVICE BEEPVXD, 1, 0, BEEPVXD_Control, \
UNDEFINED_DEVICE_ID, UNDEFINED_INIT_ORDER
Begin_Control_Dispatch BEEPVXD
Control_Dispatch W32_DeviceIoControl, OnDeviceIoControl
End_Control_Dispatch BEEPVXD
VXD_LOCKED_CODE_SEG
VXD_LOCKED_CODE_ENDS
VXD_PAGEABLE_CODE_SEG
BeginProc OnDeviceIoControl
assume esi:ptr DIOCParams
.if [esi].dwIoControlCode == 1
Push_Client_State ; 保存客戶暫存器狀態
VMMCall Begin_Nest_V86_Exec ; 進入 V86 巢狀執行區塊
assume ebp:ptr Client_Byte_Reg_Struc
mov [ebp].Client_DL, 7 ; DL = 07h (BEL 蜂鳴字元)
mov [ebp].Client_AH, 2 ; AH = 02h (顯示字元功能)
mov eax, 21h ; 中斷號 21h
VMMCall Exec_Int ; 模擬執行 INT 21h
VMMCall End_Nest_Exec ; 結束巢狀執行
Pop_Client_State ; 還原客戶暫存器
.endif
xor eax, eax
ret
EndProc OnDeviceIoControl
VXD_PAGEABLE_CODE_ENDS
end
Push_Client_State / Pop_Client_State:保護/還原完整暫存器組,防止干擾被中斷程式。Begin_Nest_V86_Exec / End_Nest_Exec:建立/銷毀 V86 模擬執行環境,所有 V86 中斷模擬必須在這對巨集內進行。ASSUME EBP:PTR Client_Byte_Reg_Struc:以位元組視圖修改 DL、AH。Exec_Int:EAX 置中斷號,模擬中斷呼叫,返回後暫存器映像已更新。| 場景 | 操作 | 關鍵暫存器 |
|---|---|---|
| 檔案讀寫攔截 | 修改 INT 21h AH=3Dh/3Fh/40h 參數 | DS:DX (檔名), BX (控制代碼), CX (長度) |
| 鍵盤輸入過濾 | 修改 INT 16h AH=00h/01h 返回值 | AX (鍵碼), CF (狀態) |
| 強制程式返回 | 修改 Client_EIP/Client_CS | EIP, CS |
| 權限提升檢查 | 檢查 Client_CS (Ring 0/3 判斷) | CS (RPL 位) |
Begin_Nest_V86_Exec 可巢狀,但必須嚴格配對 End_Nest_Exec。Hook_V86_Int_Chain)。DBOCODE 段輸出診斷訊息,配合 VMMCall Debug_Out。Client_Reg_Struc 是 VxD 操控應用程式行為的「遙控器」。掌握其佈局、雙組暫存器意義、位址取得方式、巢狀 V86 執行框架,即可實現系統呼叫攔截、參數修改、行為重導向等核心功能。本文範例展示了最基礎的 INT 21h 模擬呼叫,是開發檔案系統過濾器、行為監控、安全產品等 Ring-0 元件的必修內功。