tcp.c
上传用户:bobuwen
上传日期:2007-01-07
资源大小:10k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* Generate a TCP packet
  2.  * with a FIN flag and pass it through a raw socket.
  3.  * 
  4.  * Thamer Al-Herbish shadows@whitefang.com
  5.  */
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <arpa/inet.h>
  12. #include <netinet/in_systm.h>
  13. #if defined(LINUX)
  14. #include <linux/ip.h>
  15. #include <linux/tcp.h>
  16. #else
  17. #include <netinet/ip.h>
  18. #include <netinet/tcp.h>
  19. #endif
  20. #include <string.h>
  21. #include <unistd.h>
  22. #include <time.h>
  23. #include <rawsock_utils.h>
  24. int main(int argc,char *argv[])
  25. {
  26.   unsigned char packet[
  27. #if !defined(LINUX)
  28.   sizeof(struct ip) +
  29. #else /* LINUX */
  30.   sizeof(struct iphdr) +
  31. #endif /* LINUX */
  32.   sizeof(struct tcphdr)];
  33.   struct sockaddr_in mysocket;
  34.   unsigned short sport, dport;
  35.   struct in_addr saddr, daddr;
  36.   struct tcphdr *tcp;
  37.   unsigned long seq, ack;
  38.   int sockd, on = 1;
  39.   
  40.   if(argc < 5)  {
  41.     fprintf(stderr,"usage: %s source_port source_address dest_port dest_addressn",
  42.     argv[0]);
  43.     exit(1);
  44.   }
  45.   
  46.   sport = (unsigned short)atoi(argv[1]);
  47.   saddr.s_addr = inet_addr(argv[2]);
  48.   
  49.   dport = (unsigned short)atoi(argv[3]);
  50.   daddr.s_addr = inet_addr(argv[4]);
  51.   
  52.   if((sockd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) < 0)  {
  53.     perror("socket");
  54.     exit(1);
  55.   }
  56.   
  57.   if(setsockopt(sockd,IPPROTO_IP,IP_HDRINCL,(char *)&on,sizeof(on)) < 0)  {
  58.     perror("setsockopt");
  59.     exit(1);
  60.   }
  61.   
  62.   /* Very bad random sequence number generator */
  63.   
  64.   srand(getpid());
  65.   
  66.   seq = rand()%time(NULL);
  67.   ack = rand()%time(NULL);
  68.   
  69.   ip_gen(packet,IPPROTO_TCP,saddr,daddr,sizeof(packet));
  70.   
  71. #if !defined(LINUX)
  72.   tcp = (struct tcphdr *)(packet + sizeof(struct ip));
  73.   tcp_gen((char *)tcp,sport,dport,seq,ack);
  74. #if !defined(SOLARIS_CKSUM_BUG)
  75.   tcp->th_sum = trans_check(IPPROTO_TCP,(char *)tcp,
  76.     sizeof(struct tcphdr),
  77.     saddr,
  78.     daddr);
  79.   
  80. #else /* SOLARIS_CKSUM_BUG */
  81.   tcp->th_sum = sizeof(struct tcphdr);
  82. #endif /* SOLARIS_CKSUM_BUG */
  83. #else /* LINUX */
  84.   
  85.   tcp = (struct tcphdr *)(packet + sizeof(struct iphdr));
  86.   tcp_gen((char *)tcp,sport,dport,seq,ack);
  87.   
  88. #if !defined(SOLARIS_CKSUM_BUG)
  89.   tcp->check = trans_check(IPPROTO_TCP,(char *)tcp,
  90.    sizeof(struct tcphdr),
  91.    saddr,
  92.    daddr);
  93. #else /* SOLARIS_CKSUM_BUG */
  94.   tcp->check = sizeof(struct tcphdr);
  95. #endif /* SOLARIS_CKSUM_BUG */
  96. #endif /* LINUX */
  97.   
  98.   memset(&mysocket,'',sizeof(mysocket));
  99.   
  100.   mysocket.sin_family = AF_INET;
  101.   mysocket.sin_port = htons(dport);
  102.   mysocket.sin_addr = daddr;
  103.   
  104.   if(sendto(sockd,&packet,sizeof(packet),0x0,(struct sockaddr *)&mysocket,
  105.     sizeof(mysocket)) != sizeof(packet))  {
  106.     perror("sendto");
  107.     exit(1);
  108.   }
  109.   
  110.   exit(0);
  111. }