Как захватить 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-запрос/ответ. Смотрите это поэтому запись о возможном способе сделать это.