VC++中非法探取密码的原理及其防范
2010-05-12 20:35:35 来源:WEB开发网防范措施
既然我们已经彻底分析清楚了此类黑客软件普遍采取的攻击手法,那么我们自然就能制订出一套防范其攻击的措施来。下面我们就要对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)
{
//对Edit的内容获取必须通过以下两个消息之一
if((message==WM_GETTEXT) ||(message==EM_GETLINE))
{
//检查是否为合法
if(!g_bSenderIdentity)
{
//非法获取,显示信息
AfxMessageBox(_T ("报告:正在试图窃取密码!"));
return 0;
}
//合法获取
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)
{
//如果获取数据
//注意:对于CPropertyPage类这里不需要 if (pDX->m_bSaveAndValidate)条件
if(pDX->m_bSaveAndValidate)
{
g_bSenderIdentity=TRUE;
}
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDlgInput)
DDX_Text (pDX,IDC_EDIT_PASSWORD,m_sPassword);
//}}AFX_DATA_MAP
}
经过这样的处理,Password输入框就拥有了合法身份并受到保护。只有本应用程序能够提取用户输入的密码内容,而其他任何一个黑客软件也都会因为没有合法身份而不能获取其中的任何信息。
结论:
以上的方法仅针对VC程序,对于其他语言如VB、Delphi等语言,需要借助VC做一个Password的ActiveX控件,实现方法与上述方法基本类似。文中给出的全部代码在Windows 2000 Professional + SP4下由Microsoft VisualC++ 6.0编译通过。
更多精彩
赞助商链接