vc 抓包程序

  • 格式:doc
  • 大小:14.20 KB
  • 文档页数:4

vc 抓包程序
#include <WINSOCK2.H>
#include<stdio.h>
#include <winsock2.h>
//#include <ws2_32.h>
/* The IP header */
#pragma comment(lib,"WS2_32")
#pragma comment(lib,"Mpr")
typedef struct _IPHEADER {
unsigned char header_len:4;
unsigned char version:4;
unsigned char tos; // type of service
unsigned short total_len; // length of the packet unsigned short ident; // unique identifier
unsigned short flags;
unsigned char ttl;
unsigned char proto; // protocol ( IP , TCP, UDP etc) unsigned short checksum;
unsigned int sourceIP;
unsigned int destIP;
}IPHEADER;
struct TCPPacketHead {
WORD SourPort;
WORD DestPort;
DWORD SeqNo;
DWORD AckNo;
BYTE HLen;
BYTE Flag;
WORD WndSize;
WORD ChkSum;
WORD UrgPtr;
};
struct ICMPPacketHead {
BYTE Type;
BYTE Code;
WORD ChkSum;
};
struct UDPPacketHead {
WORD SourPort;
WORD DestPort;
WORD Len;
WORD ChkSum;
};
int main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
CHAR szHostName[128] = {0};
HOSTENT* pHost = NULL;
CHAR* pszIp = NULL;
int iNum = 0;
SOCKADDR_IN sa;
wVersionRequested = MAKEWORD( 2, 0 );
err = WSAStartup( wVersionRequested, &wsaData );
SOCKET ssocket ;
ssocket = socket( AF_INET , SOCK_RAW , IPPROTO_IP ) ;
int rcvtimeo = 5000 ; // 5 sec insteadof 45 as default
setsockopt( ssocket , SOL_SOCKET , SO_RCVTIMEO , (const char *)&rcvtimeo , sizeof(rcvtimeo) );
sa.sin_family = AF_INET;
sa.sin_port = htons(7000);
pHost = gethostbyname(szHostName);
pszIp=inet_ntoa(*(in_addr*)pHost->h_addr_list[1]);
sa.sin_addr.s_addr= inet_addr(pszIp);
bind(ssocket,(PSOCKADDR)&sa, sizeof(sa));
DWORD dwBufferLen[10] ;
DWORD dwBufferInLen= 1 ;
DWORD dwBytesReturned = 0 ;
WSAIoctl( ssocket, _WSAIOW(IOC_VENDOR,1), &dwBufferInLen,
sizeof(dwBufferInLen), &dwBufferLen,
sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL );
char buf [1000] , *bufwork ;
char *pSource , *pDest ;
char szSource [16] , szDest[16] , szErr [ 50 ];
for (;true;)
{
memset( buf , 0 , sizeof(buf) ) ;
int len = recv( ssocket , buf , sizeof( buf ) , 0 ) ;
bufwork = buf;
IPHEADER * pIpHeader = (IPHEADER *)bufwork ;
in_addr ina ;
ina.S_un.S_addr = pIpHeader->sourceIP ;
pSource = inet_ntoa( ina ) ;
strcpy( szSource , pSource ) ;
ina.S_un.S_addr = pIpHeader->destIP ;
pDest = inet_ntoa( ina ) ;
strcpy( szDest , pDest ) ;
printf("datalen %d len %d IP %s
ip %s",len,pIpHeader->header_len,szSource,szDest);
int HdrLen, totallen;
WORD sourport, destport;
//struct IPPacketHead *pIPHead;
struct TCPPacketHead *pTCPHead;
//struct ARPPacket *pARPHead;
struct ICMPPacketHead *pICMPHead;
struct UDPPacketHead *pUDPHead;
HdrLen = pIpHeader->header_len&0xf;
HdrLen *= 4;
switch(pIpHeader->proto)
{
case IPPROTO_ICMP:
{
pICMPHead=(struct ICMPPacketHead *)(buf+HdrLen);
//解析ICMP协议
break;
}
case IPPROTO_TCP:
{
pTCPHead=(struct TCPPacketHead *)(buf+HdrLen);
sourport = ntohs(pTCPHead->SourPort);
destport = ntohs(pTCPHead->DestPort);
printf("tcp sourport %d destport %d",sourport,destport);
//解析tcp协议
break;
}
case IPPROTO_UDP:
{
pUDPHead=(struct UDPPacketHead *)(buf+HdrLen);
//解析UDP协议 break;
}
}
printf("\n"); }
return 0;
}。