www.pudn.com > EthernetSpy.zip > Filter.cpp
#include#include #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; }