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

📄 filter.cpp

📁 网卡驱动相关实例 这是和网卡NT KMD驱动程序有关的一些资料和例子。主要是以下三方面内容: 3.1 article 一些有用的文档 3.2 Canberra 网络诊听工具Ethern
💻 CPP
字号:
#include <afxwin.h>
#include <windows.h>

#include "packet32.h"
#include "EthernetSpyReader.h"
#include "Filter.h"


#define ASCII_TO_EXE(c) (c >= 'A' ? c-'A'+10 : c-'0') 

PBYTE CStringToHex (CString S, int Len)
{
	if (S.GetLength() > 0)
	{
		PBYTE H = (PBYTE) malloc(Len);

		S.MakeUpper ();

		for(int i = 0; i < min(Len, S.GetLength()); i++)
		{
			H[i] = ASCII_TO_EXE( S[2*i] ) * 16 + ASCII_TO_EXE( S[2*i+1] );
		}	

		return H;
	}
	else
		return NULL;
}

CString HexToCString (PBYTE H, int Len)
{
	CString S("");
	
	if (H)
	{
		CString Buf;
		
		for(int i = 0; i < Len; i++)
		{
			Buf.Format("%02X", H[i]);
			S = S + Buf;
		}
	}

	return S;
}


//////////////////////////////////////////////////////////////////////////
/////
/////    EthernetHeaderFilter
/////    


EthernetHeaderFilter::EthernetHeaderFilter(PBYTE _Source, PBYTE _Dest, PUSHORT _Type, EthernetSpyReader* _SpyReader)
{
	Source = NULL;
	Dest = NULL;
	Type = NULL;

	SpyReader = _SpyReader;

	SetSourceAddrFlt (_Source);
	SetDestAddrFlt (_Dest);
	SetPktTypeFlt (_Type);
}

EthernetHeaderFilter::EthernetHeaderFilter(CString _Source, CString _Dest, CString _Type, EthernetSpyReader* _SpyReader)
{
	Source = NULL;
	Dest = NULL;
	Type = NULL;

	SpyReader = _SpyReader;

	SetSourceAddrFlt (_Source);
	SetDestAddrFlt (_Dest);
	SetPktTypeFlt (_Type);
}

EthernetHeaderFilter::~EthernetHeaderFilter()
{
	if( Source != NULL );
		free(Source);
	
	if( Dest != NULL );
		free(Dest);
	
	if( Type != NULL );
		free(Type);	
}

void EthernetHeaderFilter::SetSourceAddrFlt (PBYTE _Source)
{
	if( Source != NULL )
		free(Source);
	
	if (_Source)
	{
		Source = (PBYTE) malloc (6); 
		memcpy (Source, _Source, 6);
	}
	else
		Source = NULL;
}

void EthernetHeaderFilter::SetSourceAddrFlt (CString _Source)
{	
	BYTE EthAddr[6];

	if (SpyReader->ConvertAddress(_Source, EthAddr))
	{
		SetSourceAddrFlt (EthAddr);
		sSource = _Source;
	}
	else
	{
		sSource = "";
		SetSourceAddrFlt (NULL);
	}
}
	
void EthernetHeaderFilter::SetDestAddrFlt (PBYTE _Dest)
{
	if( Dest != NULL )
	{
		free(Dest);
	}

	if (_Dest)
	{
		Dest = (PBYTE) malloc (6); 	
		memcpy (Dest, _Dest, 6);
	}
	else
		Dest = NULL;	
}

void EthernetHeaderFilter::SetDestAddrFlt (CString _Dest)
{	
	BYTE EthAddr[6];

	if (SpyReader->ConvertAddress(_Dest, EthAddr))
	{
		SetDestAddrFlt (EthAddr);
		sDest = _Dest;
	}
	else
	{
		sDest = "";
		SetDestAddrFlt (NULL);
	}	
}
	
void EthernetHeaderFilter::SetPktTypeFlt (PBYTE _Type)
{
	if( Type != NULL )
	{
		free(Type);
	}

	Type = _Type;
	sType = HexToCString (Type, 2);
}

void EthernetHeaderFilter::SetPktTypeFlt (CString _Type)
{	
	SetPktTypeFlt (CStringToHex (_Type, 2));
}
	
BOOL EthernetHeaderFilter::Match ( PFRAMEETH Frame )
{
	BOOL Result = TRUE;
	
	if (Source)
		Result &= (memcmp( Source, Frame->SrcAddr, 6) == 0);					
	
	if (Dest)
		Result &= (memcmp( Dest, Frame->DestAddr, 6) == 0);		
	
	if (Type)
		Result &= (memcmp(Type, Frame->Type, 2) == 0);
	
	return Result;
}



//////////////////////////////////////////////////////////////////////////
/////
/////    TwoTalkingComputersFilter 
/////    

TwoTalkingComputersFilter::TwoTalkingComputersFilter (PBYTE _AddrA, PBYTE _AddrB, EthernetSpyReader* _SpyReader)
{
	AddrA = NULL;
	AddrB = NULL;

	SpyReader = _SpyReader;

	SetAddresses (_AddrA, _AddrB);
}

TwoTalkingComputersFilter::TwoTalkingComputersFilter (CString _AddrA, CString _AddrB, EthernetSpyReader* _SpyReader)
{
	AddrA = NULL;
	AddrB = NULL;

	SpyReader = _SpyReader;

	SetAddresses (_AddrA, _AddrB);
}

TwoTalkingComputersFilter::~TwoTalkingComputersFilter ()
{
	if( AddrA != NULL )
		free(AddrA);

	if( AddrB != NULL )
		free(AddrB);
}

void TwoTalkingComputersFilter::SetAddresses (PBYTE _AddrA, PBYTE _AddrB)
{
	if( AddrA != NULL )
		free(AddrA);

	if (_AddrA)
	{
		AddrA = (PBYTE) malloc (6); 	
		memcpy (AddrA, _AddrA, 6);
	}
	else
		AddrA = NULL;
	
	if( AddrB != NULL )
		free(AddrB);

	if (_AddrB)
	{
		AddrB = (PBYTE) malloc (6); 	
		memcpy (AddrB, _AddrB, 6);
	}
	else
		AddrB = NULL;

}

void TwoTalkingComputersFilter::SetAddresses (CString _AddrA, CString _AddrB)
{
	BYTE EthAddrA[6];
	BYTE EthAddrB[6];

	BOOL A = SpyReader->ConvertAddress(_AddrA, EthAddrA);
	BOOL B = SpyReader->ConvertAddress(_AddrB, EthAddrB);

	SetAddresses ( A ? EthAddrA : NULL, B ? EthAddrB : NULL);

	sAddrA = A ? _AddrA : "";
	sAddrB = B ? _AddrB : "";
}

BOOL TwoTalkingComputersFilter::Match ( PFRAMEETH Frame )
{
	BOOL Result = TRUE;
	
	if (AddrA && AddrB)
	{
		Result = ((memcmp( AddrA, Frame->SrcAddr, 6) == 0) && 					
					(memcmp( AddrB, Frame->DestAddr, 6) == 0)) ||
				 ((memcmp( AddrA, Frame->DestAddr, 6) == 0) &&
					(memcmp( AddrB, Frame->SrcAddr, 6) == 0));
	}
	else if (AddrA)
	{
		Result = (memcmp( AddrA, Frame->SrcAddr, 6) == 0) ||
				   (memcmp( AddrA, Frame->DestAddr, 6) == 0);
	}
	else if (AddrB)
	{
		Result = (memcmp( AddrB, Frame->SrcAddr, 6) == 0) ||
				   (memcmp( AddrB, Frame->DestAddr, 6) == 0);
	}
	
	return Result;
}

⌨️ 快捷键说明

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