Сниффер пакетов для протоколов канального уровня

avatar
vs123
1 июля 2021 в 16:10
25
0
0

Я пытаюсь преобразовать программу под названием Responder, написанную на Python, в версию на C. Одно из мест, на котором я застрял, — это слушатели, которые прослушивают разные порты. Responder прослушивает SMB на портах 445 и 139. Я создал небольшой фрагмент, который также будет прослушивать эти порты. Но когда я запускаю свою программу, я не получаю никаких данных.

void sniff(int PORT) {
    int server_fd, new_socket, valread;
    struct sockaddr_in address;
    int opt = 1;
    int addrlen = sizeof(address);
    char buffer[1024] = {0};
       
    if ((server_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == 0) {
        return;
    }
       
    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
        return;
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons( PORT );
       
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address))<0) {
        return;
    }

    if (listen(server_fd, 3) < 0) {
        return;
    }
    printf("listen done.\n");
    if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0) {
        return;
    }

    valread = read( server_fd , buffer, 1024);
    printf("%s\n",buffer );

    return;
}

Если я сделаю все вышеперечисленное, я ничего не получу.

Источник
Basya
1 июля 2021 в 16:13
1

Что вы уже сделали для его отладки? Я предполагаю, что у вас есть отладчик, и вы можете устанавливать точки останова, шагать, писать операторы печати, чтобы показать, как выполняется программа и какие данные находятся в разных точках и т. д.

vs123
1 июля 2021 в 16:16
0

Приведенный выше код будет зависать в функции accept. Насколько я понимаю, с ним ничего не связано, что имеет смысл. Я специально пытаюсь снифферить все, что вижу в своем интерфейсе, как это делает Wireshark.

Basya
1 июля 2021 в 16:21
0

Если ничего не подключается, accept должен блокироваться до тех пор, пока соединение не будет установлено. Это не зависание программы; это определенное поведение accept. Поэтому я не уверен, какое другое поведение вы ожидаете.

Remy Lebeau
1 июля 2021 в 17:54
0

@ vs123 Этот код создает TCP-сервер, который ожидает подключения к нему клиентов. Если вы пытаетесь вместо этого написать анализатор пакетов, вам нужно вместо этого использовать сокет AF_PACKET, при необходимости перевести в неразборчивый режим через setsockopt() и использовать recvfrom() или recvmsg() для чтения пакетов, проходящих через сеть. Дополнительные сведения см. в разделе Захват кадров Ethernet с использованием сокета AF_PACKET в C.

Ответы (0)