Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кулаков В.Г. Методические указания к лабораторн...doc
Скачиваний:
5
Добавлен:
04.05.2019
Размер:
286.72 Кб
Скачать

Лабораторная работа №5

5.1. Цель и содержание работы

Целью работы является изучение правил использования функций библиотеки Winsock2 для определения состояния портов локального компьютера.

Отчет о лабораторной работе не оформляется. Прием задания производится непосредственно на компьютере по предъявлению работающей, полностью отлаженной программы.

5.2. Сканирование портов

Малоизвестная, но важная организация Internet Assigned Numbers Authority (IANA) отвечает за распределение IP-адресов и назначает ответственных за имена доменов верхнего уровня. IANA также поддерживает список сетевых портов, по которым можно подключаться к определенным сервисам.

Номер порта присвоен почти каждому значительному приложению. Как для TCP, так и для UDP-сервисов эти номера лежат в диапазоне от 1 до 65535. Номера портов от 0 до 1023 считаются зарезервированными для общеупотребительных приложений и называются общеизвестными. Номера портов с 1024 по 65535 можно регистрировать в IANA для конкретных приложений, но подобная регистрация не является обязательной.

Недолговечные номера портов, которые используются для соединения с другими машинами, выбираются операционной системой случайным образом из номеров, превышающих 1024. Например, для загрузки web-страницы ваша машина обращается к порту 80 web-сервера, а сервер видит входящее соединение с некоторым случайным номером порта.

То, что пакет помечен для порта 80, не запрещает ему содержать данные, отличные от web-трафика. Многие приложения, такие как программы обмена сообщениями, которые обычно блокируются межсетевым экраном, нарушают конвенцию и проскальзывают через порт 80, который остается открытым.

Когда порт на компьютере открыт, он получает весь направляемый в него трафик, законный или незаконный. Посылая некорректно сформированные пакеты, иногда можно вызвать аварийное завершение основного приложения (в результате переполнения буфера данных), перенаправить поток управления и незаконно получить доступ к машине. Необходимо внимательно следить за тем, какие приложения или порты видны в вашей сети. Эти порты являются окнами, через которые хакеры могут запускать свой вредоносный код.

Выявить открытые порты можно с помощью сканеров. Сканеры поочередно опрашивают порты и смотрят, не ответит ли приложение. Если ответ получен, это означает, что некоторое приложение слушает порт с данным номером. Сканеры можно сконфигурировать для опроса всех или только общеизвестных портов. Веская причина для полного сканирования состоит в том, что троянские программы, чтобы избежать обнаружения, нередко используют нетрадиционные порты с номерами в верхней части диапазона. Пример простейшего сканера приведен в листинге 5.1.

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

#include "stdafx.h"

#include <winsock2.h>

int main(int argc, _TCHAR* argv[])

{

int start, end, i;

char ip[50];

struct servent *srv;

WSADATA wsd;

SOCKET sd;

struct sockaddr_in loc;

if(WSAStartup(0x0101, &wsd))

{

printf("wsd error\n");

return -1;

}

printf("IP: "); gets(ip);

printf("Start port number: "); scanf("%d",&start);

printf("End port number: "); scanf("%d",&end);

printf("\nPort\tState\tName\n");

for(i = start; i <= end; i++)

{

printf("%d\t",i);

loc.sin_family = AF_INET;

loc.sin_port = htons(i);

loc.sin_addr.s_addr = inet_addr(ip);

sd = socket(AF_INET, SOCK_STREAM, 0);

if(connect(sd, (struct sockaddr *)&loc, sizeof(loc)))

printf("close\t");

else printf("open\t");;

if(srv = getservbyport(htons(i), NULL))

printf(srv->s_name);

printf("\n");

closesocket(sd);

}

getchar();

return 0;

}

Использованная в данном примере в качестве вспомогательной функция struct servent* FAR gethostbyport(int port, const char* proto) возвращает указатель на структуру servent, которая содержит определить параметры порта. Функция имеет два параметра: port – номер порта; proto – указатель на строку, содержащую название протокола (необязательный параметр, вместо которого можно задать NULL).

Структура servent определена следующим образом:

typedef struct servent {

char FAR* s_name;

char FAR FAR** s_aliases;

short s_port;

char FAR* s_proto;

} servent;

Поля структуры имеют следующее назначение:

  • s_name – официальное наименование сервиса;

  • s_aliases – список альтернативных названий сервиса;

  • s_port – номер порта, к которому привязан сервис;

  • s_proto – наименование используемого сервисом протокола.

В примере используется только одно из полей структуры – поле s_name, которое содержит наименование связанного с портом сервиса.