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

Windows 密碼顯示器實作:全域鉤子 + WM_COPYDATA 跨程序傳遞密文

     編輯:關於C語言

利用 全域滑鼠鉤子 (WH_MOUSE) 截取游標下視窗控制代碼,呼叫 GetWindowText() 直接讀取密碼編輯框內容 (系統以明文儲存於控制項),透過 WM_COPYDATA 安全跨程序傳遞至顯示端。支援 VC6/VS2008,含 XP 視覺樣式啟用技巧。

架構總覽

PasswordViewer.exe (顯示端)
    │  WM_COPYDATA (自訂結構 PSWNOTIFY)
    ▼
PasswordViewerMouseHookDLL.dll (鉤子端,注入全系統進程)
    │  WH_MOUSE → MouseProc
    ▼
GetWindowText(hWndFromPoint) → 密碼明文

核心程式碼解析

DLL 端:共享資料區與鉤子處理


// 共享區:跨進程同步 Hook 控制碼、目標視窗、發送旗標
#pragma data_seg(".MyShare")
HHOOK g_hhk = NULL;
HWND  g_hWnd = NULL;
BOOL  g_bReadySend = TRUE;
#pragma data_seg()
#pragma comment(linker, "/SECTION:.MyShare,RWS")  // 關鍵:設定區段可讀寫共享

// 鉤子處理函式
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) {
    if (nCode == HC_ACTION) {
        PMOUSEHOOKSTRUCT p = (PMOUSEHOOKSTRUCT)lParam;
        HWND hTarget = WindowFromPoint(p->pt);  // 取得游標下真實視窗
        if (hTarget != g_hWnd && g_bReadySend) { // 避免讀取自己、同步互斥
            g_bReadySend = FALSE;
            char pwd[200];
            GetWindowText(hTarget, pwd, 200);   // 直接讀取明文
            // 封裝 WM_COPYDATA 結構
            PSWNOTIFY notify = {0};
            strcpy(notify.psw, pwd);
            notify.pt = p->pt;
            notify.hWnd = hTarget;
            COPYDATASTRUCT cds = {DWDATA_PSW_NOTIFY, sizeof(notify), ¬ify};
            SendMessage(g_hWnd, WM_COPYDATA, 0, (LPARAM)&cds);
        }
    }
    return CallNextHookEx(g_hhk, nCode, wParam, lParam);
}

// 安裝鉤子 (由 EXE 呼叫)
void SetHook(HWND hWnd) {
    g_hWnd = hWnd;
    g_hhk = SetWindowsHookEx(WH_MOUSE, MouseProc,
                             GetModuleHandle("PasswordViewerMouseHookDLL"), 0);
}

EXE 端:接收與顯示


BOOL CPasswordViewerDlg::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCds) {
    if (pCds->dwData == DWDATA_PSW_NOTIFY && !g_bReadySend) {
        PPSWNOTIFY p = (PPSWNOTIFY)pCds->lpData;
        m_strPsw = p->psw;
        m_strPos.Format("(%d,%d)", p->pt.x, p->pt.y);
        m_strHandle.Format("%p", p->hWnd);
        UpdateData(FALSE);
        g_bReadySend = TRUE;  // 釋放互斥
        return TRUE;
    }
    return CDialog::OnCopyData(pWnd, pCds);
}

// OnInitDialog 中啟動
SetHook(m_hWnd);  // 傳遞自身視窗代碼給 DLL

關鍵技術點總結

技術作用注意事項
WH_MOUSE 全域鉤子攔截全系統滑鼠訊息必須放在 DLL,SetWindowsHookEx 需傳 DLL 模組代碼
#pragma data_seg(".MyShare")跨進程共享 Hook 狀態連結器選項 /SECTION:.MyShare,RWS 必設
WM_COPYDATA安全跨程序傳遞結構化資料系統負責記憶體封送,SendMessage 同步阻塞,需 g_bReadySend 互斥
GetWindowText讀取編輯框文字 (含密碼框)Windows 內部以明文保存,無加密
Manifest 嵌入啟用 XP/Win7 視覺樣式#pragma comment(linker,"/manifestdependency:...")

執行畫面

密碼顯示器執行結果

安全性提醒

本程式僅供教學與授權測試使用。Windows 後續版本 (Vista+ UWP、CredUI) 已加強密碼控制項保護,此技術可能失效或被安全軟體攔截。請勿用於非法用途。


本文整理自「wintysのブログ」,原文出處:https://wintys.blog.51cto.com/425414/210675

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