如何防止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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97