#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: parse.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 [ 1024 ] ;
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 );
buff[ nsize ] =0;
printf("S=>C: %s", buff);
if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=0)
{
if(strstr(buff,"331")!=NULL)
{
Sleep(1000);
if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=0)
{
if(strstr(buff,"230")!=NULL)
{
Sleep(1000);
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[+]%s%s%s",user,passwd,host);
}
else if(strstr(buff,"530")!=NULL)
{
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[-]%s%s%s",user,passwd,host);
}
}
}
}
}
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;
}
Ftp checker output problem =\
Вот сам код:
Код:
Код 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 <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;
}
Проблема у меня вот в чем, когда я подсоединяюсь к фтп серверу первым делом записывается ответ в buff потом из buff выводится значение на экран. Далее посылается логин если отослан и в ответе есть 331 отослать пароль если в ответе есть 530 то записать с [-] в файл а если 230 т.е успешно вошли то записать в файл с [+]. Но дело в том что данные то поступают и записываются в buff и складываются там. Если этот участок кода:
Код:
while ( nsize!=SOCKET_ERROR )
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
buff[ nsize ] =0;
printf("S=>C: %s", buff);
if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=0)
{
if(strstr(buff,"331")!=NULL)
{
Sleep(1000);
if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=0)
{
if(strstr(buff,"230")!=NULL)
{
Sleep(1000);
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[+]%s%s%s",user,passwd,host);
}
else if(strstr(buff,"530")!=NULL)
{
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[-]%s%s%s",user,passwd,host);
}
}
}
}
}
printf ( " Recv func error %d \n", WSAGetLastError ( ) );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
continue;
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
buff[ nsize ] =0;
printf("S=>C: %s", buff);
if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0)!=0)
{
if(strstr(buff,"331")!=NULL)
{
Sleep(1000);
if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0)!=0)
{
if(strstr(buff,"230")!=NULL)
{
Sleep(1000);
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[+]%s%s%s",user,passwd,host);
}
else if(strstr(buff,"530")!=NULL)
{
send(my_sock,&quit[0],sizeof(ftp_pass),0);
fprintf(outf,"[-]%s%s%s",user,passwd,host);
}
}
}
}
}
printf ( " Recv func error %d \n", WSAGetLastError ( ) );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
continue;
Заменить на этот:
Код:
int nsize;
while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR )
{
buff[ nsize ] =0;
printf ( " S=>C: %s ", buff ) ;
printf ( "S<=C: " ) ;
fgets ( &buff [ 0 ] , sizeof ( buff ) -1, stdin );
send ( my_sock, &buff [ 0 ], nsize, 0 ) ;
}
printf ( " Recv error %d \n", WSAGetLastError ( ) );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
continue;
while ( ( nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 ) ) !=SOCKET_ERROR )
{
buff[ nsize ] =0;
printf ( " S=>C: %s ", buff ) ;
printf ( "S<=C: " ) ;
fgets ( &buff [ 0 ] , sizeof ( buff ) -1, stdin );
send ( my_sock, &buff [ 0 ], nsize, 0 ) ;
}
printf ( " Recv error %d \n", WSAGetLastError ( ) );
closesocket ( my_sock ) ;
WSACleanup ( ) ;
continue;
То давая команды фтп серверу можно увидеть как из buff выводятся все значения а не последнее. Так как же мне сделать так чтобы из buff бралось и выводилость только последнее значение чтобы правильно проанализировать ответ фтп сервера я не знаю.
Товарищи эксперты, кодеры и пользователи ;-) не оставьте без внимания пожалуйста я очень хочу разобраться но чтото никак не выходит у меня. Ответьте кодом пожалуйста, просто я уже много перепробовал сам я новичок в этом деле и когда задался этим вопросом ответа так и не получил нормального.
Код:
if(send(my_sock,&ftp_user[0],sizeof(ftp_user),0))
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
if(nsize == SOCKET_ERROR)
return error;
buff[ nsize ] =0;
if(strcmp(buff, "331"))
return error;
if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0))
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
if(nsize == SOCKET_ERROR)
return error;
buff[ nsize ] =0;
if(!strcmp(buff,"230"))
{
fprintf(outf,"[+]%s %s %s",user,passwd,host);
}
else if (!strcmp(buff,"530"))
{
fprintf(outf,"[-]%s %s %s",user,passwd,host);
}
else
return error;
}
}
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
if(nsize == SOCKET_ERROR)
return error;
buff[ nsize ] =0;
if(strcmp(buff, "331"))
return error;
if(send(my_sock,&ftp_pass[0],sizeof(ftp_pass),0))
{
nsize = recv ( my_sock, &buff[0], sizeof ( buff ) -1,0 );
if(nsize == SOCKET_ERROR)
return error;
buff[ nsize ] =0;
if(!strcmp(buff,"230"))
{
fprintf(outf,"[+]%s %s %s",user,passwd,host);
}
else if (!strcmp(buff,"530"))
{
fprintf(outf,"[-]%s %s %s",user,passwd,host);
}
else
return error;
}
}
Типа того.
Код:
#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: parse.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 [1024];
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(strcmp(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);
closesocket(my_sock);
WSACleanup();
}
else if (strstr(buff,"530")!=NULL)
{
Sleep(1000);
printf("S=>C: %s",buff);
fprintf(outf,"[-]ftp://%s:%s@%s\n",user,passwd,host);
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;
}
#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: parse.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 [1024];
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(strcmp(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);
closesocket(my_sock);
WSACleanup();
}
else if (strstr(buff,"530")!=NULL)
{
Sleep(1000);
printf("S=>C: %s",buff);
fprintf(outf,"[-]ftp://%s:%s@%s\n",user,passwd,host);
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;
}
Но это конечно для частного случая когда выдаётся ответ в одну строку, а вот если ответ большой то это плохо ;-). Но это чекает и уже хорошо. Попробую доработать. Спасибо Alexandoros за совет.
Ух бился бился я так и не получается :( Все способы перебрал уже помойму, никак он у меня этот чекер работать нормально не хочет. Пожалуйста киньте подправленный исходник. Просто опять та же ситуация получается если есть список и например рабочий фтп стоит на пятом месте то программа его заносит как не рабочий, а если его поставить в начало файла или на второе место то всё нормально рабочий говорит :) Так что подправьте пожалуйста а то я застопорился сильно с этим вопросом.
Народ ну помогите в фтп чекером ;( Я не знаю как исправить.
И перепеши как я написал
Алекс ты что думаешь я не переписывал как ты сказал чтоли? Ну ты попробуй список загнать в 50 ftp гдето и всё прочекать. Первые 4 нормально проверятся а потом начинается тот же геморрой ;( Я уже переделывал раз 100 наверное всё равно одно и тоже. Я поэтому код и выложил весь и прошу подправить потому что просто не знаю уже как решить проблему эту.