#include <sys/socket.h> #include <arpa/inet.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 <netdb.h> #include <string.h>
#define DESTPORT 80 #define LOCALPORT 1716
#define SIP "192.168.198.129"
#if 0 unsigned short check_sum(unsigned short *addr,int len) { register int nleft=len; register int sum=0; register short *w=addr; short answer=0;
while(nleft>1) { sum+=*w++; 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); } #endif
/******* send tcp *********/ void send_tcp(int sockfd,struct sockaddr_in *addr) { char options[] = {0x02,0x04,0x05,0xb4,0x01,0x01,0x04,0x02}; char buffer[100]; /**** save the data to send ****/ struct ip *ip; struct tcphdr *tcp; int head_len;
head_len=sizeof(struct ip)+sizeof(struct tcphdr)+8;
bzero(buffer,100);
/******** iphdr ******/ ip=(struct ip *)buffer; ip->ip_v=IPVERSION; ip->ip_hl=sizeof(struct ip)>>2; ip->ip_tos=0; ip->ip_len=htons(head_len); /** IP data len**/ ip->ip_id=0; ip->ip_off=0; ip->ip_ttl=MAXTTL; ip->ip_p=IPPROTO_TCP; ip->ip_sum=0; ip->ip_dst=addr->sin_addr;
/******* tcp packet *****/ tcp=(struct tcphdr *)(buffer +sizeof(struct ip)); tcp->source=htons(LOCALPORT); tcp->dest=addr->sin_port; /** desctination port **/ tcp->seq=0; tcp->ack_seq=0; tcp->doff=7; tcp->syn=1; tcp->window=htons(16384); tcp->check=0;
/*options*/ memcpy(buffer+sizeof(struct ip)+sizeof(struct tcphdr),options,8); ip->ip_src.s_addr=inet_addr(SIP);
//tcp->check=check_sum((unsigned short *)tcp,sizeof(struct tcphdr));
tcp->check=0; sendto(sockfd,buffer,head_len,0,(const struct sockaddr*)addr,sizeof(struct sockaddr_in)); }
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]); 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]); }
sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP); if(sockfd<0) { fprintf(stderr,"Socket Error:%s\n\a",strerror(errno)); exit(1); }
setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on)); setuid(getpid());
send_tcp(sockfd,&addr); return 0; }
|