这篇文章描述怎样在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 ");
}
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();
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);
}
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);
}