<html>
<head>
<title>无标题文档</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link rel="stylesheet" href="../css/jinhuaben.css" type="text/css">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<table width="600" border="0" cellspacing="0" cellpadding="0" align="center">
  <tr> 
    <td> 
      <p class="unnamed1">用VC实现保护Edit框中的Password</p>
      <p class="neirong">Windows虽然是一个功能强大的操作系统，但其存在的一些先天性不足，给黑客留下了许多可乘之机。笔者最近发现了一个很流行的专门获取Edit框Password的工具，甚至其源代码已在网上发表，这无疑是对Edit的Password功能的完全否定。本文将首先分析非法获取Password的原理，然后给出用Visual 
        C++来实现保护Edit框中的Password不被非法获取的对策。 <br>
        <span class="unnamed2">一、非法获取Password的原理</span> <br>
        Edit是Windows的一个标准控件，当把其Password属性设为True时,就会将输入的内容屏蔽为星号(*)，从而达到保护的目的。而Edit框中的内容可通过发WM_GETTEXT,EM_GETLINE消息来获取。黑客程序就是利用Edit的这个特性，首先枚举当前程序的所有子窗口，当发现枚举的窗口是EDIT并且具有ES_PASSWORD属性时，则通过SendMessage向此窗口发送WM_GETTEXT或EM_GETLINE消息，这样Edit框中的内容就一目了然了。 
        <br>
        <span class="unnamed2">二、 对Password进行保护</span> <br>
        由上述分析可看出，Edit的漏洞在于没有检查发送WM_ GETTEXT或EM_GETLINE消息者的身份，只要找到Edit窗口句柄，任何进程都可获取其内容。这里给出一种简单的方法来验证发送消息者的身份是否合法。 
        <br>
        1.创建新CEdit类 <br>
        从CEdit继承一个子类CPasswordEdit，申明全局变量g_bAuthorIdentity表明消息发送者的身份： <br>
        BOOL g_bAuthorIdentity;<br>
        然后响应CWnd的虚函数DefWindowProc，在这个回调函数中进行身份验证:：<br>
        LRESULT CPasswordEdit::DefWindowProc(UINT message,<br>
        WPARAM wParam, LPARAM lParam) <br>
        {<br>
        // 对Edit的内容获取必须通过以下两个消息之一<br>
        if(( message == WM_GETTEXT) || <br>
        ( message == EM_GETLINE))<br>
        {<br>
        // 检查是否为合法<br>
        if( !g_bAuthorIdentity)<br>
        {<br>
        // 非法获取,显示信息<br>
        AfxMessageBox(_T(&quot;我的密码,可不能让你看哦!&quot;));<br>
        // <br>
        return 0;<br>
        }<br>
        // 合法获取<br>
        g_bAuthorIdentity = FALSE;<br>
        }<br>
        return CEdit::DefWindowProc(message, wParam, lParam);<br>
        }<br>
        2.在数据输入对话框中做处理 <br>
        在对话框中申明一个类成员m_edtPassword: <br>
        CPasswordEdit m_edtPassword;<br>
        然后在对话框的OnInitDialog()中加入下列代码: <br>
        m_edtPassword.SubclassDlgItem(IDC_EDIT_PASSWORD, this);<br>
        其目的是将控制与新类做关联。 <br>
        之后在对话框的数据交换中将身份设为合法: <br>
        void CDlgInput::DoDataExchange(CDataExchange* pDX)<br>
        {<br>
        // 如果获取数据<br>
        // 注意：对于CPropertyPage类这里不需要 <br>
        if( pDX- &gt;m_bSaveAndValidate) 条件<br>
        if( pDX- &gt;m_bSaveAndValidate)<br>
        {<br>
        g_bAuthorIdentity = TRUE;<br>
        }<br>
        CDialog::DoDataExchange(pDX);<br>
        //{{AFX_DATA_MAP(CDlgInput)<br>
        DDX_Text(pDX, IDC_EDIT_PASSWORD, m_sPassword);<br>
        //}}AFX_DATA_MAP<br>
        }<br>
        这样，Password输入框就会受到保护。 <br>
        <span class="unnamed2">三、 需要注意的问题</span> <br>
        以上的方法仅针对VC程序，对于VB程序，需要借助VC做一个Password的ActiveX 控件，实现方法与上类似。同时以上程序在Visual 
        C++6.0上通过，并且用黑客程序 PWBTool测试通过。 <br>
        <span class="zhuozhe">（焦旭）</span><br>
      </p>
      </td>
  </tr>
</table>
</body>
</html>
