防止密碼被非法獲取 (轉)

worldblog發表於2007-12-29
防止密碼被非法獲取 (轉)[@more@]

防止密碼被獲取

作者:郝峰

----雖然是一個功能強大的操作,但其存在的一些先天性不足給

留下了許多可乘之機,著名的BO就是利用Windows的這些來危害的

。筆者最近發現了一個很流行的專門獲取Edit框Pass的工具,甚至其源代

碼已在某報紙上發表了,這無疑是對Edit的Password功能的完全否定。本文將首先

分析非法獲取Password的原理,然後給出用VisualC++來實現保護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_bAuthorntity表明訊息傳送者

的身份:

BOOLg_bAuthorIdentity;

----然後響應CWnd的虛DefWindowProc,在這個回撥函式中進行身份驗證:

LRESULTCPasswordEdit::DefWindowProc

(UINTmessage,WPARAMwParam,LPARAMlParam)

{

//對Edit的內容獲取必須透過

以下兩個訊息之一

if((message==WM_GETTEXT)

||(message==EM_GETLINE))

{

//檢查是否為合法

if(!g_bAuthorIdentity)

{

//非法獲取,顯示資訊

AfxMessageBox(_T

(“我的密碼,可不能讓你看!"));

//

return0;

}

//合法獲取

g_bAuthorIdentity=FALSE;

}

returnCEdit::DefWindowProc

(message,wParam,lParam);

}

 

 

----2.在資料輸入對話方塊中做處理

----在對話方塊中申明一個類成員m_edtPassword:

CPasswordEditm_edtPassword;

----然後在對話方塊的OnInitDialog()中加入下列程式碼:

m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD,this);

----其目的是將控制與新類做關聯。

----之後在對話方塊的資料中將身份設為合法:

voidCDlgInput::DoData

(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的控

件,實現方法與上類似。以上程式在VisualC++6.0上透過,並且用駭客程式

PWBTool測試透過。完整演示程式碼請到的“技巧”。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996102/,如需轉載,請註明出處,否則將追究法律責任。

相關文章