如何防止Edit框中的Password不被非法獲取
發表于:2007-07-14來源:作者:點擊數:
標簽:
文/郝峰 Windows 雖然是一個功能強大的操作系統,但其存在的一些先天性不足,給黑客留下了許多可乘之機,著名的BO程序就是利用Windows的這些漏洞來危害計算機的 安全 。筆者最近發現了一個很流行的專門獲取Edit框Password的工具,甚至其源代碼已在某報紙發表
文/郝峰
Windows雖然是一個功能強大的操作系統,但其存在的一些先天性不足,給黑客留下了許多可乘之機,著名的BO程序就是利用Windows的這些漏洞來危害計算機的
安全。筆者最近發現了一個很流行的專門獲取Edit框Password的工具,甚至其源代碼已在某報紙發表,這無疑是對Edit的Password功能的完全否定。本文將首先分析非法獲取Password的原理,然后給出用Visual C++來實現保護Edit框中的Password不被非法獲取的對策。
(一) 非法獲取Password的原理
Edit是Windows的一個標準控件,當把其Password屬性設為True時,就會將輸入的內容屏蔽為星號(*),從而達到保護的目的。而Edit框中的內容可通過發WM_GETTEXT,EM_GETLINE消息來獲取。黑客程序就是利用Edit的這個特性,首先枚舉當前程序的所有子窗口,當發現枚舉的窗口是EDIT并且具有ES_PASSWORD屬性時,則通過SendMessage向此窗口發送WM_GETTEXT或EM_GETLINE消息,這樣Edit框中的內容就一目了然了。
(二) 對Password進行保護
由上述分析可看出,Edit的漏洞在于沒有檢查發送WM_GETTEXT或EM_GETLINE消息者的身份,只要找到Edit窗口句柄,任何進程都可獲取其內容。這里給出一種簡單的方法來驗證發送消息者的身份是否合法。
1) 創建新CEdit類
從CEdit繼承一個子類CPasswordEdit, 申明全局變量g_bAuthorIdentity表明消息發送者的身份:
BOOL g_bAuthorIdentity;
然后響應CWnd的虛函數DefWindowProc,在這個回調函數中進行身份驗證:
LRESULT CPasswordEdit::DefWindowProc(UINT message,
WPARAM wParam, LPARAM lParam)
{
// 對Edit的內容獲取必須通過以下兩個消息之一
if(( message == WM_GETTEXT) ||
( message == EM_GETLINE))
{
// 檢查是否為合法
if( !g_bAuthorIdentity)
{
// 非法獲取,顯示信息
AfxMessageBox(_T("我的密碼,可不能讓你看哦!"));
//
return 0;
}
// 合法獲取
g_bAuthorIdentity = FALSE;
}
return CEdit::DefWindowProc(message, wParam, lParam);
}
2) 在數據輸入對話框中做處理
在對話框中申明一個類成員m_edtPassword:
CPasswordEdit m_edtPassword;
然后在對話框的OnInitDialog()中加入下列代碼:
m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD, this);
其目的是將控制與新類做關聯。
之后在對話框的數據交換中將身份設為合法:
void CDlgInput::DoDataExchange(CDataExchange* pDX)
{
// 如果獲取數據
// 注意:對于CPropertyPage類這里不需要
if( pDX- >m_bSaveAndValidate) 條件
if( pDX- >m_bSaveAndValidate)
{
g_bAuthorIdentity = TRUE;
}
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInput)
DDX_Text(pDX, IDC_EDIT_PASSWORD, m_sPassword);
//}}AFX_DATA_MAP
}
這樣,Password輸入框就會受到保護。
(三) 需要注意的問題
以上的方法僅針對VC程序,對于
VB程序,需要借助VC做一個Password的ActiveX 控件,實現方法與上類似。同時以上程序在Visual C++6.0上通過,并且用黑客程序 PWBTool
測試通過。
原文轉自:http://www.anti-gravitydesign.com