#include "tcpip.h"

void ssyn(int sendsock, u_long srcaddr, u_long dstaddr, u_short srcport, 
	u_short dstport, u_long seq)
{
  char *pack, *tpack;
  int sent;
  struct sockaddr_in stuffz;

  tpack = create_tcp(srcaddr, dstaddr, htons(srcport),
            htons(dstport), htonl(seq), 0, TH_SYN, NULL, 0);
  pack  = create_ip (srcaddr, dstaddr, IPPROTO_TCP, 75, 1,
            tpack, 20);
  stuffz.sin_family      = AF_INET;
  stuffz.sin_port        = htons(dstport);
  stuffz.sin_addr.s_addr = dstaddr;
  sent  = sendto(sendsock, pack, 40, 0, (struct sockaddr *)&stuffz, 
            sizeof(stuffz));
  if (sent != 40) { perror("sending SYN"); exit(-1); }
}
int getpack(int listsock, u_long srcaddr, u_long dstaddr, u_short srcport, 
	u_short dstport, u_long seq)
{
 return 1;
}

main (int c, char *v[])
{
  int ssock, lsock;
  struct hostent *hent;
  struct servent *srvent;
  u_long us, them, fuckk;
  u_short sport, eport;
  u_short skrap;
  u_char flags;
  char mahname[80];
  struct tcphdr *tcphead;

  if (c!=4) { printf("usage: %s <host> <start port> <end port>\n", v[0]);
     exit(-1); }
  gethostname(mahname, 79);
  hent = gethostbyname(mahname);
  if (hent == NULL) {
    printf("couldn't get my hostname!@#\n");
    exit(-1);
  }
  bcopy(hent->h_addr, (char *)&us, hent->h_length);
  hent = gethostbyname(v[1]);
  if (hent!=NULL)
    bcopy(hent->h_addr, (char *)&them, hent->h_length);
  else {
    printf("could not resolve: %s\n", v[1]);
    exit(-1);
  }
  sport = atoi(v[2]);
  if (sport==0) {
    printf("can't use %s as a starting port..\n", v[2]);
    exit(-1);
  }
  eport = atoi(v[3]);
  if (eport==0) {
    printf("can't use %s as an ending port..\n", v[3]);
    exit(-1);
  }
  ssock = socket(AF_INET, SOCK_RAW, 255);
  if (ssock == -1) { perror("getting send socket"); exit(-1); }
  lsock = socket(AF_INET, SOCK_RAW, 6);
  if (lsock == -1) { perror("getting listen socket"); exit(-1); }
  printf("active ports between: %d and %d:\n", sport, eport);
  for (skrap=sport;skrap<eport+1; skrap++) {
    ssyn(ssock, us, them, getpid()+skrap, skrap, 10000000+skrap+getpid());
    usleep(100);
    tcphead = read_tcp();
    while ((ntohs(tcphead->th_sport) != getpid()+skrap) & 
      (ntohs(tcphead->th_dport) != skrap) & ((tcphead->th_flags == TH_SYN) || 
      (tcphead->th_flags == TH_RST))) {
        tcphead = read_tcp();
      }
    if (tcphead->th_flags & TH_SYN) {
      fuckk = tcphead->th_ack - ntohs(tcphead->th_sport) - getpid();
      if (fuckk = 26777216) {
        srvent = getservbyport(tcphead->th_sport, "tcp");
        if (srvent != 0) 
          printf("%s.%d(%s)\n", v[1], ntohs(tcphead->th_sport), srvent->s_name);
        else
          printf("%s.%d\n", v[1], ntohs(tcphead->th_sport));
        execl("rst %s %d %s %d %ul", gethostbyname(mahname), getpid()+skrap, gethostbyname(v[1]), skrap, htonl(seqnum));

      }
    } 
  }
}
