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