Здравствуйте!
У меня есть задача по написанию сетевого фильтра драйвера для перехвата входящих и исходящих пакетов.
Для начала я бы хотел вытягивать такую информацию с пакетов:
IP получателя и отправителя + их порты;
ID процесса который создает соединение;
Количество принятых и отправленных байтов;
Продолжительность соединения;
Сейчас ищу подходящий драйвер из предоставленных примеров в
гите.
Но пока безрезультатно. Подскажите пожалуйста на какой пример мне стоит обратить внимание?
Я знаю что сниффер был бы оптимальным решением имхо, но нужно именно через фильтр драйвер мониторить пакеты.
Если у Вас был опыт по написанию такого фильтра драйвера подскажите подводные камни которые меня ждут?
И последний вопрос. Какой по Вашему мнению эстимейт такого фильтра драйвера?
Здравствуйте, Suares, Вы писали:
S>У меня есть задача по написанию сетевого фильтра драйвера для перехвата входящих и исходящих пакетов.
S>Для начала я бы хотел вытягивать такую информацию с пакетов:
Не надо ничего писать, все уже давно написано:
https://www.winpcap.org/
Здравствуйте, Suares, Вы писали:
S>Здравствуйте!
S>У меня есть задача по написанию сетевого фильтра драйвера для перехвата входящих и исходящих пакетов.
S>Для начала я бы хотел вытягивать такую информацию с пакетов:
S>
S>IP получателя и отправителя + их порты;
S>ID процесса который создает соединение;
S>Количество принятых и отправленных байтов;
S>Продолжительность соединения;
S>
Тут зависит от задачи. Эту информацию легко получать на транспортном уровне, если реализовывать фильтр-дравйер транспортного уровня.
Если будете использовать NDIS, то там, по-крайней мере раньше, были трудности с получением информации о процессах, т.к. нотификаторы сетевого уровня вызывались в контексте произвольных процессах вроде. Плюс ко всему понятия сессии там нету, т.к. это сетевой уровень и вам придется реализовывать это самому.
Однако, в качестве эксперимента, можно попробовать сделать связку транспортного уровня и сетевого по паре IP + порты + протокол, например. Т.е. на транспортном уровне хранить таблицу id-процесса, IP + порты + протокол и при приходе сетевого пакета на уровне NDIS запрашивать у транспортного уровня информацию о процессе по IP + порты + протокол. Но, как вы понимаете, придется писать 2 фильтра — сетевой и транспортный и постоянно нужно следить за актуальностью таблицы на транспортном уровне (удалять записи,добавлять новые и тп).
Еще много зависит от ОС. Если вам нужно поддерживать начиная с XP, то придется делать TDI, NDIS. Если начиная с Vista, то там есть
WFP, который вам может подойти.
Посмотрите еще проекты
windivert и
netfilter.