Программирование на Visual Basic

Сканер портов на vb

Надеюсь, вы меня простите - все свои действия я буду описывать максимально конкретно. Дело в том, что я уже сталкивался с тем, что напишешь код и покажешь прогу, и твой ящик забивают новички вопросами типа "а почему не виден таймер", "как ты поставил Winsock на форму" и даже "как из двух форм одну сделать стартовой". Мы рассчитываем не только на продвинутого пользователя и если вы всё это знаете не надо дополнять статью комментариями типа "Да это всё известно, да ты прямо открытие сделал". Спасибо.

Пожалуй, начнём…

Попросите любого хакера назвать несколько сканеров портов, и вы услышите в ответ - xSharez, Essential Net Tools и др. То есть в новых сканерах никто не нуждается и эта статья окажется бесполезной. Но давайте порассуждаем, мой дорогой друг. В чём заключается вся необходимость в этих самых сканерах? Запускаете его, значит. Он вам находит кучу IP адресов (а xSharez показывает только расшаренные адреса и это его отличает от других сканеров) и вы захватываете чей-нибудь диск. Ищете на нём всё что надо - ну не буду вдаваться в подробности, все мы пользовались (или пользуемся) халявным Инетом - и всё, дело сделано.

Зачем нам писать что-то новое, когда существуют десятки, сотни - если не тысячи - самых разных сканеров? Суть этой статьи - объяснить, как написать сканер на Visual Basic.

Многие программисты и некоторые хакеры называют Visual Basic "Фортраном для слабоумных" и если такое говорит продвинутый программист, это ещё простительно, но когда вам в лицо так заявляет какой-нибудь чайник, считающий себя крутым дизайнером или программером, это, несомненно, заставит вас врезать ему пару фраз о том, что многие продукты, которыми он пользуется с самого рождения сделаны на VB. Вы тоже такого мнения? Да? Ну, вот и хорошо! Значит, мы с вами из одного теста и найдём общий язык. На VB возможно многое и осуществляется это намного проще, чем в других языках программирования и с точки зрения написания кода и с точки зрения вставки какого-нибудь элемента и т. д. Я не говорю ничего против C++ или Delphi - я сам на них программирую, но легче всего создать программу действительно на VB.

Мне очень охота развеять мнение о том, что на VB нельзя сделать ничего серьёзного - и возможно вы меня упрекнёте в том, что я в качестве "серьёзной" программы выбрал сканер портов, но я завёл речь о хакинге, и буду продолжать - просто на VB в основном работают начинающие программеры.

Теперь начнём…

Вступление затянулось, и вы подумали, что я зануда. Спешу вас огорчить - это действительно так, когда меня просят о чём-то рассказать я начинаю умничать и выдаю слишком много инфы из которой половина - моё личное мнение.

Ну, начнём…

Я не буду рассказывать, как написать сложный скан, который сканирует адреса в заданном диапазоне, т. к. места одной статьи мне не хватит, а нужно место примерно одной книжечки.

Представим, что у вас есть нужный IP-адрес и вам надо узнать порты этого компа, для такой ситуации и сделаем скан. Если у вас возникнет желание написать скан, который будет сканировать диапазон, то можете воспользоваться этой статьёй как примером и вместо одного IP сканировать несколько один за другим.

Думаю пора начать…

Итак, открываем VB и создаём новый проект Standard EXE, надеюсь, все эти операции вам давно знакомы (хотя бы из моих статей). Форму переименовываем на frmMain для удобства.

Теперь рисуем на форме нужные компоненты: нарисуйте TextBox и скопируйте его в буфер обмена (Ctrl + C). Переименуйте на txtStart. Затем вставьте из буфера одно поле TextBox (Ctrl + V) и VB спросит у вас "You already have a control named txtStart. Do you want to create a control array?", что в переводе на русский означает примерно следующее: "Дорогой мой пользователь! Милый! Может тебе создать массив для удобства а?". Нажимаем "Да" (или "Yes"). Теперь VB создал массив и он (VB) присвоил свойству Index контрола TextBox цифру 0, а вставленному - цифру 1. Теперь вставляем ещё таких же контролов четыре штуки, с помощью Ctrl + V и VB больше ничего спрашивать не будет - он умный. Итого у вас должно получиться шесть TextBox"ов.

Контролам txtStart(0), txtStart(1), txtStart(2) и txtStart(3) свойству MaxLength присваиваем 3, а остальным двум 5. То есть в первые четыре будет писаться IP (а он состоит из нескольких цифр, длина которых не больше трёх) и два поля, в которые пишется диапазон сканируемых портов (от 1 до 99999).

Также добавьте несколько элементов Label и измените их свойства Caption примерно так, как показано на рисунке.

Теперь нарисуем ListBox на нашей форме и назовём этот список lstPort.

Самое время сохранить проект и сохранять его в дальнейшем. Я назвал проект PC Port Scan.

Ну, какая программа без кнопок управления. Создаём три кнопки на форме методом протягивания. Называем их cmdGo, cmdAbout, cmdExit и меняем для них свойства Caption "ПОШЁЛ!", "О ПРОГЕ" и "ВЫХОД" соответственно.

Для удобства и красоты давайте добавим строку состояния и показатель прогресса. Нажимаем правой кнопкой на панели инструментов

и в появившемся контекстном меню выбираем Components (на русском Компоненты). Должна появиться форма с компонентами.

В ней отмечаем галочкой Microsoft Windows Common Controls 5.0 и Microsoft Winsock Control. Теперь нажимаем на кнопку OK и у нас на панели инструментов появились новые компоненты.

Затем обязательно сохраните проект - File/SaveProject (Файл/Сохранить проект), а не Ctrl + S (т. к. при нажатии Ctrl + S VB сохранит только форму). Сохранение необходимо для того, чтобы VB привязал выбранные новые компоненты (контролы) к проекту, а то при повторном запуске без привязки контролов проект не будет запускаться корректно.

Рисуем на форме контрол ProgressBar


и задаём его свойству Align параметр - 2 - vbAlignBottom - то есть при изменении размеров нашей формы, ProgressBar будет автоматически располагаться внизу формы. Поменяем имя прогрессбара на PB и идём дальше.

Теперь, конечно же, самое главное - Winsock. С помощью него-то мы и будем сканировать порты. Размещаем его в любом месте на форме. Именуем как WS. А свойству Index присваиваем значение 0 - это нам ещё пригодится для создания новых Winsock"ов.


Также поставим на форму таймер. Назовём его T и приравниваем Interval = 1.

Ну и, наконец - строка состояния. Устанавливаем на форме методом протягивания элемент Label прямо над прогрессбаром. Называем нашу надпись lblStatus и изменяем её свойство BorderStyle на 1 - FixedSingle. Теперь она стала вогнутой - как строка состояния.

Приступим к программированию…

Ну, вот и дошли до программного кода. Я сократил его, как только мог и сделал более читабельным, понаписав комментариев. Вот код:

Private Sub cmdAbout_Click() "Ну при нажатии кнопки О ПРОГЕ
MsgBox "PC Port Scan" & vbCrLf & "Copyright (C) 2003 by Daniyar Atadjanov", , "О программе"
End Sub
Private Sub cmdExit_Click() "Выход из программы
End
End Sub
Private Sub cmdGo_Click() "Сканирование
On Error Resume Next "На всякий случай исключаем ошибки
Dim S As Variant, i As Integer "Объявления
Dim NowPort As Integer "Переменная для хранения текущего порта
If cmdGo.Caption = "ПОШЁЛ!" Then "Проверка состояния кнопки
For i = 0 To 5
txtStart(i).Enabled = False "Отключаем поля ввода
Next i
cmdGo.Caption = "СТОП" "Пишем стоп
NowPort = txtStart(4)
lstPort.Clear "Очищаем ЛИСТБОКС
lstPort.AddItem "Сканирование начато " & Time
While cmdGo.Caption = "СТОП"
PB.Max = Val(txtStart(5))
For Each S In WS
DoEvents
If S.State <> sckClosed Then
GoTo 1
End If
S.Close
If NowPort = Val(txtStart(5)) + 1 Then Exit For
S.RemoteHost = txtStart(0) & "." & txtStart(1) & "." & txtStart(2) & "." & txtStart(3)
S.RemotePort = NowPort
lblStatus = "Сканируется " & NowPort & " порт" "Пишем в статус
S.Connect
NowPort = NowPort + 1 "Идём дальше, прибавляем порт
If NowPort <= PB.Max Then PB.Value = NowPort Else GoTo 2 "Закончено ли
1:
Next S
Wend
2:
cmdGo.Caption = "ПОШЁЛ!"
For i = 0 To 5
txtStart(i).Enabled = True
Next i
Else
cmdGo.Caption = "ПОШЁЛ!"
End If

lblStatus = "Выгрузка"
For i = 0 To 5
txtStart(i).Enabled = True
Next i
lstPort.AddItem "Сканирование закончено " & Time "Сообщаем об окончании
lblStatus = "Готово. Просканировано " & NowPort - 1 & " портов" "Число просканированных портов
cmdGo.Caption = "ПОШЁЛ!"
PB.Value = 0
End Sub
Private Sub T_Timer()"При загрузке формы, через 1 миллисекунду запускается таймер и выключается. Я решил применить именно таймер, т. к. использовать процедуру Form_Load процесс загрузки элементов нельзя будет увидеть.
Dim i As Integer
Const M = 100
lblStatus = "Загрузка вспомогательных элементов"
PB.Max = M
For i = 1 To M
Load WS(i) "Загружаем новый Winsock
PB.Value = I "Показываем процесс
Next i
lblStatus = "Готово"
PB.Value = 0
T.Enabled = False "Вырубаем наш таймер
End Sub
Private Sub txtStart_Change(Index As Integer)
On Error Resume Next
If Len(txtStart(Index)) = 3 And Index <> 6 Then txtStart(Index + 1).SetFocus "Переходим на следующее поле ввода, если превышено допустимое количество символов
txtStart(Index) = Val(txtStart(Index)) "Разрешаем ввод только чисел
End Sub
Private Sub txtStart_GotFocus(Index As Integer)
txtStart(Index).SelStart = 0 "Создаём выделение при принятии фокуса в поле
txtStart(Index).SelLength = Len(txtStart(Index))
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = 1 "Иногда форма может исчезнуть, но программа не завершит свою работу загружая память своим присутствием
End
End Sub
Private Sub WS_Connect(Index As Integer)
lstPort.AddItem "Порт " & (WS(Index).RemotePort) & " открыт" "Добавляем найденный порт в ЛИСТБОКС
WS(Index).Close "Ну закрываем конечно
End Sub
Private Sub WS_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
WS(Index).Close "Закрываем при ошибке Winsock"а
End Sub

Ну, вот и всё! Всё очень просто. Программа работает по такому принципу: пытаемся подключиться к порту и если подключение произошло (WS_Connect), то значит порт открыт. Скажу вам по секрету, что когда я написал аналогичный код в C++, то сканер в C++ работал очень медленно - примерно 2 порта в 1 секунду, а написанный нами на VB сканер за секунду сканирует около 200 портов! Впечатляет? Ха, ещё бы! Вот доказательство:

Теперь вы можете писать свой Essential Net Tools.

Приятного программирования…

Hosted by uCoz