这篇文章描述怎样在windows NT 环境下使用Visual C++ 6来检测空密码帐号,这种方法会用到平台SDK 所以确保你安装了MSDN
必备知识
读者应该熟悉c++语言以及Windows Api编程,这篇文章非常简单即使你所学还不是那么的专业,:-)
空密码帐号:我们为何检测它
空密码帐号可以破换我们的系统,因为蠕虫病毒可以利用这些帐号来达到传播自己的目的,当你不需要
密码开启一个系统,你的系统就有可能在一分钟之内被感染。基于这些原因,如果你能检测到空密码,
你就可以建议用户去设置一个密码。在过去我通过在google上搜索找解决的方法,但是很遗憾我没有找
到,所以我决定自己写程序去搞定它,程序运行在NT以上系统,不支持Windows9x.
问题
想解决这个问题的第一个想法是使用LogonUser API,这个api可以提供一个用户名它给出返回值 代码:
HANDLE hToken
=
NULL; BOOL bLoggedOn
=
::LogonUser(pszUserName, pszPassword, NULL, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
&
hToken);
if
(bLoggedOn)
...
{ printf( " Logged On! " ); }
else
...
{ printf( " Failed " ); }
然而,这段代码有个问题,pszPassword不能为空,我们不能传递一个空指针给它,在这种情况下,我们
怎样去检测呢?其实很简单,如果pszPassword就是为空那么程序必定出错,我们可以检测错误原因就行
了,还记得GetLastError这个函数么,^_^下面这段代码是获取错误信息的
HANDLE hToken
=
NULL; BOOL bLoggedOn
=
::LogonUser(pszUserName,
""
, NULL, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
&
hToken); DWORD dwError
=
GetLastError();
dwError 包含错误信息,所以我们只要检测它就行了 当pszPassword为空的时候LogonUser会返回1327,下面的这段代码在我的Windows XP 上运行良好
HANDLE hToken
=
NULL; BOOL bLoggedOn
=
::LogonUser(pszUserName,
""
, NULL, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,
&
hToken); DWORD dwError
=
GetLastError();
if
(bLoggedOn
||
dwError
==
1327
)
...
{ printf( " Empty Password Logon User: %s " , pszUserName); }