Создание сканера портов

      IP инструмент сканирования может оказаться полезным, если вы хотите проверить безопасность вашего компьютера. Открытый порт это не обязательно приглашение для хакеров, так как приложения и сервисы вашего или другого компьютера могут использовать порты для выхода в Интернет или локальную сеть. Например, для веб-сервера по умолчанию открыт 80-й порт, или на FTP-сервере - 21-й порт. Рассмотрим класс TcpClient, расположенный в пространстве имен «System.Net.Sockets» и обеспечивает простые методы для подключения, а также отправки и получения потоков данных в сети. Рассмотрим проверку открытых портов удаленного сетевого устройства.
      Создайте проект Windows Form в Microsoft Visual Studio и добавьте на главную форму следующие элементы управления:
  • backgroundWorker1 – служит для запуска процесса проверки открытых портов сетевого устройства в другом потоке;
  • textBox1 – текстовое поле для ввода сетевого адреса устройства;
  • numericUpDown1 – элемент управления для ввода стартового номера порта;
  • numericUpDown2 – элемент управления для ввода конечного номера порта;
  • listBox1 – элемент управления для вывода открытых/закрытых портов;
  • button1 – кнопка запуска процесса получения открытых/закрытых портов, заданного диапазона.
У вас получится приведенная ниже форма:
      Выберете элемент управления «numericUpDown1» и перейдите в его свойства. Найдите свойство «Maximum», выставляющее максимальное значение, которое можно выбрать в данном элементе управления и выставьте значение 25.
      Выполните такую же операцию с компонентом «numericUpDown2» и дополнительно выставьте в свойстве «Value», значение 25. Данный параметр установит это значение по умолчанию.Сделайте двойной клик по компоненту «backgroundWorker1», вы перейдете в автоматически созданный метод «backgroundWorker1_DoWork», события «DoWork». Это событие возникает при вызове метода «RunWorkerAsync» и код размещенный в данном методе выполняется в отдельном потоке, что позволяет предотвратить зависание приложения, при долгом выполнении каких либо действий. Добавьте приведенный ниже код в тело данного метода.
// Заносим в переменную StartPort стартовый номер порта из компонента NumericUpDown
int StartPort = Convert.ToInt32(numericUpDown1.Value); 
// Заносим в переменную EndPort конечный номер порта из компонента 
int EndPort = Convert.ToInt32(numericUpDown2.Value);            

for (int CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
{ 
    //Инициализируем новый экземпляр класса 
    System.Net.Sockets.TcpClient TcpScan = new System.Net.Sockets.TcpClient(); 
    try 
    { 
        //Выполняем подключение клиента к указанному порту заданного узла.
        TcpScan.Connect(textBox1.Text, CurrPort);
        //Если подключение выполнено успешно то выводим в listBox1
        PortOpen(CurrPort);                    
    }
    catch 
    { 
        //Если возникло исключение то порт закрыт
        PortClose(CurrPort);
    }
    //Переводим курсор на последнюю строку списка
    selectedIndex();
}
      В данном коде используется цикл «for», где в качестве условия, устанавливается начальное значение переменной i равное номеру порта, указанного в элементе управления «numericUpDown1», а в качестве условия окончания цикла, выставляется значение, указанное в элементе управления «numericUpDown2». Данный цикл выполняется с шагом, равному единице. В теле данного цикла создается новый экземпляр класса «System.Net.Sockets.TcpClient» и выполняется вызов метода «Connect». Данный метод подключает клиента к удаленному TCP-узлу, указанному в элементу управления «textBox1» и номеру порта который каждый раз увеличивается в условии цикла. Если код вызывает исключение, это вероятно, потому что подключение было неудачным. Однако если нет никаких исключений, это означает, что TcpClient успешно подключен к порту и, таким образом, порт открыт. 
      Обработчик событий «DoWork» не позволяет выполнять действия ни с какими объектами пользовательского интерфейса. Для обхода данного ограничения в коде присутствует вызов методов «selectedIndex», «PortOpen», «PortClose». Данные методы выполняют указанный делегат асинхронно в потоке, в котором был создан базовый дескриптор элемента управления. Добавьте в листинг главной формы код объявления данных методов.
public void selectedIndex()
{
    try
    {
        if (InvokeRequired)
            BeginInvoke(new MethodInvoker(delegate
            {
                listBox1.SelectedIndex = listBox1.Items.Count - 1;
            }));
        else
        {
            listBox1.SelectedIndex = listBox1.Items.Count - 1;
        }
    }
    catch (Exception) { }
}

public void PortOpen(int port)
{
    try
    {
        if (InvokeRequired)
            BeginInvoke(new MethodInvoker(delegate
            {
                listBox1.Items.Add("Порт " + port + " открыт"); 
            }));
        else
        {
            listBox1.Items.Add("Порт " + port + " открыт"); 
        }
    }
    catch (Exception) { }
}

public void PortClose(int port)
{
    try
    {
        if (InvokeRequired)
            BeginInvoke(new MethodInvoker(delegate
            {
                listBox1.Items.Add("Порт " + port + " закрыт"); 
            }));
        else
        {
            listBox1.Items.Add("Порт " + port + " закрыт"); 
        }
    }
    catch (Exception) { }
}
      Перейдите в конструктор главной формы, выполнив сочетание клавиш «Shift+F7». Найдите добавленный компонент «backgroundWorker1», сделайте по нему клик правой клавишей мыши и выберете из появившегося контекстного меню, пункт «Свойства».
      В окне свойств, перейдите в события данного компонента, нажав в верхней части на значок «молнии». Найдите и сделайте двойной клик левой клавишей мыши по событию «RunWorkerCompleted». Вы перейдете в автоматически созданный метод «backgroundWorker1_RunWorkerCompleted». Добавьте в него приведенный ниже код.
//Разблокируем кнопку по завершению процесса
button1.Enabled = true;
      Для запуска процесса проверки открытых портов необходимо перейти в конструктор главной формы, выполнив сочетание клавиш «Shift+F7» и сделать двойной клик левой клавишей мыши по компоненту «button1». Вы перейдете в автоматически созданный метод «button1_Click» события компонента «Click». Добавьте приведенный ниже код в тело данного метода.
//Очищаем список перед выводом данных
listBox1.Items.Clear();
//Блокируем кнопку, для предотвращения повторного запуска
//процесса, при уже запущенном процессе
button1.Enabled = false;
backgroundWorker1.RunWorkerAsync();
      Запустите ваш проект, нажав на клавиатуре, клавишу «F5». Введите адрес сетевого устройства и выставьте значения начального и конечного портов, которые программа будет проверять. Нажмите кнопку «Старт», по мере сканирования программа будет построчно выводить в компонент «listbox1» данные об открытых или закрытых портах.

Ссылка для скачивания примера: Rusfolder.net


4 комментария:

  1. Приложите исходники, т.к. при сборке на многое ругается, чтобы посмотреть

    ОтветитьУдалить
  2. и комментарии тогда не обязательно удалять можно ответить на e-mail, он у Вас прописан nik_user@mail.ru

    ОтветитьУдалить
  3. Отпишите какие ошибки у вас возникают при построении проекта!

    ОтветитьУдалить
  4. По вашей просьбе в пост был добавлен исходник!

    ОтветитьУдалить

Большая просьба, не писать в комментариях всякую ерунду не по теме!