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 после каждой проверки либо выводить из него только последнее полученное значение а как это сделать я не знаю, чтото не получается :( У кого будет время скомпилируйте проверьте сами и посмотрите в чём там ошибка. Я просто уже и не знаю как править код.
|