Вопрос

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

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

Спасибо

Это было полезно?

Решение

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, просто возьмите package.PayloadBytes для полезной нагрузки в массиве байтов, который должен содержать заголовок HTTP в необработанных байтах, которые можно преобразовать в правильный текстовый формат (я не совсем уверен, используют ли заголовки HTTP UTF-8). или кодировка ASCII на этом уровне).Должно быть множество свободно доступных инструментов/библиотек для анализа заголовков HTTP.


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

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

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

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

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


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

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top