Я какое-то время возился с 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
Как узнать / определить без 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 — это программа с открытым исходным кодом, которая выполняет большую часть того, что вы хотите сделать в качестве упражнения. Это означает, что вы всегда можете скачать исходный код, посмотрите, что он делает, и изучите его.
Надеюсь, поможет. Удачи!
Других решений пока нет …