Собственно программа отправляет пару паролей затем вылетает с ошибкой что то вроде Access violation at address 000000 to 000000(в том числе даже если подключаю прокси) PHP: for i:=0 to list.count-1 do begin FTP:=tftpsend.Create; FTP.TargetHost:=Edit1.text; FTP.TargetPort:=Edit2.text; FTP.UserName:=Edi3.text; FTP.Password:=pass[i]; if FTP.Login then Memo1.lines.Add('good');end; Но если я бручу на неверный или не существующий логин то всё нормально ! (Проверяю на себе через filezilla server и хостинг от 1gb)
В какой строчке-то ? tftpsend.Create может возвращать 0 например (вроде бы, точно не знаю как с этим в Delphi и кстати надо-бы может удалять объект ? А то он в памяти остается после этого create.). pass тоже не очень правильно ибо ты проходишь по списку list а индекс юзаешь в pass. Чревато.
Нет код абсолютно рабочий и всё нормально с переменными вот если я бручу на несуществующий аккаунт всё тик так, а вот если на существующий то почему то сбрасывает чтоли какая то защита серверов ftp ?
Ну... ладно. Какой компонент юзаешь ? Может ему нужен какой-то callback чтоб был заполнен, но если он этого не проверяет то нахрен такой компонент не нужен. Неплохо бы посмотреть стек вызовов еще, но кажись дебугга Delphi так не могет а ручками умаяться можно. Access Violation по адресу 00000000 - значит что там где ожидался указатель - пусто. ========= Компонент определен: TFTPSend из Synapse. Х/з. С виду все ок.
С учетом того, что это брут, скорее всего у компонента где-то переполняется буфер, т.к. он не расчитан на 100-500 неверных паролей. Оптимальное решение - сырые сокеты. Костыль - уничтожать и создавать заново экземпляр компонента при каждом/серии неверных паролей.
Либо попробуйте использовать для этого wininet. Мною очень давно что то подобное делалось. Весьма успешно, при многих потоках пример: Code: HINTERNET hOpen,hConnect = NULL; //могут быть ошибки, написано по памяти string server = "127.0.0.1"; string login = "login"; string passw = "12345"; Open=InternetOpen("Ftp",0,NULL,NULL,0); if(!Open) return; hConnect = InternetConnect(Open,server.c_str(),21,login.c_str(),passw.c_str(),INTERNET_SERVICE_FTP,0,0); if(!hConnect) { // нужно почитать документацию что возвращает InternetConnect при неверном логине или пароле. Вполне возможно что пойдет и (!hConnect) InternetCloseHandle(hConnect); return; } if(hConnect!=NULL) { cout << server <<'\n' << login <<'\n' << passw; } Но не стоит забывать что wininet берет настройки прокси из internet explorer если не ошибаюсь, для игнорирования, нужно использовать флаг INTERNET_OPEN_TYPE_PRECONFIG в функции InternetOpen