Windows网络用户登录密码的猜解
Windows密码猜测算法的主要思想是利用Windows提供的窗口枚举函数EnumWindows(),寻找网络登录窗口。使用子窗口枚举函数EnumChildWindows()或GetNext-DlgTabItem()和GetWindowLong()定位网络登录窗口上的每个控件。
使用SendDlgItemMessage()或SetDlgItemText()输入用户名和密码。SendMessage()用于发送“OK”消息。这样,利用程序完成了整个网络登录过程。使用枚举的用户名和密码重复这个过程,然后完成网络用户名和密码的枚举猜测。
首先,猜测流程:
为了说明问题,下面只写主要过程。对于关键过程,给出了用VC++实现的源代码。互斥之间的代码。锁和互斥。以下过程中的UnLock只允许单线程访问。“密码枚举完毕”表示用户指定的字符集已经枚举完毕,程序会枚举一个新的用户名,然后再次枚举这个字符集。源代码中各个函数的具体用法,请参考MSDN。多线程的用法请参考VisualC++技术内幕。
下面给出了关键过程的源代码。
1.全局变量:
结构线程
{
CWinThread * pThread
};
_Thread WindowThread[iProc],PassTread[1],user tread[1];)//iProc:窗口枚举线程的数量
CEvent gEventNextPass//取下一个密码,引入同步。
CEvent gEventPassOk//密码已经获取,引入是为了同步。
CEvent gEventNextUser//取下一个用户名,引入同步。
CEvent gEventUserOk//用户名已经获取,引入是为了同步。
CMutex gMutex//互斥,只允许单线程访问。
char cCurrentPass[MAX _ PASSWORD _ LENGTH];File://当前使用的密码。
char cCurrentUser[MAX _ USER _ LENGTH];//当前使用的用户名
2.线程启动:
{
File:// Password枚举线程
if(PassTread[0])。pThread==NULL)
{
通行证[0]。pThread = AfxBeginThread((AFX _ thread proc)GetNextPassL,NULL,
线程_优先级_最低);
通行证[0]。pThread-> m _ bauto delete = TRUE;
File://这里省略了从文件中获取密码的代码,类似于用户名枚举过程的代码。
}
File:// Username枚举线程
if(UserTread[0].pThread==NULL)
{
用户线程[0]。pThread = AfxBeginThread((AFX _ thread proc)get next userf,NULL,
线程_优先级_最低);
通行证[0]。pThread-> m _ bauto delete = TRUE;
}
File:// window枚举线程
for(int I = 0;我
{
if(WindowThread[i].pThread==NULL){
窗口线程[i]。pThread = AfxBeginThread((AFX _ thread proc)thread proc,NULL,
线程_优先级_最低);
窗口线程[i]。pThread-> m _ bauto delete = TRUE;
}
}
位律师回复
0条评论