2009-12-07 5 views
7

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

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

Благодаря

ответ

8

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

Шагов для разбора захвата являются:

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

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

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

Когда вы получаете необработанный пакет (не разобранное) это сделать:

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket); 

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

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


Чтобы извлечь пакет HTTP из TCP:

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

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

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

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


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

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

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

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

+0

'GetEncapsulated' равно' Packet.ParsePacket (e.Packet.LinkLayerType, e.Packet.Data); 'правильно? – C4u

0

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

2

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

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

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

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

+0

Интересно, что PDML является широко известным стандартным форматом или специфичным для приложения одноразовым. Шапку в SharpPcap можно выполнить двумя способами: для трафика с низким/средним значением можно записывать/анализировать пакеты в реальном времени; для больших захватов трафика (например, для передачи ftp) лучшим вариантом является сброс исходной кепки в файлы .pcap и последующий послепроцесс. SharpPcap в основном представляет собой платформу с перекрестной платформой для создания проводов, подобных захвату, в приложения C#. Прямо сейчас SharpPcap - это оболочка pcap, а Packet.Net - библиотека парсера. –

+0

У вас есть код, размещенный где-нибудь (ex GitHub). Если это так, я бы хотел взглянуть на него в какой-то момент. Я хотел бы узнать, сколько кода/усилий потребовалось для управления шагом повторной сборки TCP. –

+0

Я не знаю, является ли PDML стандартом или чем-то специфичным для wirehark; в любом случае его легко обрабатывать. – anelson

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