在写完《利用钩子显示*号密码》,“QQ大盗子夜版后”不少网友给我来信交流,如此简单的就能得到EDIT
密码,不是很不安全?的确。也有网友问到:针对这样的问题,有什么措施?
其实对于EDIT控件,要保护它的内容不难,只要继承EDIT,写一个自已的EDIT类,处理一个消息就能做到。对
于窗口,我暂时不知采取什么措施。不过像QQ,不知大家发现没有?新版(0825,2003我有测试过)登陆窗口
注册向导对话框里,你是不能得到它的窗口名的。大家可以用VC里面的小工具spy++试下看。
下面我们针对PASSWORD框为例,采取相应措施,防止密码被截。
1:新建一个基于对话框的程序
2:从CEdit 类新建一个类,为CMyEdit;
3:加入DefWindowProc函数。在这里面我们将对消息进行判断。如下:
LRESULT CMyEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if(message==WM_GETTEXT)||(message==EM_GETLINE))
return 0;
return CEdit::DefWindowProc(message, wParam, lParam);
}
4:在对话框中加入一个EDIT控件,设置属性PASSWORD,并为其建立CmyEdit类的对象。
3;现在编译运行看。此时在来看到PASSWORD的内容看。我用的我自己写的工具来测试,如图:
此时,输入密码后,得到的只是几个乱码。已经起到了保护作用。但细心的朋友会发现,此时我们自己的程序也不能得到PASSWORD内容了。怎么办?这就要加入相应的权限控制了。只有非自己的程序截获密码时,才保护。
4:为此,我们在APP类的CPP文件中加入BOOL bIdentify=FALSE,在。H 文件中加入extern BOOL bIdentify;这样我们就可以在其它文件中使用它了。
5:在:DoDataExchange函数中
void CEx_editDlg::DoDataExchange(CDataExchange* pDX)
{
if(pDX->m_bSaveAndValidate) //这里进行判断<1>
{
bIndentify=TRUE;
}
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CEx_editDlg)
DDX_Control(pDX, IDC_EDIT1, m_edit);
DDX_Text(pDX, IDC_EDIT1, m_stredit);
//}}AFX_DATA_MAP
}
有些朋友,可能在<1>处有点不明白,为什么要这样?m_bSaveAndValidate 是什么呢?下面大概的讲下:
CDataExchange类的成员
m_bSaveAndValidate
对应于你提供给UpdateData的参数,当为TRUE时数据从控件传递到变量
m_pDlgWnd
控制窗口或对话框的句柄
PrepareCtrl(int nIDC)
调用该函数,以标识当前控件(如不是编辑框)
PrepareEditCtrl(int nIDC)
调用该函数,以标识当前控件(如是编辑框)
Fail()
产生一个对控件的验证失败(你可以在DDX或者DDV中调用该函数),抛出一个异
常,破坏DoDataExchange函数的执行
现在大家应该明白为什么要上面的<1>这一句了:
if(pDX->m_bSaveAndValidate) //这里进行判断<1>
{
bIndentify=TRUE;
}
也就是说,如果m_bSaveAndValidate为真,既是我们自己的程序要得到EDIT内容,就是合法截取,否则为非法。
6:修改一下DefWindowProc函数,如下:
LRESULT CMyEdit::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if((message==WM_GETTEXT)||(message==EM_GETLINE))
{
if(!bIndentify)
return 0;
bIndentify=FALSE;
}
return CEdit::DefWindowProc(message, wParam, lParam);
}
现在来运行下看。一切OK,再也不要怕密码泄露了。
对于如何防止别人得到自己程序的窗口名,请见本人另一文
〈揭开QQ登录窗口的面纱 〉
http://www.csdn.net/Develop/read_article.asp?id=22476
本文地址:http://com.8s8s.com/it/it1334.htm