一个包拦截的例子[ZT]

  在网上看到的一个代码,也不知道能不能用,不过我想会有所帮助的,先记下吧。也是关于网络数据包拦截的。

#include <vector>
#include <iostream>
#include <winsock2.h>
#include <mstcpip.h>

#pragma comment( lib, "ws2_32.lib" )

using namespace std;

struct IPHeader
{
   unsigned char mHeaderLengthAndVersion;
   unsigned char mTypeOfService;
   unsigned short mTotalLength;
   unsigned short mIdentifier;
   unsigned short mFragment;
   unsigned char mTTL;
   unsigned char mProtocolType;
   unsigned short mCheckSum;
   unsigned int mSourceIP;
   unsigned int mDestIP;

   int getHeaderLength() const
   {
      return mHeaderLengthAndVersion & 0xf;
   }
};

struct TCPHeader
{
   unsigned short mSourcePort;
   unsigned short mDestPort;
   unsigned int mSequence;
   unsigned int mAck;
   unsigned char mLengthAndReserve;
   unsigned char mFlags;
   unsigned short mWindow;
   unsigned short mCheckSum;
   unsigned short mUrgent;
};

struct UDPHeader
{
   unsigned short mSourcePort;
   unsigned short mDestPort;
   unsigned short mLength;
   unsigned short mCheckSum;
};

struct ICMPHeader
{
   unsigned char mType;
   unsigned char mCode;
   unsigned short mCheckSum;
   unsigned short mID;
   unsigned short mSequence;
   unsigned long mTimeStamp;
};

void ProcessIPPacket( char*, int );
void ProcessTCPPacket( char*, int );
void ProcessUDPPacket( char*, int );

void main( )
{
   WSADATA data;
   WSAStartup( MAKEWORD( 2, 0 ), &data );

   SOCKET rawSock = socket( AF_INET, SOCK_RAW, IPPROTO_IP );

   char name[ 1024 ];
   gethostname( name, sizeof( name ) );

   hostent* ent = gethostbyname( name );

   SOCKADDR_IN addr;
   addr.sin_family = AF_INET;
   addr.sin_port = htons( 8888 );
   memcpy( &addr.sin_addr.S_un.S_addr, ent->h_addr_list[ 0 ], ent->h_length );

   bind( rawSock, (PSOCKADDR)&addr, sizeof( addr ) );

   DWORD dummy;
   WSAIoctl( rawSock, SIO_RCVALL, &dummy, sizeof( dummy ), &dummy, sizeof( dummy ), &dummy, NULL , NULL );

   for(;;)
   {
      vector<char> vc( 128 * 1024 );
      ProcessIPPacket( &vc[0], recv( rawSock, &vc[0], (int)vc.size(), 0) );
   }
}

void ProcessIPPacket( char* packet, int size )
{
   IPHeader* header = (IPHeader*)packet;

   if( header->mProtocolType == IPPROTO_TCP )
      ProcessTCPPacket( packet + header->getHeaderLength(), size - header->getHeaderLength() );
   else if( header->mProtocolType == IPPROTO_UDP )
      ProcessUDPPacket( packet + header->getHeaderLength(), size - header->getHeaderLength() );
}


void ProcessTCPPacket( char* packet, int size )
{
   TCPHeader* header = (TCPHeader*)packet;
   cout<<"got tcp packet"<<endl;
}

void ProcessUDPPacket( char* packet, int size )
{
   UDPHeader* header = (UDPHeader*)packet;
   cout<<"got udp packet"<<endl;
}

你可能感兴趣的:(一个包拦截的例子[ZT])