Сканер портов на C#

Дата публикации: 06-05-2011 | Автор: MelfisFettel | Рубрика: C#

Visual C#Сканеры портов это программы для поиска хостов в сети на которых открыты нужные порты. Такие программы обычно используются системными администраторами для проверки безопасности их сетей и злоумышленниками для взлома сети. Может производиться поиск как ряда открытых портов на одном хосте, так и одного определённого порта на многих хостах. Сегодня напишем свой сканер портов. Я для этого использовал Microsoft Visual Studio 2008. При доле фантазии этот пример можно будет расширить и адаптировать под свои нужды.

Итак, создадим новый проект C#. Добавим на форму List View, Progress Bar, два компонента NumericUpDown, один Textbox и кнопку Button.

Настроим ListView:

MultiSelect = false
View = Details
GridLines = true

И добавим несколько колонок “Порт” и “Состояние”. В итоге получим, что то вроде этого:

Форма нашего сканера

Подключим необходимые модули:

1
2
3
using System.Net;  
using System.Net.Sockets; 
using System.Threading; 
using System.Net;  
using System.Net.Sockets; 
using System.Threading; 

Обявим переменную:

1
public static ManualResetEvent connectDone = new ManualResetEvent(false);
public static ManualResetEvent connectDone = new ManualResetEvent(false);

Создадим новую процедуру которая и будет выполнять сканирование портов:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public void Scan()
        {
         int StartPort = Convert.ToInt32(numericUpDown1.Value);
         int EndPort = Convert.ToInt32(numericUpDown2.Value);
         int i;
 
         progressBar1.Maximum = EndPort - StartPort + 1;
         progressBar1.Value = 0;
         listView1.Items.Clear();
            
           
         IPAddress IpAddr = IPAddress.Parse(textBox1.Text);
         for (i = StartPort; i <= EndPort; i++)
             {
              //Создаем сокет
              IPEndPoint IpEndP = new IPEndPoint(IpAddr, i);
              Socket MySoc = new Socket(AddressFamily.InterNetwork, 
                                       SocketType.Stream, ProtocolType.Tcp);
              //Пробуем подключится к указанному хосту
              IAsyncResult asyncResult = MySoc.BeginConnect(IpEndP, 
                               new AsyncCallback(ConnectCallback), MySoc);
 
 
              if (!asyncResult.AsyncWaitHandle.WaitOne(30, false))
                {
                 MySoc.Close();
                 listView1.Items.Add("Порт " + i.ToString());
                 listView1.Items[i - StartPort].SubItems.Add("закрыт");
                 listView1.Items[i - StartPort].BackColor = Color.Bisque;
                 progressBar1.Value += 1;
                }
                else
                {
                MySoc.Close();
                listView1.Items.Add("Порт " + i.ToString());
                listView1.Items[i - StartPort].SubItems.Add("открыт");
                listView1.Items[i - StartPort].BackColor = Color.LightGreen;
                progressBar1.Value += 1;     
                }
             }
 
             progressBar1.Value = 0;
        }        
public void Scan()
        {
         int StartPort = Convert.ToInt32(numericUpDown1.Value);
         int EndPort = Convert.ToInt32(numericUpDown2.Value);
         int i;

         progressBar1.Maximum = EndPort - StartPort + 1;
         progressBar1.Value = 0;
         listView1.Items.Clear();
            
           
         IPAddress IpAddr = IPAddress.Parse(textBox1.Text);
         for (i = StartPort; i <= EndPort; i++)
             {
              //Создаем сокет
              IPEndPoint IpEndP = new IPEndPoint(IpAddr, i);
              Socket MySoc = new Socket(AddressFamily.InterNetwork, 
                                       SocketType.Stream, ProtocolType.Tcp);
              //Пробуем подключится к указанному хосту
              IAsyncResult asyncResult = MySoc.BeginConnect(IpEndP, 
                               new AsyncCallback(ConnectCallback), MySoc);


              if (!asyncResult.AsyncWaitHandle.WaitOne(30, false))
                {
                 MySoc.Close();
                 listView1.Items.Add("Порт " + i.ToString());
                 listView1.Items[i - StartPort].SubItems.Add("закрыт");
                 listView1.Items[i - StartPort].BackColor = Color.Bisque;
                 progressBar1.Value += 1;
                }
                else
                {
                MySoc.Close();
                listView1.Items.Add("Порт " + i.ToString());
                listView1.Items[i - StartPort].SubItems.Add("открыт");
                listView1.Items[i - StartPort].BackColor = Color.LightGreen;
                progressBar1.Value += 1;     
                }
             }

             progressBar1.Value = 0;
        }        

И саму CallBack функцию которая будет вызывать EndConnect() завершающую попытку соединения:

1
2
3
4
5
6
7
8
9
10
11
12
13
private static void ConnectCallback(IAsyncResult ar)
        {
         try
            {
             Socket SockClient = (Socket)ar.AsyncState;
             SockClient.EndConnect(ar);
             connectDone.Set();
            }
            catch (Exception e)
            {
            
            } 
        }
private static void ConnectCallback(IAsyncResult ar)
        {
         try
            {
             Socket SockClient = (Socket)ar.AsyncState;
             SockClient.EndConnect(ar);
             connectDone.Set();
            }
            catch (Exception e)
            {
            
            } 
        }

В обработчике нажатия на кнопку Button1 вызовем Scan() :

1
2
3
4
private void button1_Click(object sender, EventArgs e)
        {
            Scan();
        }
private void button1_Click(object sender, EventArgs e)
        {
            Scan();
        }

Вот и все. Сканер портов готов.

По этой ссылке можно скачать готовый пример

Понравилась статья? Расскажи друзьям:


Обсудить