VC 中非法探取密碼的原理及其防範

2021-04-13 04:56:02 字數 2895 閱讀 9492

引言

在windows下輸入密碼時,為了安全起見通常都以星號來遮蔽使用者輸入的密碼。如果需要在自己編寫的應用程式中需要使用者輸入密碼,通常的選擇就是選用edit控制項並設定其password屬性。雖然edit控制項的password屬性在一定程度上可以保護使用者的密碼不被視覺**,但在許多窺探密碼的黑客軟體面前卻不起任何作用,密碼將赫然暴露於攻擊者面前。顯然僅僅依靠edit控制項本身的password功能已不能勝任保護使用者密碼的作用了,這就需要我們根據此類黑客軟體的攻擊方式來採取相應的措施來阻止密碼被非法獲取。本文將首先 分析非法獲取password的原理及工作方式,然後給出用visualc++6.0來實現保護edit控制項中的 password不被非法獲取的對策。

非法獲取password的原理

edit控制項是windows的乙個常用標準控制項,當把其password屬性設為true時,就會將輸入的內容遮蔽為星號,從而達到保護的目的。雖然我們看來都是星號,但程式中的edit控制項實際仍是使用者輸入的密碼,應用程式可以獲取該控制項中的密碼,其他應用程式也可以通過某種技術手段來非法獲取edit控制項中的內容。其中最簡單的乙個方法就是從外部程式向該編輯控制項發出乙個取edit控制項內容的訊息wm_gettext或em_getline就能夠輕鬆得到想要的內容。黑客程式正是利用edit控制項的這個特性,當發現當前探測的視窗是edit控制項並且具有es_password屬性時,則通過sendmessage向此視窗傳送wm_gettext或em_getline訊息,這樣edit框中的內容就一目了然了。

黑客軟體工作方法:

黑軟在工作時,首先要確定攻擊目標,由於按鈕控制項、組合框控制項等根本就不可能是接受密碼輸入的控制項,因此要首先獲取當前待檢測的視窗控制代碼,並由此進一步判斷是否是edit控制項,這一般是通過滑鼠來指定要探測的視窗,並可在wm_mousemove訊息的響應函式中進行判斷。如果當前視窗被檢測為編輯控制項,則還需進一步獲取其視窗風格以判斷該編輯框是否是設定了password屬性的密碼輸入框,如果得到確認則向其傳送wm_gettext或em_getline訊息。為清楚起見,下面給出這部分**的詳細實現:

//將客戶座標轉換成螢幕座標

clienttoscreen(&point);

//返回乙個包含指定螢幕座標點的視窗

cwnd* pwnd = cwnd::windowfrompoint(point);

if (pwnd)}}

}} 上述**中值得注意的有以下幾個關鍵地方:

clienttoscreen(&point);

cwnd* pwnd = cwnd::windowfrompoint(point);

hwnd hwndcurr = pwnd->getsafehwnd();  

這三句**可以獲取當前滑鼠位置所在視窗的視窗控制代碼,該視窗控制代碼在呼叫sendmessage()函式傳送訊息時將要用到:

::sendmessage(hwndcurr, wm_gettext, 255, (lparam)sztext);

這便是真正起作用的sendmessage了,其第乙個引數指定了要接收訊息的視窗控制代碼,我們已經通過上面的**獲取到了,第二個引數就是讓edit控制項返回字元的wm_gettext訊息了,並將得到的內容儲存在sztext指定的緩衝區中。從而成功完成了一次完整的密碼攻擊行動。

防範措施

既然我們已經徹底分析清楚了此類黑客軟體普遍採取的攻擊手法,那麼我們自然就能制訂出一套防範其攻擊的措施來。下面我們就要對password進行保護。

首先回顧前面介紹的黑軟攻擊過程,從前面的分析可以看出:edit控制項的漏洞主要在於沒有對傳送wm_gettext或em_getline訊息者的身份進行檢查,只要能獲取到edit視窗控制代碼,任何程序都可通過其傳送wm_gettext或em_getline訊息而沒有經過任何形式的身份合法性驗證就輕易騙取到密碼內容。由此可見,為了確保密碼不被非法獲取,應當對訊息傳送者的身份進行合法性驗證,這種驗證的具體實施方法有很多種,這裡僅作為示例給出一種驗證訊息傳送者身份的方法:

首先建立乙個新的、從cedit繼承下來的子類cpasswordedit並申明全域性變數g_bsenderidentity以表明訊息傳送者的身份:

bool g_bsenderidentity;  

然後過載cwnd類的虛函式defwindowproc(),在這個**函式中進行具體的身份驗證處理:

lresultcpasswordedit::defwindowproc (uintmessage,wparamwparam,lparamlparam)

//合法獲取

g_bsenderidentity=false;

} return cedit::defwindowproc (message,wparam,lparam);

} 接下來在密碼輸入對話方塊中做些處理。在對話方塊中申明乙個類成員m_edtpassword:

cpasswordedit m_edtpassword;

並在對話方塊的初始化函式oninitdialog()中加入下列**,以完成子類化:

m_edtpassword.subclassdlgitem(idc_edit_password,this);  

這將控制與新類做關聯。之後要在對話方塊的資料交換函式中將身份設為合法:

void cdlginput::dodataexchange (cdataexchange*pdx)

cdialog::dodataexchange(pdx);

//}afx_data_map

}  經過這樣的處理,password輸入框就擁有了合法身份並受到保護。只有本應用程式能夠提取使用者輸入的密碼內容,而其他任何乙個黑客軟體也都會因為沒有合法身份而不能獲取其中的任何資訊。

結論:以上的方法僅針對vc程式,對於其他語言如vb、delphi等語言,需要借助vc做乙個password的activex控制項,實現方法與上述方法基本類似。文中給出的全部**在windows 2000 professional + sp4下由microsoft visualc++ 6.0編譯通過。 

VC 中非法探取密碼的原理及其防範

引言 在windows下輸入密碼時,為了安全起見通常都以星號來遮蔽使用者輸入的密碼。如果需要在自己編寫的應用程式中需要使用者輸入密碼,通常的選擇就是選用edit控制項並設定其password屬性。雖然edit控制項的password屬性在一定程度上可以保護使用者的密碼不被視覺 但在許多窺探密碼的黑客...

黑客非法探取密碼的原理及安全防範

一 非法獲取password的原理 edit控制項是windows的乙個標準控制項,當把其password屬性設為true時,就會將輸入的內容遮蔽為星號,從而達到保護的目的。雖然我們看來都是星號,但程式中的edit控制項實際仍是使用者輸入的密碼,應用程式可以獲取該控制項中的密碼,其他應用程式也可以通...

serv u的密碼加密原理及破解

網上目前個人發現和蒐集的專門破serv u密碼的軟體有3個,乙個是指令碼寫的,執行速度太慢,這裡就不拿出來來了,另外兩個各有所長,乙個是風藍寫的,乙個是阿呆的。兩者的區別在於前者靠的是大量的字典檔案,乙個個的實驗,直到找到符合的密碼 要是你平時有收集字典的喜好,那麼現在就是使用的最好時候 後者同樣也...