Решил вот написать свой HTTP сниффер. Не то, чтобы существующие решения, всякие там FireBug, Wireshark, tcpdump и urlsnarf , плохо работали. Просто какие-то они не совсем удобные или не всегда делают то, что мне действительно нужно.
Ну как «решил написать» — как обычно пишутся программы на Perl. Я взял модули Net::Pcap и Sniffer::HTTP, набросал графический интерфейс в wxFormBuilder и связал сии компоненты синей изолентой с помощью пары сотен строк кода. В результате получилась такая программа:
Так сниффер, который я условно назвал HttpSniff, выглядит в Xubuntu (CLI версия также предусмотрена). Слева отображается запрос, справа — ответ сервера, внизу представлен лог всех HTTP запросов. Если запросов посылается много, лишние можно скрыть с помощью фильтров:
На данном скриншоте программа запущена уже под Windows, что как бы намекает на ее кроссплатформенность. Обратите внимание, что проверка, соответствует ли хост правилу фильтрации, производится следующим образом:
for my $hp ( @ { $hp_list } ) {
$host_match = ( $hp -> { host } eq ‘*’ ) || ( index ( $host , $hp -> { host } ) == 0 ) ;
# …
}
В итоге строке «1.2.3.» соответсвуют все хосты в подсети 1.2.3/24 , а строке «1.2.3.4» — как адрес 1.2.3.4, так и 1.2.3.49. Если требуется указать точный адрес, его следует ввести с долларом на конце, например «1.2.3.4$». Костыль, наверное, но пока программа работает так.
Для запуска сниффера вам потребуются библиотека wxWidgets, установку которой я уже как-то описывал , а также несколько модулей, названия которых вы можете посмотреть в начале скрипта. Если не ошибаюсь, все модули, кроме Net::Pcap, без проблем устанавливаются с помощью утилиты cpan.
Под FreeBSD модуль Net::Pcap устанавливается так:
Под Debian/Ubuntu:
Под Windows придется установить WinPcap . Из дистрибутивов Perl я бы рекомендовал CitrusPerl, поскольку с ним в комплекте идет wxPerl. Модуль Net::Pcap под Windows ставится так:
Следует обратить внимание на несколько «особенностей» в работе HttpSniff. Во-первых, HTTPS запросы он не перехватывает — это вам не FireBug. Зато он умеет отслеживать запросы, посылаемые Flash, чем могут похвастаться не все браузеры. Во-вторых, я замечал, что при большом объеме трафика (скажем, при включенных торрентах) сниффер может «терять» часть запросов. Я так и не смог понять, как решить эту проблему.
Наконец, сниффер основан на модуле Sniffer::HTTP, который на данный момент, вообще-то говоря, еще сыроват. Во время работы он не только сыпет всякие варнинги, но и порой бросает такие исключения:
По этой причине мне пришлось обернуть вызов метода handle_eth_packet в eval. Других косяков я пока не замечал. В целом, сниффер работает вполне сносно.
Полную версию исходников к посту можно скачать здесь .
Дополнение: Также вас может заинтересовать заметка Перехват сетевого трафика при помощи библиотеки libpcap .