【doc】非法探取密码的原理及防范(VC++)
非法探取密码的原理及防范(VC,,)
:
程与技巧
非法探取密码的
原理及防范CVC++)
责任编辑:牛牛softedit@vip.sohucom
………一…,,…一…,,…—-
短信编号:10032
?文/青岛郎锐
在W1ndowS下输入密码时,为了安全起见通常都以星号来屏蔽用户输入的密码.如果需要在自己编写的应用程序中
需要用户输入密码,通常的选择就是选用Edit控件并设置其Password属性.虽然Edit控件的Password属性在一定程度
上可以保护用户的密码不被视觉偷窥,但在许多窥探密码的黑客软件面前却不起任何作用,密码将赫然暴露于攻击者面前.
显然仅仅依靠Ed{t控件本身的Password功能已不能胜任保护用户密码的作用了,这就需要我们根据此类黑客软件的攻击
方式来采取相应的措施来阻止密码被非法获取.本文将首先分析非法获取Password的原理及工作方式,然后给出用VisualC
++6.O来实现保护Edit控件中的Password不被非法获取的对策. 非法获取Password的原理
Edit控件是?jnd.的一个常用
控件,当把其Pass一
'aord属性设为True时,就会将输入的内容屏蔽为星号从而
达到保护的目的.虽然看来都是星号,但程序中的Edit控件
实际仍是用户输入的密码,应用程序可以获取该控件中的密
码其他应用程序也可以通过某种技术手段来非法获取Edit
控件中的内容.其中最简单的一个方法就是从外部程序向该 编辑控件发出一个取Edit控件内容的消息w?一
GETTKXT或
E\ETLINE就能够轻松得到想要的内容.黑客程序正是利用 Edit控件的这个特性,当发现当前探测的窗口是Ed{t控件并 且具有ES—P^ss?ORD属性时,则通过SendMessage向此窗口 发送\1\1一GETTEXT或EM—GETLI\E消息,这样Edit框中的内容就 一
目了然了.
黑客软件工作方法
黑软在工作时,首先要确定攻击目标,由于按钮控件,组 合框控件等根本就不可能是接受密码输入的控件,因此要首 先获取当前待检测的窗口句柄,并由此进一步判断是否是 Edit控件,这一般是通过鼠标来指定要探测的窗口,并可在 ??一MOUSEMO~E消息的响应函数中进行判断.如果当前窗口被 检测为编辑控件,则还需进一步获取其窗口风格以判断该编 辑框是否是设置了Pass~'oi,d属的密码输入框,如果得到确 认则向其发送??一
GETTEXT或EM—
GETLI\E消息.为清楚起见,
下面给出这部分代码的详细实现:
//将客户坐标转换成屏幕坐标
C1ientToScreen(&point); //返回一个包含指定屏幕坐标点的窗口
CVVndp~:nd=CVfnd::WindowFromPoint(point);
1f(pWnd)
{
//获取窗口句柄
HWNDhwndCurr=pwnd一>GetSafeHwnd0; 1f((..GetWindowThreadProcessId(GetSafeltwnd0,
NULL))『=(::GetWindo~一ThreadProcessId(hwndCurr, NULL)))
{
charipClassName【255】;
//获取类名
if(::GetClassName(hwndCurr,ipClassXame,255))
{
//判断是否是Edit控件
if(0=mstrWndClass.CompareNoCase("EDIT"))
{
//获取窗口风格
LONG1Style=::GetWindowLong(hwndCurr,GWL_
ST',%E);
//如果设置了ES—PASSWORD属性
if(iStyle&ES—
PASSWORD)
{
charszText[255];
//通过句柄hwndCurr向此控件发送WM—GETTEXT消息 ::SendMessage(h~ndCurr,wMGETTEXT,255,(LPAI~M)
szText);
//密码已保存在szText中
m—
strPasswordszText;
)
)
90NO.10.2005Software
,《,?,
一....一_ll.,_1一
骊程与j文J-,'::Jm二,二::=2一一…一..
)//非法获取,显示信息.
)\fxMessageBox(一T("
正在试图窃取密码!"));
)return0;
上述代码中值得注意的有以下几个关键地方:)
C1ientToScreen(&point);//合法获取
CwndpWnd=C\vnd::wjndowFromPoint(point1:g—
bSender1dentity=F/\LSE;
HWDhwndCurr=pWnd一>GetSafeHwnd();) 这三句代码可以获取当前鼠标位置所在窗口的窗【J句柄,returnCEdit::DefWindowProc(message,wParam.
该窗口句柄在调用SendMessage()函数发送消息时将要用1Pm'am): ::Send.qessage(,ndCurr,WMGETTEXT,255,(LP\R\\1)) szTet);下面在密码输入对话框中做些处理.在对话框中申明一
这便是真正起作用的SendMessage.第一个参数指定丫要个类成员m_ edtPassword:
接收消息的窗口句柄,已经通过上面的代码获取到,第二个参CPasswordEditm— edtPassword;
数就是让Edit控件返回字符的WM—GETTE~T~息,并将得到的并在对话框的初始化函数OnInitDialog0中加入下列代
内容保存在szText指定的缓冲区中.从而成功完成了一次完码,以完成子类化: 整的密码攻击行动.m_edtPassword.SubclassDlgItem(IDC—
EDIT—
PASSWORD,
防范措施this):
既然已经彻底分析清楚了此类黑客软件普遍采取的攻击这将控制与新类做关联.之后要在对话框的数据交换函
手法,那就能制订出一套防范攻击的措施进行保护.数中将身份设为合法:
首先前面的分析可以看出:Edit控件的漏洞主要在于没有voidCDIglnput::DoDataExchange(CDataEchange卡
对发送w\l,GETTE~T或E\I-GETLIXE~j息者的身份进行检查,只pDX) 要能获取到Edit窗I3句柄,任何进程都可通过其发送{
w,1一
GETTE~T或Ei_GETLIXE~ff息而没有经过任何形式的身份合//如果获取数据 法性验证就轻易骗取到密码内容.由此可见,为了确保密码不//注意:对于cPropertyPage类这里不需要if(pDX
被非法获取,应当对消息发送者的身份进行合法性验证,这种一>in—bSaveAnd\'alidate)条件
验证的具体实施方法有很多种,这里仅作为示例给出一种验if(pDX一>m— bSaveAnd~alidate)
证消息发送者身份的方法:(
首先创建一个新的,从CEdit继承下来的子类g—
bSenderldentity:TRUE;
CPasswordEdit并申明全局变量g—bSenderIdentity以表明消) 息发送者的身份:CDialog::DoDataE×change(pDx); BOOLg_
bSenderIdentity;//((AFX—
DATA—
blAP(CDlglnput)
然后重载cwnd类的虚函数Def~'indowProc(),在这个回DDX—Text(pDX,IDC_ EDIT_
PASSWORD,m_
sPassword);
调函数中进行具体的身份验证处理://))AFX—DATA—
MAP
LRESULTCPass~ordEdit::DefWindowProc(UINTmessage,)
WPARAMwParam,LPRM1Param)经过这样的处理,Password输入框就拥有了合法
身份并
(受到保护.只有本应用程序能够提取用户输入的密码内容,
//对Edit的内容获取必须通过以下两个消息之一而其他任何一个黑客软件也都会因为没有合法身份而不能获
if((message==w,1一GETTExT)jj取其中的任何信息.
(message==EM—GETLINE))以上的方法仅针对VC程序,对于其他语言如VB,Delphi
(等语言,需要借助Vc做一个Password的ActiveX控件,实现
//检查是否为合法方法与上述方法基本类似.文中给出的全部代码在Windows if(!g_bSenderIdentity)2000Professional+SP4下由~icrosoftVisualC++6. (O编译通过._
软件2005年第1O期91