Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Проблема ftp checker

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Проблема ftp checker
Имя
Сообщение << Старые топики   Новые топики >>
Проблема ftp checker - 2007-07-09 16:54:00.946666   
perdimonokl

Сообщений: 6
Оценки: 0
Присоединился: 2007-07-08 19:57:51.446666
Вот проблемка у меня. Писал я фтп чекер и работает он не так как нужно. Вот код:

Это код заголовка ftp_func.h

#include <stdio.h>
#include <string.h>
#include <winsock2.h>
#include <windows.h>

#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"wininet.lib")

char* getipbyhostname (char * hostName)
{
char * hostIP;
struct hostent *hostInfo;

hostInfo = gethostbyname(hostName);
hostIP = inet_ntoa(*((struct in_addr *)hostInfo->h_addr));

return hostIP;
}


Вот код самого чекера:

#include "ftp_func.h"

#define PORT 21        
#define MAX_LINE_TO_READ 1024


int main(int argc, char **argv)
{
  FILE *inf, *outf;
  char *user, *passwd, *host, *someptr, buffer[MAX_LINE_TO_READ + 1] = {0};
 
  if (argc != 3 )
  {
     printf("\n————————————————–\n");
     printf(" Usage: ftp_checker.exe <input file> <output file>\n");
     printf("————————————————–\n");

     return -1;
  }

  if ((inf = fopen(argv[1], "r")) == NULL)
  {
     printf("[-] Could not open input file\n");

     return -1;
  }

  printf("[+] Input file opened…\n");

  if ((outf = fopen(argv[2], "w+")) == NULL)
  {
     printf("[-] Could not open output file\n");

     return -1;
  }

  printf("[+] Output file opened…\n");
  printf("[+] Reading data…\n");

  while(!feof(inf))
  {
     fgets(&buffer[0], MAX_LINE_TO_READ, inf);

     if (someptr = strstr(&buffer[0], "//"))
        user = strtok(&someptr[2], ":");
     else
        user = strtok(&buffer[0], ":");

     passwd = strtok(NULL, "@");
     host = strtok(NULL, "");
     

char buff[4096];

     if (WSAStartup(0x202,(WSADATA *)&buff[0]))
     {
         printf (" WSAStart error %d\n", WSAGetLastError());
         return -1;
     }
     SOCKET my_sock ;
     my_sock=socket(AF_INET, SOCK_STREAM, 0);
     if  (my_sock < 0)
     {
         printf (" Socket() error %d\n", WSAGetLastError());
         return  -1;
     }
     
     sockaddr_in  dest_addr ;
     dest_addr.sin_family=AF_INET;
     dest_addr.sin_port=htons ( PORT );
     HOSTENT *hst; 

     if (inet_addr(host)!=INADDR_NONE)    
     {
         dest_addr.sin_addr.s_addr=inet_addr (host);
     }
     else if ((isalpha(host[0]) || isalpha(host[1]) || isalpha(host[2])))
     {  
           host[strlen(host)-1] = '\0';
           host = getipbyhostname(host);
     }
     else continue;

     if(hst=gethostbyname(host))
     {
         ((unsigned long  *)&dest_addr.sin_addr)[0]=((unsigned long  **) hst->h_addr_list)[0][0];
     }
     else
     {
          printf ( " Invalid address %s\n", host);
          closesocket (my_sock);
          WSACleanup ();
          continue;
     }

     if (connect(my_sock,(sockaddr  *)&dest_addr, sizeof(dest_addr)))
     {
         printf (" Connect error %d\n", WSAGetLastError ());
         continue;
     }
     
     printf (" Successfully connected to %s \n Type quit for quit \n\n" , host );
            

     char ftp_user[256],ftp_pass[256],quit[256];

     strcpy(ftp_user,"USER ");
     strcat(ftp_user,user);
     strcat(ftp_user,"\r\n");
     strcpy(ftp_pass,"PASS ");
     strcat(ftp_pass,passwd);
     strcat(ftp_pass,"\r\n");
     strcpy(quit,"QUIT\r\n");

     int nsize=NULL;
                             

     while ( nsize!=SOCKET_ERROR )
     {
         nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
         printf("S=>C: %s",buff);
         Sleep(1000);

         if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=SOCKET_ERROR)
         {
             nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
             printf("S=>C: %s",buff);   
             buff[ nsize ] =0;

             if(strstr(buff, "331")!=NULL)
             {
                 Sleep(1000);

                 if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=SOCKET_ERROR)
                 {
                       nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
                       printf("S=>C: %s",buff);
                       buff[ nsize ] =0;

                     if(strstr(buff,"230")!=NULL)
                       {
                         Sleep(1000);
                         printf("S=>C: %s",buff);
                         fprintf(outf,"[+]ftp://%s:%s@%s\n",user,passwd,host);
                         ZeroMemory(buff, sizeof(buff));
                         closesocket(my_sock);
                         WSACleanup();
                       }
         
                     else if ((strstr(buff,"530")!=NULL || strstr(buff,"500")!=NULL))
                       {
                         Sleep(1000);
                         printf("S=>C: %s",buff);
                         fprintf(outf,"[-]ftp://%s:%s@%s\n",user,passwd,host);
                         ZeroMemory(buff, sizeof(buff));
                         closesocket (my_sock);
                         WSACleanup ();
                       }
                 }    
             }
         }
     }

     printf ("Recv func error %d\n", WSAGetLastError());
     closesocket (my_sock);
     WSACleanup ();
     continue;

     memset(buffer, MAX_LINE_TO_READ + 1, 0);
  }

  fclose(outf);
  fclose(inf);

  printf("[+] Exiting…\n");

  return 0;
}

Проблема вот в чём. Когда идёт проверка фтп то первый 3-5 чекер проверяет нормально, а потом начинаются проблемы. Информации из buff выводится больше чем нужно и я не знаю из-за чего. Нужно либо очищать buff после каждой проверки либо выводить из него только последнее полученное значение а как это сделать я не знаю, чтото не получается :( У кого будет время скомпилируйте проверьте сами и посмотрите в чём там ошибка. Я просто уже и не знаю как править код.
Post #: 1
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Проблема ftp checker







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.