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

SuperPasswordSpy++:桌面程式與 IE 瀏覽器密碼框偵測工具深度解析

     編輯:關於VC++

前言

本文介紹一款名為 SuperPasswordSpy++ 的工具,能夠偵測並顯示桌面應用程式與 Internet Explorer 網頁中的密碼編輯框內容。文章詳細剖析其架構設計、鉤子注入機制、IE COM 介面操作、反偵測對抗技術等核心實現細節,並提供完整原始碼參考。

一、工具架構與兩種鉤子策略比較

工具採用「放大鏡」追蹤滑鼠位置,識別目標視窗類別名與樣式,判斷是否為密碼編輯框或 IE 控件(Internet Explorer_Server 類別)。若為 IE,需將鉤子 DLL 注入目標進程以枚舉網頁密碼欄位。

策略一:WH_GETMESSAGE 鉤子(非阻塞)

  1. Spy 程式注入鉤子 DLL 至目標進程
  2. Post 用戶自訂訊息至目標視窗
  3. DLL 攔截訊息,讀取密碼框內容
  4. DLL 透過 WM_COPYDATA 回傳資料
  5. Spy 程式接收資料並卸載鉤子

缺點:非同步特性導致視窗切換時舊進程的 WM_COPYDATA 可能遲到,需在資料中攜帶視窗句柄以辨識來源。

策略二:WH_CALLWNDPROC 鉤子(阻塞,採用)

流程類似,但第 2 步改用 SendMessage 發送訊息,DLL 內部以 SendMessage(WM_COPYDATA) 回傳。阻塞特性保證資料回傳完成才繼續,邏輯更簡單,類似阻塞式 Socket 編程。雖同一視窗多密碼框會重複注入,但開銷可忽略。

二、核心實現細節

1. 從 HWND 取得 IHTMLDocument2(參考 MSDN KB Q249232)

BOOL HWnd2HtmlDocument() {
    CoUninitialize();
    HINSTANCE hInst = LoadLibrary(_T("OLEACC.DLL"));
    UINT nMsg = RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
    LRESULT lRes;
    SendMessageTimeout(g_hTarget, nMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, (DWORD*)&lRes);
    LPFNOBJECTFROMLRESULT pf = (LPFNOBJECTFROMLRESULT)GetProcAddress(hInst, "ObjectFromLresult");
    CLSID uuidDoc; CLSIDFromString(L"{626fc520-a41e-11cf-a731-00a0c9082637}", &uuidDoc); // IID_IHTMLDocument2
    HRESULT hr = (*pf)(lRes, uuidDoc, 0, (void**)&g_lpHTMLDocument2);
    FreeLibrary(hInst); CoUninitialize();
    return SUCCEEDED(hr);
}

注意:未導航的 WebBrowser ActiveX 控件不會建立 Internet Explorer_Server 視窗,需特別處理。

2. 檢查網頁是否包含密碼輸入欄位

DWORD CheckHtmlDocument() {
    IHTMLElementCollection* pAll; g_lpHTMLDocument2->get_all(&pAll);
    long len; pAll->get_length(&len);
    DWORD cnt = 0;
    for (int i=0; iitem(CComVariant(i), CComVariant(i));
        IHTMLInputElementPtr pInput; if (FAILED(pItem->QueryInterface(&pInput))) { pItem->Release(); continue; }
        if (pInput->Gettype() == _bstr_t("password")) ++cnt;
        pItem->Release();
    }
    pAll->Release(); return cnt;
}

3. 讀取密碼值

_bstr_t val = pInput->Getvalue(); LPCTSTR pwd = (LPCTSTR)val; // 即可取得明文密碼

三、密碼編輯框判斷邏輯

BOOL IsPasswordEdit(HWND hWnd) {
    TCHAR cls[64]; GetClassName(hWnd, cls, 64);
    if (lstrcmp(cls,_T("Edit")) && lstrcmp(cls,_T("TEdit")) && lstrcmp(cls,_T("ThunderTextBox"))) return FALSE;
    return (GetWindowLong(hWnd, GWL_STYLE) & ES_PASSWORD) == ES_PASSWORD;
}

涵蓋標準 Edit、Borland TEdit、VB ThunderTextBox 三大常見類別,但未來新類別需自行擴充。

四、進階主題:多 Frame 支援、Winlogon 桌面、反偵測對抗

  • 多 Frame:目前版本假設單 Frame,下一版將支援巢狀 Frame 遞迴枚舉。
  • Win2K 登入密碼:以 SYSTEM 身分在 Winlogon 桌面啟動工具(需 GUI-RunAs 類工具),可讀取「變更密碼」對話框內容。Win2003 以上失效。
  • 反偵測範例:自訂 CAntiPeekEdit 覆寫 WindowProc,攔截 WM_GETTEXT,僅允許特定緩衝區長度(如 1024)讀取真實內容,否則回傳假資料。
  • 破解反偵測:在遠端進程建立標準 Edit 控件,取得其 GWLP_WNDPROC,暫時替換目標視窗程序,呼叫 WM_GETTEXT 後還原。

五、相關工具延伸

  • MessengerSpy++:偵測 MSN/Windows Messenger 聊天內容(含 RTF 與表情),支援發送訊息。
  • WinXP「變更使用者密碼」控制台程式:密碼欄位包裹於 ActiveX(CLSID: A5064426-D541-11D4-9523-00B0D022CA64),極難提取。

六、總結

SuperPasswordSpy++ 整合 Windows 鉤子、COM 介面、跨進程記憶體操作等技術,展示了密碼框偵測的完整攻防體系。開發者可參考其架構設計鉤子工具,亦可研究反偵測機制強化自家軟體安全性。

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