首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

星號密碼查看工具原理深度解析:從 Windows 消息機制到安全防禦

     編輯:程式設計綜合問答

現象觀察

所謂「星號密碼查看器」(如 Bullet)能將輸入框中的掩碼(●●●)還原為明文。實測發現:對普通網頁、傳統軟體有效;對 QQ 等加強保護的輸入框則無法獲取明文,甚至無法捕獲輸入行為。

核心原理:Windows 子窗口與 EM_SETPASSWORDCHAR

密碼輸入框本質是一個 Windows 子窗口,其顯示星號是因為設置了 EM_SETPASSWORDCHAR 消息屬性。查看器的核心手段是:

  1. 安裝全局鼠標鉤子(SetWindowsHookEx),監聽用戶點擊行為。
  2. 判斷點擊目標是否為密碼輸入框(通過 GetClassName 驗證類名為 "Edit" 且樣式含 ES_PASSWORD)。
  3. 向該窗口發送 EM_SETPASSWORDCHAR 消息,將密碼字符設置為 0(即移除掩碼),使明文顯示。
  4. 讀取窗口文本(WM_GETTEXT)獲取明文密碼。

為何會失效?

  • 自繪控件/非標準 Edit 控件: 如 Qt、Electron、Chrome 渲染的輸入框,非 Windows 原生 Edit,無 EM_SETPASSWORDCHAR 機制。
  • 安全機制攔截: QQ 等安全軟體通過鉤子過濾、窗口子類化、或設置 ES_PASSWORD 之外的保護(如輸入法保護模式),阻止外部消息修改屬性或讀取文本。
  • 權限隔離: 高完整性級別進程無法向低完整性級別進程發送消息(UIPI 機制)。

傳輸機制澄清

密碼在本地輸入框以明文存在於進程內存中,僅顯示時被掩碼。網絡傳輸時應經過 TLS 加密,查看器僅攻擊「本地顯示層」,而非網絡傳輸層。

防禦建議

  • 開發者:使用自繪控件、啟用 UIPI、設置 ES_PASSWORD 並子類化窗口過濾 EM_SETPASSWORDCHAR 消息。
  • 用戶:不輕信「通用查看器」,使用密碼管理器自動填充,避免手動輸入;啟用雙因子認證(2FA)。

理解底層消息機制,才能真正看清「星號背後的真相」,也能構建更安全的輸入體驗。

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