Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
prakt-Storozhok.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
7.98 Mб
Скачать

Занятие 10. Исследование методов сканирования сети

В предлагаемой работе создается приложение для сканирования сети.

Цель работы: исследовать методы сканирования сети и определения установленных служб на удаленных компьютерах.

1. Теоретическое введение

В работе реализуется метод открытого сканирования сети «TCP SYN». Этот метод состоит в последовательной передаче на объект сканирования SYN-запроса для создания соединений на различных портах (вызов функции connect).

Возможны следующие реализации метода открытого сканирования «TCP SYN»:

  • последовательный вызов функции connect c различными номерами портов. Недостатком этого метода является медленная работа приложения, так как новое соединение создается только после того, как создано предыдущее соединение;

  • использование асинхронных сетевых функций. При вызове функции connect в асинхронном режиме ОС посылает запрос на установление соединения с сервером и, не дожидаясь реального соединения, продолжает работать дальше. Недостаток этого метода – надо самому проверять результат работы функции. Это несколько усложняет программный код;

  • создание многопоточного сканера. В этом случае для сканирования очередного порта создается новый поток.

В работе реализован последний из рассмотренных методов.

2. ЗАДАНИЕ ПО ЛАБОРАТОРНОЙ РАБОТЕ

2.1. Создание многопоточного приложения для сканирования сети

При создании многопоточного приложения для сканирования сети выполните следующие пункты.

  1. Создайте проект (New Application) (рис. 1).

  2. В разделе uses подключите библиотеку: Winsock.

  3. В разделе VAR добавьте глобальную переменную i – номер очередного проверяемого порта

var

Form1: TForm1;

i: Integer; {номер очередного порта}

implementation.

Рис. 1

4) В разделе implementation выполните описание нижеследующей процедуры сканирования портов:

implementation

{$R *.DFM}

procedure scan;

VAR

s: TSocket; {Сокет}

recipient: TSockAddr; {адрес сокета получателя}

ret: Integer; {результат работы функций}

j: Integer;

addr: Array[1..20] of char;

begin

j := i;

StrPCopy(@addr, Form1.Edit1.text);

// Создание сокета клиента

s := socket(AF_INET,SOCK_STREAM, 0);

If s=INVALID_SOCKET

then

ShowMessageFmt('Ошибка %d при создании сокета',

[WSAGetLastError])

else

begin

// Формирование адреса сервера (получателя сообщения)

ZeroMemory(@recipient,sizeof(recipient));

recipient.sin_family := AF_INET;

recipient.sin_port := htons(i);

recipient.sin_addr.S_addr := inet_addr(@addr);

// Установление соединения

ret := connect(s, recipient, sizeof(recipient));

If ret=SOCKET_ERROR then

Form1.Memo1.Lines.Add('Порт '+IntToStr(j)+' не отвечает')

else

Form1.Memo1.Lines.Add('Порт '+IntToStr(j)+' соединение установлено');

// закрытие сокета

CloseSocket(s);

end;

end;.

5) Для события OnClick кнопки «Сканировать» запишите следующий программный код:

procedure TForm1.Button1Click(Sender: TObject);

VAR hThread: Array [1..100] of THandle;

pFunc: Array [1..100] of pointer;

ThreadID: Array [1..100] of CARDINAL;

wsd: WSADATA; {Структура WSADATA, требуется для инициализации интерфейса сокетов}

k, n: Integer;

begin

// Инициализация интерфейса сокетов

If WSAStartup(MAKEWORD(2,2), wsd)<>0

then ShowMessageFmt('Ошибка %d при инициализации интерфейса сокетов', [WSAGetLastError])

else

begin

k := StrToInt(Edit2.Text); n := StrToInt(Edit3.Text);

For i := k to n do

begin

pFunc[i] := @scan;

// создание очередного потока для сканирования сети

hThread[i] := CreateThread(nil, 0, pFunc[i], nil, 0, ThreadID[i]);

sleep(30);

end;

//WSACleanup;

end;

end;.

6) Откомпилируйте созданное приложение и проверьте его работу.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]