linux — извлечение информации о пакете с помощью переполнения стека

Я какое-то время возился с Wireshark, и мне интересно, может ли кто-нибудь мне помочь. Я записал случайный просмотр с ним, и я сохранил его в файл pcap. Я хотел бы создать C /C ++ Программа (я знаю, что многие существуют, но я хочу практиковать), которая извлекает всю информацию из пакетов, такую ​​как исходный и целевой IP, используемый порт, данные и т. д. Моя конечная цель в обучении — извлечь изображение, видео с YouTube или что-нибудь еще. из потока (я знаю, мне придется сгруппировать пакеты и отсортировать их и т. д.), но это более поздний проект, я думаю. 🙂

Я использую libpcap (в Linux), и мой код до сих пор может читать автономный файл пакет за пакетом, и — поскольку я знаю, что в моем случае это пакеты PPP — если я загружаю самоопределяемую структуру с информацией из 20-го байта пакета, я могу просмотреть MAC-адреса и IP-адреса.

Мои проблемы:

1) Как узнать / определить без Wireshark, какой тип канала передачи данных используется? (Ethernet, WiFi, PPP и т. Д.)

2) Как мне читать дальше данные пакетов? Если я просто читаю один байт, моя программа не делает что-нибудь, каждая переменная становится пустой.

У меня есть структура ppphdr, которая содержит:

u_int16_t htype;
u_int16_t ptype;
u_char hplen;
u_char plen;
u_int16_t oper;
u_char sha[6];
u_char spa[4];
u_char tha[6];
u_char tpa[4];

И я называю это для каждого пакета:

pppheader = (struct ppphdr*)(packet+20);

Потому что кадр ppp начинается с 20-го байта. Он возвращает отправителя и целевой Mac и IP-адрес.

После того, как я продолжу читать следующие несколько байтов с тем же вызовом, но с другой структурой, он возвращается пустым, и программа останавливается после 1 пакета. Я пытаюсь использовать это руководство: http://www.tcpipguide.com/free/t_PPPGeneralFrameFormat.htm

1

Решение

Как узнать / определить без Wireshark, какой тип канала передачи данных используется? (Ethernet, WiFi, PPP и т. Д.)

Сам Wireshark работает с различными форматами файлов. Двое из них, которые вас, вероятно, интересуют, это «pcap» и «pcap-ng».

Если вы записали данные в формате «pcap», тип ссылки сохраняется в поле «Тип заголовка канального уровня» в заголовке файла pcap; увидеть справочная страница pcap-savefile.

Если вы записали данные в формате «pcap-ng», то тип ссылки сохраняется в Блок описания интерфейса.

Вы можете прочитать больше об этих двух форматах Вот а также там.

Если вы читаете файл pcap или pcap-ng с помощью libpcap, pcap_datalink() рутина вернет DLT_ значение, указывающее тип заголовка канального уровня. Увидеть список типов заголовков канального уровня для описания DLT_ значения и заголовки, которые им соответствуют. DLT_EN10MB предназначен для Ethernet («10 МБ» является историческим — он используется для всех скоростей Ethernet); DLT_PPP является наиболее вероятным типом для ГЧП. Если у вас есть пакеты Wi-Fi с заголовками Wi-Fi (если вы не захватываете в режиме мониторинга, вы, вероятно, получите заголовки Ethernet, и DLT_EN10MB на адаптеры Wi-Fi), вы получите DLT_IEEE802_11; если у вас также есть заголовки «радиометаданных» до заголовков 802.11, вы получите что-то вроде DLT_IEEE802_11_RADIO или же DLT_IEEE802_11_RADIO_AVS или же DLT_PRISM_HEADER,

Делать НЕ предположим, что тип заголовка канального уровня для пакетов, которые вы получите из libpcap. ВСЕГДА вызов pcap_datalink() определить тип заголовка канального уровня и использовать его для анализа пакетов; если ваш код не знает, как анализировать пакеты для конкретного DLT_ значение, он должен сообщить об ошибке и выйти.

Как мне читать дальше данные пакетов? Если я просто читаю один байт, моя программа ничего не делает, каждая переменная становится пустой.

Предполагая, что вы записываете данные Ethernet, вам необходимо проанализировать / обработать данные в соответствии со стандартными спецификациями. Например, первый разбор Ethernet кадр. Даже в этом случае кадр Ethernet может иметь переменную длину. Например, если tcpdump / wireshark не записывает поле преамбулы, вам нужно прочитать 15 октетов, чтобы определить, сколько еще вы можете / должны прочитать.

После того, как вы закончили работу с кадром Ethernet, вам нужно проанализировать IP, а затем, возможно, UDP и / или TCP. Некоторые другие данные могут быть в других форматах, но в каждом конкретном случае вы должны тщательно изучить спецификацию формата и соответствующим образом проанализировать данные. Чтение одного байта никуда вас не приведет. Поэтому я бы порекомендовал вам начать с изучения базовых сетевых уровней — сначала Ethernet, IP, UDP, а затем вернуться к проблеме их анализа.

В конце концов, Wireshark — это программа с открытым исходным кодом, которая выполняет большую часть того, что вы хотите сделать в качестве упражнения. Это означает, что вы всегда можете скачать исходный код, посмотрите, что он делает, и изучите его.

Надеюсь, поможет. Удачи!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]