写程序实现wireshark的抓包功能

选修了一门信息安全专业的课,做了个实验,是实现网络抓包的功能:

代码如下:

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<netinet/ip_icmp.h>

#include<netinet/tcp.h>

#include<netinet/udp.h>

#include<arpa/inet.h>

#include<sys/socket.h>

#include<sys/types.h>



#define BUFFSIZE 1024



int main(int argc,char **argv ){



  if(argc!=2){

  	printf("Usage:Proto_Name\n");

  	return 0;

  }

	int rawsock;

	unsigned char buff[BUFFSIZE];

	int n;

	int count = 0;

  char *ipr_name=argv[1];

  char *ipr_tcp="TCP";

  char *ipr_udp="UDP";

  char *ipr_icmp="ICMP";

  if(strcmp(ipr_name,ipr_tcp)==0)

	   rawsock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP);

	else if(strcmp(ipr_name,ipr_udp)==0)

	   rawsock = socket(AF_INET,SOCK_RAW,IPPROTO_UDP);

	else if(strcmp(ipr_name,ipr_icmp)==0)

	   rawsock = socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);

	if(rawsock < 0){

		printf("raw socket error!\n");

		exit(1);

	}

	while(1)

{	

	n = recvfrom(rawsock,buff,BUFFSIZE,0,NULL,NULL);

	if(n<0){

		printf("receive error!\n");

		exit(1);

	}

		

	count++;

	struct ip *ip = (struct ip*)buff;

	printf("%4d	%15s",count,inet_ntoa(ip->ip_src));

	printf("%15s	%5d	%5d\n",inet_ntoa(ip->ip_dst),ip->ip_p,ntohs(ip->ip_len));	



	int i=0,j=0;

	for(i=0;i<n;i++)

    {

		if(i!=0 && i%16==0)

                {

			printf("	");

			for(j=i-16;j<i;j++)

			{

				if(buff[j]>=32&&buff[j]<=128)

				printf("%c",buff[j]);

				else printf(".");

			}

		printf("\n");

		}

	if(i%16 == 0) printf("%04x	",i);			

	printf("%02x",buff[i]);

	

	if(i==n-1)

    {

		for(j=0;j<15-i%16;j++) printf("  ");

		printf("	");

		for(j=i-i%16;j<=i;j++)

       {

			if(buff[j]>=32&&buff[j]<127)

                                printf("%c",buff[j]);

                                else printf(".");



		   }

	  }

   }

      

      printf("\n"); 

      printf("internet protocol\n");

      printf("version:%u\n",ip->ip_v);

      printf("Header Length:%u bytes\n",(ip->ip_hl)*4);

      printf("totle length:%d\n",ntohs(ip->ip_len));

      printf("Identification:%u\n",ip->ip_id);

      if((IP_RF&0x8000)!=0)

        printf("reserved bits:set\n");

      else

      	printf("reserved bits:not set\n");

      if((IP_DF&0x4000)!=0)

      	printf("dont fragment: not set\n");

      else

      	printf("dont fragment: set\n");

      if((IP_MF&0x2000)!=0)

      	printf("more fragment: set\n");

      else

      	printf("more fragment: not set\n");

      printf("Time to live:%u\n",ip->ip_ttl);

      if(ip->ip_p==6)

      	printf("protocol TCP(6)\n");

      else if(ip->ip_p==1)

      	printf("protocol ICMP(1)\n");

      else if(ip->ip_p==17)

      	printf("protocol UDP(17)\n");

      printf("source ip:%s\n",inet_ntoa(ip->ip_src));

      printf("destination ip:%s\n",inet_ntoa(ip->ip_dst));

      	

      //TCP

      if(ip->ip_p==6)

      {

      printf("transmission control protocol\n");

      struct tcphdr *tcp=(struct tcphdr *)(buff+(ip->ip_hl)*4);  

      printf("source port:%u\n",ntohs(tcp->source));

      printf("destation port:%u\n",ntohs(tcp->dest));

      printf("sequence number:%u\n",ntohl(tcp->seq));

      printf("acknowledgement number:%u\n",ntohl(tcp->ack_seq));

      printf("head length:%d\n",ntohs((tcp->doff)*4));

      if(tcp->urg==1)

        printf("urgent:set\n");

      else

      	printf("urgent:not set\n");

      if(tcp->ack==1)

      	printf("acknowledgment:set\n");

      else

      	printf("acknowledgment:not set\n");

      if(tcp->psh==1)

      	printf("push:set\n");

      else

      	printf("push:not set\n");

      if(tcp->rst==1)

      	printf("reset:set\n");

      else

      	printf("reset:not set\n");

      if(tcp->syn==1)

      	printf("syn:set\n");

      else

      	printf("syn:not set\n");

      	

      if(tcp->fin==1)

      	printf("fin:set\n");

      else

      	printf("fin:not set\n");

      printf("window size:%u\n",ntohs(tcp->window));

    }

    

    //UDP

   if(ip->ip_p==17)

   	{

   		struct udphdr *udp=(struct udphdr*)(buff+(ip->ip_hl)*4);

   		printf("user datagram protocol\n");

   		printf("source port:%u\n",udp->source);

   		printf("destination port:%u\n",udp->dest);

   		printf("length:%u\n",ntohs(udp->len));

   	}

    //ICMP

   if(ip->ip_p==1)

   	{ 

   		struct icmphdr *icmp = (struct icmphdr *)(buff+(ip->ip_hl)*4);

   		printf("Internet Control Message Protocol\n");

   		printf("type:%u",icmp->type);

   		if(icmp->type==0)

   			printf("(Echo Reply)\n");

   		else if(icmp->type==8)

   			printf("(Echo)\n");

   		else if(icmp->type==5)

   			printf("(Redirect)\n");

   		else if(icmp->type==3)

   			printf("(Dest Unreach)\n");

   		else if(icmp->type==4)

   			printf("(Source quench)\n");

   		else if(icmp->type==13)

   			printf("(Time Stamp)\n");

   		else if(icmp->type==14)

   			printf("(Time Stamp Reply)\n");

   		printf("Code:%u\n",icmp->code);

   		if(icmp->type==0||icmp->type==8)

   			{

   				printf("idetifier:0x%x\n",ntohs(icmp->un.echo.id));

   				printf("Sequence:%u\n",ntohs(icmp->un.echo.sequence));

   			}

   		if(icmp->type==3||icmp->type==4)

   			{

   				printf("Unused:%u\n",ntohs(icmp->un.frag.__unused));

   				printf("Mtu:%u\n",ntohs(icmp->un.frag.mtu));

   			}	

   		if(icmp->type==5)

   			printf("Gateway:%u\n",ntohs(icmp->un.gateway));

   	}     

	printf("\n\n");

}



}	

 

你可能感兴趣的:(wireshark)