利用 全域滑鼠鉤子 (WH_MOUSE) 截取游標下視窗控制代碼,呼叫 GetWindowText() 直接讀取密碼編輯框內容 (系統以明文儲存於控制項),透過 WM_COPYDATA 安全跨程序傳遞至顯示端。支援 VC6/VS2008,含 XP 視覺樣式啟用技巧。
PasswordViewer.exe (顯示端)
│ WM_COPYDATA (自訂結構 PSWNOTIFY)
▼
PasswordViewerMouseHookDLL.dll (鉤子端,注入全系統進程)
│ WH_MOUSE → MouseProc
▼
GetWindowText(hWndFromPoint) → 密碼明文
// 共享區:跨進程同步 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);
}
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