|
导读Windows虽然是一个功能强大的操作系统,但其存在的一些先天性不足,给黑客留下了 许多可乘之机,著名的BO程序就是利用Windows的这些漏洞来危害计算机的安全。笔者 最近发现了一个很流行的专门获... Windows虽然是一个功能强大的操作系统,但其存在的一些先天性不足,给黑客留下了 许多可乘之机,著名的BO程序就是利用Windows的这些漏洞来危害计算机的安全。笔者 最近发现了一个很流行的专门获取Edit框Password的工具,甚至其源代码已在某报纸发表, 这无疑是对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_bAuthorIdentity表明消息发送者的身份: 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::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 控件,实现方法与上类似。同时以上程序在VisualC++6.0上通过,并且用黑客程序PWBTool 测试通过。 在Delphi中实现类似VB中的控件数组 你可以通过设置一组相应控件的TAG属性来实现这一功能。首先在窗体中放置3个BUTTON控件,然后分别设置这三个控件的TAG属性为1、2、3。接下来双击任意一个按钮,在其代码部分输入如下代码: procedureTForm1.Button1Click(Sender:TObject); varcap:string; begin caseTButton(sender).Tagof 1:ShowMessage(′1stButtonPressed′); 2:ShowMessage(′2ndButtonPressed′); 3:ShowMessage(′3rdButtonPressed′); end; end; 最后在其他两个按钮的ONCLICK事件中选择已经编好的代码。这样一来就可以实现以上功能了。 |
温馨提示:喜欢本站的话,请收藏一下本站!