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

📄 icmpgram.cpp

📁 这是一个嗅探器
💻 CPP
字号:
// ICMPGram.cpp: implementation of the ICMPGram class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "snifferpro.h"
#include "ICMPGram.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

ICMPGram::ICMPGram()
{

}

ICMPGram::ICMPGram(const unsigned char *buf,int buflen)
{
	unsigned char *pos;
	//int buflen;

	//buf=new unsigned char[bufferlen];
	//memcpy((void *)buf,buffer,bufferlen);
	//buflen=bufferlen;

	pos=(unsigned char *)buf;
	type=*pos;

	pos++;
	code=*pos;

	pos++;
	checksum=(*pos)*0x100+(*pos);

	datalen=buflen-4;
	if(datalen>0){
		data=new unsigned char[datalen];
		memcpy((void *)data,buf+4,datalen);

		switch(type){
		case 4://Source Quench
			break;
		case 5://Redirect
			pos=data;
			gatewayaddr=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			break;
		case 8://Echo Request
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			break;
		case 0://Echo Reply
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			break;
		case 13://Time Stamp Request
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			pos++;
			inittime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			pos++;
			receivetime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			pos++;
			sendtime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			break;
		case 14://Tiem Stamp Reply
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			pos++;
			inittime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			pos++;
			receivetime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			pos++;
			sendtime=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			break;
		case 17://Mase Request
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			pos++;
			addrmask=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			break;
		case 18://Mase Reply
			pos=data; 
			identification=(*pos)*0x100+(*(++pos));
			pos++;
			sequence=(*pos)*0x100+(*(++pos));
			pos++;
			addrmask=(*pos)*0x1000000+(*(++pos))*0x10000+(*(++pos))*0x100+(*(++pos));
			break;
		default:;
		}
	}
	else{
		data=NULL;
		datalen=0;
	}
}

ICMPGram::~ICMPGram()
{
	if(data!=NULL)
		delete[] data;
}

void ICMPGram::GetType(CString &str1,CString &str2)
{
	str2.Format("");
	switch(this->type){
	case 3:
		str1.Format("Destination Unreachable");
		switch(this->code){
		case 0:
			str2.Format("Net Unreachable");
			break;
		case 1:
			str2.Format("Host Unreachable");
			break;
		case 2:
			str2.Format("Protocol Unreachable");
			break;
		case 3:
			str2.Format("Port Unreachable");
			break;
		case 4:
			str2.Format("Fragmentation Needed and DF Set");
			break;
		case 5:
			str2.Format("Source Route Failed");
			break;
		default :
			str2.Format("Unknown");
		}
		break;
	case 11:
		str1.Format("Time Exceeded");
		switch(this->code){
		case 0:
			str2.Format("Time to Live Exceeded in Transit");
			break;
		case 1:
			str2.Format("Fragment Reassembly Time Exceeded");
			break;
		default:
			str2.Format("Unknown");
		}
		break;
	case 12:
		str1.Format("Parameter Problem");
		if(this->code==0)
			str2.Format("Pointer Indicates the Error");
		else
			str2.Format("Unknown");
		break;
	case 4:
		str1.Format("Source Quench");
		break;
	case 5:
		str1.Format("Redirect");
		switch(this->code){
		case 0:
			str2.Format("Redirect Datagrams for the Network");
			break;
		case 1:
			str2.Format("Redirect Datagrams for the Host");
			break;
		case 2:
			str2.Format("Redirect Datagrams for the Type of Service and Network");
			break;
		case 3:
			str2.Format("Redirect Datagrams for the Type of Service and Hos");
			break;
		default:
			str2.Format("Unknown");
		}
		break;
	case 8:
		str1.Format("Echo");
		break;
	case 0:
		str1.Format("Echo Reply");
		break;
	case 13:
		str1.Format("Timestamp");
		break;
	case 14:
		str1.Format("Timestamp Reply");
		break;
	case 15:
		str1.Format("Information Request");
		break;
	case 16:
		str1.Format("Information Reply");
		break;
	case 17:
		str1.Format("Mask Request");
		break;
	case 18:
		str1.Format("Mask Reply");
		break;
	default:
		str1.Format("Unknown");
	}
}

CString ICMPGram::GetGateWay()
{
	CString str;
	unsigned char *pos;

	pos=(unsigned char *)&gatewayaddr;
	if(this->type==5)
		str.Format("%d.%d.%d.%d",*(pos+3),*(pos+2),*(pos+1),*pos);
	else
		str.Format("");
	return str;
}

CString ICMPGram::GetAddrMask()
{
	CString str;
	unsigned char *pos;

	pos=(unsigned char *)&addrmask;
	if(this->type==17 || this->type==18)
		str.Format("%d.%d.%d.%d",*(pos+3),*(pos+2),*(pos+1),*pos);
	else
		str.Format("");
	return str;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -