Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219

Принять IP пакет

21.08.2017, 11:58. Показов 3355. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Хочу сделать аналог сниффера (типа wireshark) и принимать полный IP пакет, а не только данные.

Подскажите, пожалуйста, можно ли это сделать на уровне сокетов?
Либо какими-то стандартными способами, без установки дополнительных библиотек.

В интернете нашел примеры с библиотекой pcap.h, но как я понял это не стандартная, и чтобы с ней работать - нужно ее отдельно скачать и поставить.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2017, 11:58
Ответы с готовыми решениями:

Отправить/принять пакет UDP
Требуется решить такую задачу: Создать приложение Win32 с оконным интерфейсом. По нажатию кнопки приложение отправляет пакет UDP...

Нужно принять пакет на сервере
С помощью VBS отправляется пакет на заданный URL: Set oHTTP = CreateObject("winhttp.winhttprequest.5.1") sSource =...

Программно сформировать и отправить IP пакет, принять ICMP сообщение
Необходимо (С, C++, Perl, Assembler или др) сформировать заголовок IP пакета. Данные: длина сегмента, транспорт, контроьлная сумма, IP...

17
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
21.08.2017, 12:23
Leardjiny,
На уровне сокетов думаю можно, посмотрите в сторону SOCK_RAW,
https://habrahabr.ru/post/164901/
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 12:57  [ТС]
Undisputed, Спасибо. Вроде похоже как раз на то, что нужно - попробую сделать.

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

И второй вопрос, можно потом как-то сделать, чтобы данные можно было с другого сокета обычным способом уже перехватить? Или таким образом уже не выйдет? (Задачи сделать таким образом нет, поэтому способ в любом случае подойдет, но просто чтобы на будущее знать)
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
21.08.2017, 13:27
Leardjiny,
Whireshark-ом не пользовался, но если там есть возможность импортирования данных и вы будете соблюдать подходящий для этой операции формат, то полагаю проблем быть не должно...

Не встречал программ с двойной прослушкой в пределах одного процесса. Это может как работать, так и не работать по самым разным причинам, поэтому затрудняюсь что либо ответить по этому поводу...
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 13:31  [ТС]
Undisputed, Хорошо, значит на эту тему надо почитать.

А фильтры, по портам или IP там настроить я так понимаю не выйдет в таком формате?
Придется уже после ловли пакета лезть в заголовок и смотреть данные источника?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
21.08.2017, 13:53
http://www.binarytides.com/pac... e-c-linux/
http://www.binarytides.com/pac... g-winsock/
Цитата Сообщение от Leardjiny Посмотреть сообщение
Я правильно понимаю, что если я таким образом перехвачу данные, а потом запишу их в файл, то потом смогу их проиграть к примеру в wireshark, и получу то же самое, что если бы записывал им?
только если в правильном формате запишите.
https://wiki.wireshark.org/Dev... FileFormat
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 13:56  [ТС]
GbaLog-, Спасибо. Для UDP я так понимаю надо IPPROTO_UDP поставить и все?
Либо IPPROTO_IP как в первом варианте?
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
21.08.2017, 14:01
Leardjiny,
Я думаю порты и айпи надо фильтровать после принятия пакета, других способов не знаю...
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 14:05  [ТС]
Undisputed, Я тоже так думаю, на уровне сокетов не могу настроек найти. А libpcap не хочу ставить
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
21.08.2017, 14:09
Цитата Сообщение от Leardjiny Посмотреть сообщение
Для UDP я так понимаю надо IPPROTO_UDP поставить и все?
Либо IPPROTO_IP как в первом варианте?
да.
Цитата Сообщение от Leardjiny Посмотреть сообщение
на уровне сокетов не могу настроек найти.
как вы себе это представляете?
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 14:13  [ТС]
GbaLog-, ну для pcap есть функции фильтрации.

Либо как для обычных данных указать порт, затем bind сделать или что-то подобное.

Но это не вариант - т.к. даже если можно, то привяжет к одному порту, а не к нескольким.
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
21.08.2017, 15:42
Цитата Сообщение от Leardjiny Посмотреть сообщение
ну для pcap есть функции фильтрации.
libpcap сама реализует их, их нет из коробки.
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
21.08.2017, 15:47  [ТС]
GbaLog-, понятно. Тогда сделаю фильтрацию вручную, если понадобится. Для начала так попробую сделать
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
29.08.2017, 12:16  [ТС]
GbaLog-, Сделал таким образом:
Поставил IPPROTO_UDP (пробовал IPPROTO_RAW, но при чтении выдавало ошибку).

Открытие порта:
C++
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
OpenPort()
{
    ClosePort();
    m_sock = -1;
    m_connection_state = false;
 
    double current_time = GetTickCount();
    if ( (current_time - m_last_connect_try) < m_read_timeout )
    {
        usleep(10000);  //мкс
        return false;
    }
 
 
 
    if ((m_sock = socket(AF_INET, SOCK_RAW , IPPROTO_UDP)) < 0) {
        return false;
    }
 
    timeval timeout = {0, 0};
    timeout.tv_usec = 0;
    timeout.tv_sec = (int)((double)m_read_timeout/1000);
 
    if (setsockopt(m_sock, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout)) < 0);{
 
    }
 
    int buffsize = MAX_UDP_BUFFER;
    if ( setsockopt(m_sock, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<const char*>(&buffsize), sizeof(buffsize)) < 0 )
    {
    }  
 
    m_connection_state = true;
    return true;
}
Чтение кадра:
C++
1
2
3
4
5
6
7
8
9
10
struct sockaddr_in echoclient;
    char buffer[MAX_UDP_BUFFER];
    unsigned int echolen, clientlen;
    clientlen = sizeof(echoclient);
    int nNumberOfBytesReaded = -1;
    if (m_connection_state == true )
    {
        nNumberOfBytesReaded = recvfrom(m_sock, buffer, MAX_UDP_BUFFER, 0,
                                (struct sockaddr *) &echoclient, &clientlen);
    }
Все читает, но записав в файл - вижу некоторые проблемы.
Wireshark отказывается читать. Когда сравниваю то, что видно в wireshark и в моем файле, то вижу что не хватает 14 байт, которые выглядят так: "ff ff ff ff ff ff 0a 0b 0c 0d 0e 0f 08 00"

Подскажите, что я делаю не так? И как их правильно считывать?
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
29.08.2017, 13:51
Цитата Сообщение от Leardjiny Посмотреть сообщение
то вижу что не хватает 14 байт
глобальный заголовок в файл пишете?
Цитата Сообщение от Leardjiny Посмотреть сообщение
(m_sock = socket(AF_INET, SOCK_RAW , IPPROTO_UDP))
может всё-таки (m_sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))?
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
29.08.2017, 15:22  [ТС]
GbaLog-, я все что возвращает recvfrom - пишу в файл. Ничего с этим не делая и не добавляя.

По поводу IPPROTO_IP - я пробовал делать так. В контексте той же функции , что выше привел. Менял только эту строку.
В этом случае у меня почему-то не открывался порт (либо создание совета, либо установка опций не проходят)

Добавлено через 1 час 0 минут
GbaLog-,
Цитата Сообщение от GbaLog- Посмотреть сообщение
может всё-таки (m_sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP))?
Попробовал сделать так:
(m_sock = socket(AF_INET, SOCK_RAW , IPPROTO_IP))
не хочет создавать сокет

и так:
(m_sock = socket(AF_INET, SOCK_RAW , IPPROTO_RAW))
сокет открывает, но не работает recvfrom
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
29.08.2017, 16:17
Цитата Сообщение от Leardjiny Посмотреть сообщение
я все что возвращает recvfrom - пишу в файл. Ничего с этим не делая и не добавляя.
в .pcap-файле должен быть заголовок.
чтобы Wireshark понял, что это pcap-файл, а не текстовый.
я вам ссылку скидывал, вы читали?
https://wiki.wireshark.org/Dev... bal_Header
Цитата Сообщение от Leardjiny Посмотреть сообщение
Ничего с этим не делая и не добавляя.
так нельзя, к каждому пакету должен писаться хедер в таком формате:
https://wiki.wireshark.org/Dev... .29_Header
Цитата Сообщение от Leardjiny Посмотреть сообщение
не хочет создавать сокет
errno(Linux)/WSAGetLastError(Windows) что говорят?
0
2 / 2 / 0
Регистрация: 22.09.2013
Сообщений: 219
29.08.2017, 16:37  [ТС]
GbaLog-, а, я понял о чем Вы. Да, заголовок pcap файла я добавлю, он же не из сети берется вроде.
У меня само содержимое неполное.

Я наткнулся в интернете, что IPPROTO_RAW используется только для отправки, потому recvfrom не работает. Возможно конечно это не так.
Источник вот: https://www.experts-exchange.c... ckets.html

Там же наткнулся, на следующую инициализацию сокета:
C++
1
m_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
Это для приема всего что идет. Я у себя сделал так:
C++
1
m_sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_IP))
Вроде бы сейчас содержимое совпадает с тем что я вижу в Wireshark.

Теперь осталось разобраться с форматом pcap заголовков и добавить их перед данными.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.08.2017, 16:37
Помогаю со студенческими работами здесь

Не получается принять TCP/IP пакет более 2048 байт. Visual C++.
Использую MFC. Имеется UDP-сокет (CAsyncSocket). При приходе пакета длиной более 2048 байт функция ReceiveFrom возвращает SOCKET_ERROR, а...

Как принять и отправить один и тот же пакет. Перенаправление пакетов
Всем привет. Есть такая цель. Нужно принимать ВЕСЬ трафик, который приходит на интерфейс и не просматривая его, отправить на другой. ...

Защита с отсечением внешнего трафика. Блокирование работы программы при попытке принять пакет из внешней сети
Защита с отсечением внешнего трафика. Блокирование работы программы при попытке принять пакет из внешней сети. (При блокировке - механизм...

Почему если отправить пакет UDP и конечного адресата в сети не существует, то пакет не отправляется?
Добрый день! Вопрос для расширения кругозора. Мониторю свой трафик с помощью WireShark и заметил такую вещь: при отправке пакета по...

Как определить, какой из подсетей принадлежит пакет IP-пакет?
То есть у Олиферов это всё подробно расписано. Если маршрутизация сделана на основе масок, то надо пробежаться по таблице маршрутизации и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru