Рубрики

Создание PortScanner в C

Изобразите залив, где много частных лодок состыковано. Это место называется морским портом, буквально порт в море или на море. Каждый, кто хочет пристыковаться там, запрашивая услуги посадки, использует один и тот же порт. Морские порты работают с номерами причалов, присвоенных отдельным лодкам. Название порта и номер причала объединяются в «кто, что и где» при идентификации судна.

Концепция IP-адреса и порта аналогична. Здесь имя_порта__порта аналогично IP-адресу, а последний соответствует номеру_сети.

Порты пронумерованы для согласованности и программирования. Наиболее часто используемые и наиболее известные порты — это номера от 0 до 1023, предназначенные для использования в Интернете, но они могут расширяться гораздо выше для специализированных целей. Каждому набору портов или диапазону назначаются специализированные задания или функции, и это, как правило, все, что они делают. Обычно все идентичные системные службы или функции используют одинаковые номера портов на принимающих серверах, и они остаются непротиворечивыми, какой бы ни была ситуация.

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

Разработка сканера портов не так сложна, как может показаться. Конечный результат работы сканера будет следующим:

INPUT : IPv4 address, Port Range
FUNCTION : Enter an IP address and a port range 
           where the program will then attempt to
           find open ports on the given computer 
           by connecting to each of them. On any 
           successful connection ports, mark the 
           port as open.
OUTPUT : Status of port (open/closed)

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

Шаг 1: Создание основного ()

Мы создаем функцию main (), которая принимает необходимые аргументы (server_ip, start_port, end_port). IP-адрес сервера должен быть IPv4, хотя мы можем расширить его и для принятия IPv6. Попробуй сам !!

int main(int argc, char *argv[])
{
    if (argc < 4)
    {
        printf ("Please enter the server IP address"
                " and range of ports to be scanned\n");
        printf ("USAGE: %s IPv4 First_Port Last_Port\n", 
                argv[0]);
        exit(1);
    }
    char tIP[16] = {0};
    strcpy(tIP, argv[1]); // Copy the IPv4 address
    char First_Port[6] = {0};
    strcpy(First_Port, argv[2]); // Copy the start_port
    char Last_Port[6] = {0};
    strcpy(Last_Port, argv[3]); // Copy the end_port

    // Start port-scanner
    port_scanner(tIP, First_Port, Last_Port);
    return 0;
}

Шаг 2: Создание port_scanner ()

  • Создайте новую функцию, port_scanner (). Мы проходим через все порты в предоставленном диапазоне и затем проверяем каждый из них.
  • Создайте «подсказки struct addrinfo» и инициализируйте его правильными значениями.
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;

«Подсказки» — это необязательный указатель на структуру addrinfo, как определено. Эта структура может использоваться для предоставления подсказок относительно типа сокета, который вызывающий абонент поддерживает или желает использовать. — из справочной страницы FreeBSD.

  • Инициализируйте указатель для server_address, который мы получим от сервера.
    Теперь вызовите «getaddrinfo (tIP, tport, & hints, & serv_addr)» с правильными параметрами. Функция getaddrinfo () выделяет и инициализирует связанный список структур addrinfo, по одному для каждого сетевого адреса, который соответствует узлу и услуге, с учетом любых ограничений, наложенных подсказками, и возвращает указатель на начало списка в 4-х параграфах, в этот случай « serv_addr» . Элементы в связанном списке связаны полем ai_next .

Дополнительная информация:
Существует несколько причин, по которым связанный список может иметь более одной структуры addrinfo, в том числе: сетевой хост является многосетевым, доступным по нескольким протоколам (например, AF_INET и AF_INET6); или одна и та же услуга доступна для нескольких типов сокетов (например, один адрес SOCK_STREAM и другой адрес SOCK_DGRAM).
Обычно приложение должно пытаться использовать адреса в том порядке, в котором они возвращаются.

Шаг 3: Подключение к розеткам

Пройдите через все адринфо, полученные в связанном списке, и создайте сокет. Значения для «socket ()» присутствуют в структуре addrinfo, полученной выше. (Каждый узел связанного списка проходит через указатель «temp».)

sockfd = socket(temp->ai_family, temp->ai_socktype, 
                temp->ai_protocol);
if (sockfd < 0) 
{
     printf("Port %d is NOT open.\n", port);
     continue; 
}

Если создание сокета не удалось, попробуйте использовать значения в других узлах. После успешного создания сокета попробуйте подключиться к нему с помощью «connect ()». Если соединение установлено успешно, поздравляем, сокет ОТКРЫТ, иначе попробуйте с другими узлами addrinfo. Если ни один из них не работает из связанного списка, сокет ЗАКРЫТ. Вот код для того же,

status = connect(sockfd, temp->ai_addr, 
                 temp->ai_addrlen);
if (status<0) 
{
    printf("Port %d is NOT open.\n", port);
    close(sockfd);
    continue;
}

printf("Port %d is open.\n", port);
close(sockfd);

Функция «freeaddrinfo ()» освобождает память, которая была выделена для динамически распределенного связанного списка «serv_addr». Хорошей практикой является использование этого вместо «free ()».

Полный исходный код для этого урока можно скачать здесь .

Примечание: код для этой программы не длинный, но способ получения адресов с помощью getaddrinfo очень важен. Почти все сетевые приложения в c имеют схожие первые 2 шага. 3-й шаг зависит от цели приложения .

Для получения дополнительной информации относительно структуры, возвращаемой freeaddrinfo, прочитайте эту документацию и детали аргументов сокета, просмотрите эту документацию.

Об авторе:

Пинкеш Баджатия родом из IIIT Хайдарабад. В глубине души он гик, и его стоит искать. Его проектную работу можно увидеть здесь.

Если вы также хотите продемонстрировать свой блог здесь, пожалуйста, смотрите GBlog для записи гостевого блога на GeeksforGeeks.

Рекомендуемые посты:

Создание PortScanner в C

0.00 (0%) 0 votes