Как перехватить HTTP-пакет с помощью SharpPcap - PullRequest
7 голосов
/ 08 декабря 2009

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 10 ноября 2010

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

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

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

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

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

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

TCPPacket packet = TCPPacket.GetEncapsulated(rawPacket);

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

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


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

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

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

В Wireshark есть интересная статья о том, как этого добиться в C.

На данный момент SharpPcap не поддерживает анализ полезных данных TCP.


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

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

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

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

2 голосов
/ 19 января 2010

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

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

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

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

0 голосов
/ 19 января 2010

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

...