Delphi FTPsend вылетает

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by triblekill, 15 Jan 2018.

  1. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Собственно программа отправляет пару паролей затем вылетает с ошибкой что то вроде Access violation at address 000000 to 000000(в том числе даже если подключаю прокси)
    PHP:
    for i:=0 to list.count-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)
     
  2. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,491
    Reputations:
    25
    В какой строчке-то ?
    tftpsend.Create может возвращать 0 например (вроде бы, точно не знаю как с этим в Delphi и кстати надо-бы может удалять объект ? А то он в памяти остается после этого create.).
    pass тоже не очень правильно ибо ты проходишь по списку list а индекс юзаешь в pass. Чревато.
     
  3. triblekill

    triblekill Member

    Joined:
    21 Aug 2011
    Messages:
    351
    Likes Received:
    94
    Reputations:
    1
    Нет код абсолютно рабочий и всё нормально с переменными вот если я бручу на несуществующий аккаунт всё тик так, а вот если на существующий то почему то сбрасывает чтоли какая то защита серверов ftp ?
     
  4. DartPhoenix

    DartPhoenix Elder - Старейшина

    Joined:
    15 Sep 2013
    Messages:
    1,107
    Likes Received:
    8,491
    Reputations:
    25
    Ну... ладно. Какой компонент юзаешь ?

    Может ему нужен какой-то callback чтоб был заполнен, но если он этого не проверяет то нахрен такой компонент не нужен.
    Неплохо бы посмотреть стек вызовов еще, но кажись дебугга Delphi так не могет а ручками умаяться можно.

    Access Violation по адресу 00000000 - значит что там где ожидался указатель - пусто.
    =========
    Компонент определен: TFTPSend из Synapse. Х/з. С виду все ок.
     
    #4 DartPhoenix, 15 Jan 2018
    Last edited: 15 Jan 2018
  5. #colorblind

    #colorblind Moderator

    Joined:
    31 Jan 2014
    Messages:
    637
    Likes Received:
    246
    Reputations:
    42
    С учетом того, что это брут, скорее всего у компонента где-то переполняется буфер, т.к. он не расчитан на 100-500 неверных паролей. Оптимальное решение - сырые сокеты. Костыль - уничтожать и создавать заново экземпляр компонента при каждом/серии неверных паролей.
     
  6. enigma

    enigma Member

    Joined:
    10 Jul 2011
    Messages:
    80
    Likes Received:
    15
    Reputations:
    7
    Либо попробуйте использовать для этого 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
     
    #colorblind likes this.