reflscan.c
上传用户:jxr_002
上传日期:2007-01-05
资源大小:12k
文件大小:9k
源码类别:

扫描程序

开发平台:

Unix_Linux

  1. /*
  2.  *   yet another pointless and retarded proggie brought to you by
  3.  *                       reflector
  4.  *   port scanner shit -- evades logging.
  5.  *   thx to halflife for psuedo header and timer shit from halfscan.c
  6.  */
  7. #include <sys/types.h> 
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <netinet/in.h>
  12. #include <sys/socket.h>
  13. #include <linux/ip.h>
  14. #include <linux/tcp.h>
  15. #include <signal.h>
  16. #include <netdb.h>
  17. #include <arpa/inet.h>
  18. #include <unistd.h>
  19. #include <signal.h>
  20. #include <errno.h>
  21. #define MAXHOSTNAME   128
  22. int timeout = 0;
  23. int lazy_refl = 0;
  24. unsigned short checkzum(unsigned short *, int);
  25. void dumpsyns(int, unsigned, unsigned, int, unsigned, unsigned, int);
  26. void getdemsyns(unsigned, unsigned, int, int, char *);
  27. void sort_ports(int *, int, FILE *, int);
  28. void alarm_handler(int);
  29. void refl_handler(int);
  30. int compar(const void *, const void *);
  31. main (argc, argv)
  32. int argc;
  33. char *argv[];
  34. {
  35.    int r,e,f,l,dirty_sock;
  36.    pid_t dapid;
  37.    char *filename;
  38.    char *localhost;
  39.    unsigned max_port;
  40.    unsigned dest;
  41.    unsigned source;
  42.    struct hostent *he;
  43.    f=0;
  44.    l=0;
  45.    
  46.    
  47.    /* check usage */
  48.    
  49.    if ((argc < 4) || (argc > 6))
  50.    {
  51.       printf("usage: %s source target max-port-to-scan [-f filename]n", argv[0]);
  52.       printf("       source must be YOUR ip address as a dotted quad.n");
  53.       exit(1);
  54.    }
  55.    for (r=0; r < argc; r++)
  56.    {
  57.       if(!strcmp("-f", argv[r]))
  58.       {
  59.          f=1;
  60.          filename = argv[++r];
  61.       }
  62.    }
  63.  
  64.    max_port = atoi(argv[3]);
  65.    if ((max_port < 1) || (max_port > 32767))
  66.    {
  67.       printf("max port to scan should really be between 1 and 32,767.n");
  68.       exit(1);
  69.    }
  70.    dest = inet_addr(argv[2]);
  71.    if (dest == -1);
  72.    {
  73.       if((he = gethostbyname(argv[2])) == NULL)
  74.       {
  75.          printf("doh.  %s duz not exist.  cunt.n", argv[2]);
  76.  exit(1);
  77.       }
  78.       bcopy ((char *)he->h_addr,  (char *)&dest, he->h_length);
  79.    }
  80.    
  81.    source = inet_addr(argv[1]);
  82.    if (source == -1)
  83.    {
  84.       printf("check that source address you fucking dork.n");
  85.       exit(1);
  86.    }
  87.    /* open raw sockets */
  88.    if ((dirty_sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0)
  89.    {
  90.       printf("could not open socket. are you even root, cunt?n");
  91.       exit(1);
  92.    }
  93.    
  94.    printf("checking out ports 1 thru %d on %s.n", max_port, argv[2]);
  95.    /* fork - parent sends syns, child listens, rsts half open connections. */
  96.    dapid = fork();
  97.    if (dapid < 0)
  98.    {
  99.       printf("could not fork.n");
  100.       exit(1);
  101.    }
  102.    if (dapid > 0)
  103.    {
  104.       signal(SIGALRM, alarm_handler);
  105.       sleep(3);
  106.       for (r=1; r <= max_port; r++)
  107.          dumpsyns(r, source, dest, dirty_sock, 0, 0, 0);
  108.       kill(dapid, 10);      
  109.       while (1)
  110.       {
  111.          if (timeout == 1)
  112.  {
  113.     sleep(2);
  114.     exit(1);
  115.  }
  116.       }
  117.    }
  118.    if (dapid == 0)
  119.    {
  120.      getdemsyns(source, dest, dirty_sock, f, filename); 
  121.    }
  122. }
  123. void dumpsyns(int port, unsigned source, unsigned dest, int dirty_sock, unsigned seqnum, unsigned acknum, int testrst)
  124. {
  125.    int r,e,f,doh;
  126.    struct sockaddr_in sin;
  127.    struct tcphdr teeseepee;
  128.    struct fux_psuedo_heder
  129.    {
  130.       unsigned source;
  131.       unsigned dest;
  132.       unsigned pad     :  8,
  133.                proto   :  8,
  134.        tcp_len : 16;
  135.       struct tcphdr tcp;
  136.    }psuedo_hed;
  137.    sin.sin_family      = AF_INET;
  138.    sin.sin_port        = htons(port);
  139.    sin.sin_addr.s_addr = dest;
  140.    
  141.    /* fill in tcp header, checking if we want this to be a rst segment. */
  142.    teeseepee.source    = getpid();
  143.    teeseepee.dest      = htons(port);
  144.    /* if this is to be a rst */
  145.    if (testrst == 1)
  146.    {
  147.       teeseepee.seq       = acknum;
  148.       teeseepee.ack_seq   = seqnum + 1;
  149.       teeseepee.rst       = 1;
  150.       teeseepee.syn       = 0;
  151.       teeseepee.ack       = 1;
  152.       teeseepee.window    = 0;
  153.    }
  154.    /* if not */
  155.    if (testrst == 0)
  156.    {
  157.       teeseepee.seq       = getpid() + port;
  158.       teeseepee.ack_seq   = 0;
  159.       teeseepee.rst       = 0;
  160.       teeseepee.syn       = 1;
  161.       teeseepee.ack       = 0;
  162.       teeseepee.window    = htons(512);
  163.    }
  164.    /* these don't care if we are rsting or not */
  165.    teeseepee.doff      = 5;
  166.    teeseepee.res1      = 0;
  167.    teeseepee.res2      = 0;
  168.    teeseepee.urg       = 0;
  169.    teeseepee.psh       = 0;
  170.    teeseepee.fin       = 0;
  171.    teeseepee.check     = 0;
  172.    teeseepee.urg_ptr   = 0;
  173.    /* fill in psuedo-header.  ugh. */
  174.    psuedo_hed.source   = source;
  175.    psuedo_hed.dest     = dest;
  176.    psuedo_hed.pad      = 0;
  177.    psuedo_hed.proto    = 6;
  178.    psuedo_hed.tcp_len  = htons(20);
  179.    bcopy (&teeseepee, (char *)&psuedo_hed.tcp, 20);
  180.    teeseepee.check = checkzum((unsigned short *)&psuedo_hed, 32);
  181.    /* bewm! */
  182.    doh = sendto(dirty_sock, &teeseepee, sizeof(teeseepee), 0, (struct sockaddr *)&sin, sizeof(sin));
  183.    if (doh != sizeof(teeseepee))
  184.    {
  185.       printf("error sending syn.n");
  186.       exit(1);
  187.    }
  188.    
  189. }
  190. void getdemsyns(source, dest, stiff_sock, f, filename)
  191. unsigned source,dest;
  192. int stiff_sock, f;
  193. char *filename;
  194. {
  195.  
  196.    int rst_sock;
  197.    int doh, r, e=0, i=1;
  198.    int array[150];
  199.    FILE *fp;
  200.    struct servent *sp;
  201.    struct sockaddr_in sin, duhsin;
  202.    struct in_addr ina;
  203.    struct in_tcp
  204.    {
  205.       struct iphdr   ip;
  206.       struct tcphdr tcp;
  207.       char dataz[65495];
  208.    }intcp;
  209.    ina.s_addr = dest;
  210.    if (f == 1)
  211.    {
  212.       if ((fp = fopen(filename, "a")) == NULL)
  213.       {
  214.          printf("could not open file, cunt.n");
  215.          exit(1);
  216.       }
  217.       fprintf(fp, "            --- results for %s ---n", inet_ntoa(ina));
  218.    }
  219.    duhsin.sin_family      = AF_INET;
  220.    duhsin.sin_port        = htons(getppid());
  221.    duhsin.sin_addr.s_addr = source;
  222.  
  223.    if ((bind(stiff_sock, (struct sockaddr *)&duhsin, sizeof(duhsin))) < 0)
  224.    {
  225.       printf("could not bind socket.n");
  226.       exit(1);
  227.    }   
  228.  
  229.    sin.sin_family      = AF_INET;
  230.    sin.sin_port        = htons(getppid());
  231.    sin.sin_addr.s_addr = dest;
  232.   
  233.    
  234.    if ((rst_sock = socket(AF_INET, SOCK_RAW, IPPROTO_TCP)) < 0)
  235.    {
  236.       printf("error opening rst_sock.n");
  237.       exit(1);
  238.    }
  239.    
  240.    signal(SIGUSR1, refl_handler);
  241.    signal(SIGALRM, alarm_handler);
  242.    alarm(30);
  243.    printf("        SYNs received [");
  244.    fflush(stdout);
  245.    while(1)
  246.    {
  247.       if ((timeout == 1) && (lazy_refl == 1))
  248.       {
  249.          printf("]n");
  250.          sort_ports(array, f, fp, i);
  251.       }
  252.       doh = read(stiff_sock, (char *)&intcp, 65535);  
  253.       if (intcp.tcp.dest == getppid())
  254.       {
  255.          if (intcp.tcp.syn == 1)
  256.          {
  257.     alarm(35);
  258.      
  259.     /* reset connection */
  260.     dumpsyns(intcp.tcp.source, source, dest, rst_sock, intcp.tcp.ack_seq, intcp.tcp.ack, 1); 
  261.             /* stuff port in array */
  262.             e = 0;
  263.             for(r=0; r <= i; r++)
  264.     {
  265.        if(ntohs(intcp.tcp.source) == array[r])
  266.           e = 1;
  267.     }
  268.             if (e == 0)
  269.             {
  270.                printf(".");
  271.                fflush(stdout);
  272.                array[i] = ntohs(intcp.tcp.source); 
  273.                i++;
  274.             }                 
  275.          }             
  276.       }        
  277.    }        
  278. }   
  279. void sort_ports(int *array, int f, FILE *fp, int i)
  280. {
  281.    pid_t pidz;
  282.    int r,e;
  283.    struct servent *sp;
  284.    
  285.    setservent(1);
  286.    pidz = getppid();
  287.    fflush(stdout);
  288.    qsort(array, i, sizeof(array[0]), compar);
  289.    for(e = 1; e < i; e++)
  290.    {
  291.       if ((sp = getservbyport(array[e], "tcp")) == NULL)
  292.       {
  293.          if (f == 1)
  294.             fprintf(fp, "received syn from port %d.n", array[e]);
  295.          else
  296.             printf("received syn from port %d.n", array[e]);
  297.       }
  298.       else
  299.       {
  300.          if (f == 1)
  301.             fprintf(fp, "%s found on port %d.n", sp->s_name, array[e]);
  302.          else
  303.             printf("%s found on port %d.n", (char *)sp->s_name, array[e]);
  304.       }
  305.       fflush(stdout);
  306.    }
  307.    kill(pidz, 14);
  308.    endservent();
  309.    exit(1);
  310. }
  311. int compar(const void *intone, const void *inttwo)
  312. {
  313.    if (*(int *)intone == *(int *)inttwo)
  314.       return 0;
  315.    if (*(int *)intone < *(int *)inttwo)
  316.       return -1;
  317.    if (*(int *)intone > *(int *)inttwo)
  318.       return 1;
  319. }
  320. void alarm_handler(int s)
  321. {
  322.    alarm(0);
  323.    timeout = 1;
  324. }
  325. void refl_handler(int s)
  326. {
  327.    lazy_refl = 1;
  328. }
  329. /*
  330.  * I didn't steal this from ping.c.  really.  I wrote it.  really.
  331.  */     
  332. unsigned short checkzum(addr, len)
  333.     u_short *addr;
  334.     int len;
  335. {
  336.     register int nleft = len;
  337.     register u_short *w = addr;
  338.     register int sum = 0;
  339.     u_short answer = 0;
  340.     /*
  341.      * Our algorithm is simple, using a 32 bit accumulator (sum), we add
  342.      * sequential 16 bit words to it, and at the end, fold back all the
  343.      * carry bits from the top 16 bits into the lower 16 bits.
  344.      */
  345.     while (nleft > 1)  {
  346.         sum += *w++;
  347.         nleft -= 2;
  348.     }
  349.     /* mop up an odd byte, if necessary */
  350.     if (nleft == 1) {
  351.         *(u_char *)(&answer) = *(u_char *)w ;
  352.         sum += answer;
  353.     }
  354.     /* add back carry outs from top 16 bits to low 16 bits */
  355.     sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
  356.     sum += (sum >> 16);         /* add carry */
  357.     answer = ~sum;              /* truncate to 16 bits */
  358.     return(answer);
  359. }