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

VxD 核心程式設計:Client Register Structure 客戶暫存器結構完整解析與 INT 21h 實戰範例

     編輯:組合語言

前言

VxD 作為系統監管者,透過修改被中斷程式的暫存器映像來影響其行為。Client_Reg_Struc 正是 VMM 保存中斷點暫存器狀態的關鍵結構。本文完整解析結構佈局、V86/保護模式雙線程映射、位址取得方式,並以動態 VxD 呼叫 INT 21h AH=2 輸出蜂鳴字元為實戰範例。

Client_Reg_Struc 完整定義

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

雙組暫存器意義

  • 每個 VM 可能同時有 V86 執行緒 與 保護模式執行緒。
  • 中斷發生時:Client_xxx 存放 當前執行緒 暫存器,Client_Alt_xxx 存放 另一執行緒 暫存器。
  • V86 執行中中斷 → 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 切換視圖。

取得 Client_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

實戰範例:動態 VxD 呼叫 INT 21h AH=2 輸出蜂鳴

完整原始碼

.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

關鍵步驟解析

  1. Push_Client_State / Pop_Client_State:保護/還原完整暫存器組,防止干擾被中斷程式。
  2. Begin_Nest_V86_Exec / End_Nest_Exec:建立/銷毀 V86 模擬執行環境,所有 V86 中斷模擬必須在這對巨集內進行。
  3. ASSUME EBP:PTR Client_Byte_Reg_Struc:以位元組視圖修改 DL、AH。
  4. Exec_Int:EAX 置中斷號,模擬中斷呼叫,返回後暫存器映像已更新。

進階應用場景

場景操作關鍵暫存器
檔案讀寫攔截修改 INT 21h AH=3Dh/3Fh/40h 參數DS:DX (檔名), BX (控制代碼), CX (長度)
鍵盤輸入過濾修改 INT 16h AH=00h/01h 返回值AX (鍵碼), CF (狀態)
強制程式返回修改 Client_EIP/Client_CSEIP, CS
權限提升檢查檢查 Client_CS (Ring 0/3 判斷)CS (RPL 位)

注意事項與最佳實務

  • 最小化修改:僅改動必要暫存器,避免副作用。
  • 巢狀層級:Begin_Nest_V86_Exec 可巢狀,但必須嚴格配對 End_Nest_Exec。
  • 效能:頻繁中斷模擬會影響系統回應,關鍵路徑考慮改用 Hook 服務 (Hook_V86_Int_Chain)。
  • 除錯:使用 DBOCODE 段輸出診斷訊息,配合 VMMCall Debug_Out。

總結

Client_Reg_Struc 是 VxD 操控應用程式行為的「遙控器」。掌握其佈局、雙組暫存器意義、位址取得方式、巢狀 V86 執行框架,即可實現系統呼叫攔截、參數修改、行為重導向等核心功能。本文範例展示了最基礎的 INT 21h 模擬呼叫,是開發檔案系統過濾器、行為監控、安全產品等 Ring-0 元件的必修內功。

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