Как захватить HTTP-пакет с помощью SharpPcap

Я хотел бы захватить все входящие HTTP-пакеты моей машины. Для этого я использую SharpPcap, который является оболочкой WinPcap.

SharpPcap работает очень хорошо, но он захватывает TCP-пакеты, и это слишком низкий уровень, чтобы делать то, что я хочу. Кто-нибудь знает, как я могу легко получить полные HTTP-запросы/ответы от всех этих TCP-пакетов ?

спасибо

3 ответов


SharpPcap уже способен захватывать пакеты таким же образом, что и wireshark (только в коде, а не в GUI). И вы можете либо разобрать их напрямую, либо сбросить их на диск в общем.формат файла pcap.

шаги для анализа захвата:

  • выбрать интерфейс
  • открыть соединение в режиме promiscuous
  • начать захват либо с помощью цикла while или обратного вызова события
  • разбор необработанного пакета к типу, который вы хотите

Если Вы читаете .файлы дампа pcap процесс почти такой же, за исключением вызова автономного считывателя захвата, не нужно выбирать интерфейс и не нужно устанавливать беспорядочный режим. Все стандартные фильтры wireshark, tcpdump и большинство других фреймворков Pcap поддерживаются в SharpPcap. Для ссылки на них проверьте tcpdump man.

В настоящее время нет поддержки для разбора HTTP напрямую, но разбор TCP-пакетов действительно простой.

когда вы получаете необработанный пакет (не проанализированный), сделайте следующее:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

Packet.Net (отдельный и включенный компонент SharpPcap) синтаксический анализатор способен вытаскивать часть TCP напрямую, даже если связь инкапсулирована VPN, PPoE или PPP.

Как только вы проанализировали TCPPacket, просто возьмите пакет.PayloadBytes для полезной нагрузки в массиве байтов, который должен содержать заголовок HTTP в необработанных байтах, которые могут быть преобразованы в правильные текстовый формат (я не уверен, что заголовки HTTP используют кодировку UTF-8 или ASCII на этом уровне). Должно быть много свободно доступных инструментов / библиотек для анализа HTTP-заголовков.


для извлечения HTTP-пакета из TCP:

вам нужно собрать tcp-пакеты соединения по мере их поступления, и если данные фрагментированы (более 1500 байт), вам нужно повторно собрать детали в памяти. Чтобы узнать, какие части идут в каком порядке вам нужно тщательно отслеживать последовательность / номера подтверждения.

это нетривиальная вещь для выполнения с SharpPcap, потому что вы работаете с гораздо более низкой частью стека и повторно собираете соединение вручную.

Wireshark имеет интересную статью о том, как это сделать в C.

на данный момент SharpPcap не поддерживает синтаксический анализ полезной нагрузки TCP.


Если вы ищете простые в использовании примеры использования SharpPcap загрузите исходное дерево и посмотрите на примеры включенных проектов. Существует также учебник для SharpPcap на codeproject.

Если у вас есть вопросы и/или вы хотите сделать какие-либо пожелания к проекту, не стесняйтесь размещать проект на SourceForge. Она далеко не мертва и продолжает активно развиваться.

Примечание: Крис Морган является лидером проекта, и я один из разработчиков SharpPcap/Packet.Сеть.

Update: проект учебника по проекту кода теперь обновлен, чтобы соответствовать текущему API.


декодирование потока TCP в пары HTTP-запрос/ответ нетривиально. Такие инструменты, как WireShark, делают это со значительными усилиями.

Я написал оболочку WireShark для Ruby (не то, что это поможет вам), но прежде чем я написал ее, я попытался использовать tshark (версию командной строки WireShark). Это не решило мою проблему, но это может сработать для тебя. Вот как:

вы захватываете пакеты и записываете их в файл pcap (SharpPcap, вероятно, имеет способ сделать это). В какой-то закройте файл cap и запустите другой, затем на старом запустите tshark с фильтром для HTTP-трафика и флагом, указывающим, что вы хотите вывод в формате PDML. Вы обнаружите, что это XML-формат, легко анализируемый системой.Xml tools, который содержит значение каждого поля HTTP в различных форматах. Вы можете написать код C# для создания tshark и передать его поток StdOut в XML-считыватель, чтобы получить пакеты из tshark по мере их появления. Я не рекомендую использовать парсер DOM как вывод PDML для большого файла захвата может получить сумасшедший очень быстро.

Если ваши требования не сложны (как мои), это может быть все, что вам нужно.


Я думаю, что вы близки к решению: если у вас есть TCP-пакеты из HTTP-трафика, вам нужно только извлечь полезную нагрузку TCP, чтобы перестроить HTTP-запрос/ответ. Смотрите это поэтому запись о возможном способе сделать это.