Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Фильтр драйвер возможен?


Автор: kuzulis 27.8.2011, 17:36
Доброго времени суток.

У меня в мыслях есть идея создать кроссплатформенное GUI приложение для сниффинга/мониторинга траффика от последовательных портов.

Для Windows всё более менее ясно: пишем фильтр-драйвер, загружаем его и пользуемся его плюшками (яркий пример такого приложения - Free Serial Port Monitor). 

Но проблема возникла с Linux: как тут быть?

Посмотрел сорцы программки slsnif (http://sourceforge.net/projects/slsnif/ ) - там юзаются пайпы и/или /pty .
Но это немного не то, тем более, что эта утилита как-то не корректно работала:
1. Она работает только на прием данных в порт
2. Она тупо открывает порт, читает из него данные и выводит в консоль, при этом, тому приложению,
которому реально необходимы эти данные - их просто не получает, т.к. slsnif их уже прочитал.

ЗЫ: Если не прав - поправьте.

Так вот, возможно ли и в Linux написать что-то похожее на Filter driver как в Windoews? Или может, есть альтернативные варианты?

Автор: Void 27.8.2011, 17:54
slsnif, interceptty и подобные программы открывают новое устройство псведотерминала, на использование которого предполагается переконфигурировать приложения, за которыми нужно следить. Это возможно в большинстве случаев и, конечно, проще, чем писать модуль ядра.

Автор: kuzulis 27.8.2011, 19:21
Т.е. Приложение должно вместо порта открывать пайп или pty? так может оказаться что такого выбора в нем может не быть.  Но а примеры ж фильтр драйверов должны быть в сети? А то я не нашел. Имхо драйвер было бы лучше и универсальнее.

Автор: bsa 29.8.2011, 14:41
Цитата(kuzulis @  27.8.2011,  19:21 Найти цитируемый пост)
Но а примеры ж фильтр драйверов должны быть в сети?

Для Linux такого понятия вообще нет.
Цитата(kuzulis @  27.8.2011,  19:21 Найти цитируемый пост)
Имхо драйвер было бы лучше и универсальнее.

Нет. Не лучше и не универсальнее - версии ядра меняются часто, и драйверы от одной, могут к другой не подходить.

Обычно, для подобных утилит используют http://www.tcpdump.org/pcap.html. Она уже кроссплатформенная.

Автор: kuzulis 29.8.2011, 21:16
Цитата

Нет. Не лучше и не универсальнее - версии ядра меняются часто, и драйверы от одной, могут к другой не подходить.

Ну а иначе то никак. 
Т.к. к примеру, нужно перехватывать не только траффик ввода/вывода, но, к примеру и моменты конфигурирования устройства.
Также, если брать "стандартный" вариант, который к примеру, используют slsnif, interceptty, то там мы открываем порт с уже известными параметрами. 
А что, если приложение, которое нам нужно "ломануть" втихпря как-то использует порт с какими то параметрами и которые изменяет в режиме своей работы - в этом случае, мы не сможем ничего сделать. Ведь так? Или я не прав?

 
Цитата

Обычно, для подобных утилит используют libpcap. Она уже кроссплатформенная.

Но ведь она только для перехвата сетевого траффика tcp/ip.

Есть ли еще решения?

Автор: bsa 31.8.2011, 17:31
черт. заработался я. Почему-то подумал, что речь идет о сокетах. smile

Скорее всего, действительно придется писать модуль ядра, который будет перехватывать управление портом от штатного драйвера. Как вариант, можно просто переименовать устройство порта, а на его место пихнуть созданные упомянутыми прогами pty. Правда, во втором случае, придется много делать из-под рута каждый раз при необходимости сниффинга.

Автор: kuzulis 1.9.2011, 07:41
Цитата(bsa @  31.8.2011,  17:31 Найти цитируемый пост)
Скорее всего, действительно придется писать модуль ядра, который будет перехватывать управление портом от штатного драйвера.

Так вот и главный вопрос: где можно про это дело почитать? Есть ли какие нить примеры и т.п.? 
Уж больно руки чешутся закодить smile

Автор: bsa 1.9.2011, 10:18
Думаю, стандартная книга о написании драйверов для Linux тебе подойдет.
Думаю, твой драйвер должен найти объекты описания устройств и подменить в них коллбэки на свои. А при выгрузке, соответственно, восстанавливать обратно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)