2013-11-20 2 views
1

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

Я использую 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); 

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

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

+0

Начало здесь: http://en.wikipedia.org/wiki/Ethernet_frame – Nim

+0

У вас будет гораздо больше шансов получить разумный ответ, если вы добавите немного кода в вопрос, а также некоторую информацию о том, какой захват файлы, которые у вас есть, точно. Особенно проблема 2 звучит как проблема с вашим кодом. – hyde

+0

http://en.wikipedia.org/wiki/Pcap – hyde

ответ

1

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

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

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

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

Подробнее об этих двух форматах можно узнать here и there.

Если вы читаете файл pcap или pcap-ng с помощью libpcap, то процедура pcap_datalink() вернет значение DLT_, определяющее тип заголовка канального уровня. См. the list of link-layer header types для описания значений DLT_ и соответствующих им заголовков. DLT_EN10MB для Ethernet («10 МБ» является историческим - он используется для всех скоростей Ethernet); DLT_PPP - наиболее вероятный тип для 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.

Do NOT Предположим, какой тип заголовка канального уровня предназначен для пакетов, которые вы получите из libpcap. ALWAYS звоните pcap_datalink(), чтобы определить тип заголовка канального уровня и использовать его для разбора пакетов; если ваш код не знает, как разбирать пакеты для определенного значения DLT_, он должен сообщить об ошибке и выйти.

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

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

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

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

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

+0

Да, спасибо, это очень помогает. :) – Peter

+0

Смотрите мои обновления для публикации Влада, исправляя некоторые ошибки (это НЕ НЕ ***, верно, что файлы pcap не содержат тип заголовка link-layer!) И добавление дополнительной информации. –

+0

@GuyHarris: Да, я пропустил там поле типа. Спасибо за обновление! –

Смежные вопросы