在网上看到的一个代码,也不知道能不能用,不过我想会有所帮助的,先记下吧。也是关于网络数据包拦截的。
#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;
}