Задать вопрос
gleb_ignatieff
@gleb_ignatieff
A student of Saint-P Polytechnical University

Как программно отфильтровать пакеты по pid/имени процесса?

День добрый! Моя задача состоит в следующем: разработать консольное приложение для Windows, которое собирает всю сетевую активность для любого процесса. Сначала я нашел pid по имени процесса, затем использовал GetTcpTable2, ну и просто отфильтровал по pid нужную информацию (вариант "лишь бы отвязались"). Однако далее там есть такая пометка: "Сохранять сетевую активность в формате для Wireshark (отдельно от текстового)". Тогда я понял, что сделал вроде что-то не то и обратился к WinPcap, однако здесь я не имею представления, как отфильтровать пакеты по pid, и на форумах говорят, что средствами самого WinPcap это невозможно.
Так что я в тупике. Если у кого-нибудь есть идеи, как мне это сделать, то милости прошу! :)
  • Вопрос задан
  • 400 просмотров
Подписаться 2 Оценить Комментировать
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C++
Если pcap действительно не предоставляет никакой инфы о процессе, который забрал пакет (вполне вероятная и нормальная ситуация, т.к. работает он в режиме ядра), то попробуйте проставить соответствие по номеру порта, раз уж вам TCP нужен. С точки зрения сетевого протокола, именно порт уникально идентифицирует процесс-получатель и процесс-отправитель (например, вы ведь никак не повесите два независимых веб-сервера на одном порту. Также и при исходящем TCP подключении ОС выделяет для каждого подключения отдельный случайный порт). Т.к. информацию о портах и TCP-соединениях (в т.ч. в listening статусе) вы по идее сможете получить (ведь существует и как-то работает TcpView из пакета Sysinternals), то и по порту пакеты сможете привязать.
Само собой, один процесс может открывать много портов на прослушку и устаналивать множество соединений, как входящих так и исходящих. Если вам нужно еще и отдельные TCP-стримы сохранять (например, к 80-му порту веб-сервера подключилось много клиентов), то тогда уникально идентифицируйте каждый коннект с помощью четверки: (source_ip, source_port, destination_ip, destination_port).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы