Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Концепция сниффера


Автор: Flogrimm 8.1.2009, 11:23
Привет!

Я пишу простой сниффер на c# в рамках курсового, но у меня есть несколько вопросов. 

Изначально стояло условие, чтобы программа была реализована как сервис, который считает трафик и пишет его в лог и винформ оболочки, которая читает лог, строит, например график, показывает в трее значок, позволяет просматривать отчеты и т.д.

1) Лог

- Стоит ли вести просто текстовый лог типа

ip отправителя - ip получателся - время - размер пакета

или лучше сереализовать полностью объекты (у меня это некий IPHeader который содержит различную информацию о пакете)

или все-таки нет смысла в сереализации?

- В лог писать информацию о пакетах, как часто они бы не поступали или писать информацию через определенный момент времени - например каждую секунду?

2) Почему то получается словить не весь трафик... я беру за основу алгоритм, реализованный в MJsniffer (http://www.codeproject.com/KB/IP/CSNetworkSniffer.aspx) - смотрим размер ip пакетов и суммируем их...

http://oleg40a.in.ua/upload/MJSniffer.rar


Автор: Dims 9.1.2009, 21:53
По умолчанию сетевая карта слышит только те пакеты, которые адресованы именно ей. Чтобы она слышала все пакеты, нужно перевести её в promiscuous mode. Это должна быть какая-то низкоуровневая команда или настройка драйвера сетевой карты. Не знаю, насколько она стандартизована.

Автор: Flogrimm 10.1.2009, 00:28
Не совсем понял... как же я смогу словить пакеты, которые ей не адресованы? или вы имеете в виду пакеты проходящие через мою карту в другую точку назначения?

Автор: baldina 10.1.2009, 00:40
Flogrimm, так ethernet устроен. все пакеты получают все карты в рамках одного домена коллизий (т.е. соединенные концентраторами - хабами). те пакеты, которые не предназначены карте, она просто отбрасывает. promiscuous mode позволяет получить все эти пакеты. 
перевести карту в этот режим можно при помощи соотв. ioctl, что-то вроде

Код

int mode=1;
SOCKET s;
....
ioctlsocket (s, SIO_RCVALL, &mode);

Автор: Dims 21.1.2009, 15:03
Цитата(Flogrimm @  10.1.2009,  00:28 Найти цитируемый пост)
как же я смогу словить пакеты, которые ей не адресованы?

Значит, я неправильно понял вопроса. Я думал, что говоря, что не удаётся словить "весь" трафик Вы как раз имели в виду чужие пакеты. 

Ethernet -- это "эфирная сеть", то есть, внутри сетевого провода существует как бы радиоэфир, а все сетевые карточки -- это радиостанции. Эти радиостанции либо "кричат" в эфир, либо слушают его. Когда карточка слушает эфир, она может принять передачу ("словить пакет") и проверить его MAC адрес назначения. Если этот адрес её, то она передаст пакет наверх, драйверу. А если пакет чужой, то есть, предназначенный для другой карточки, то её поведение зависит от режима. По умолчанию карточка сотрёт пакет из своей памяти и драйвер о нём ничего не узнает. А в P-mode карточка отправит его драйверу. То есть, в P-mode карточка позволяет драйверу слышать все передачи в эфире, а не только предназначенные для этой карточки.

Автор: Temdegon 22.1.2009, 02:41
Хм. А разве современные свичи работают так? На сколько я знаю, есть свичи (Коммутаторы) и хабы (Концентратоы). Хаб отсылает пакеты на все активные порты, а сетевая карта уже решает, принимать его или нет по заголовку пакета. И все было бы отлично, если бы на смену хабам не пришли свичи (и уже давно вытеснили их). Свич рассылает пакеты всем без разбора только сразу после включения. Все пакеты он анализирует и все мак-адреса сегмента сети хранит в своей таблице. Когда впоследствии приходит пакет для МАКа, который уже есть в его таблице, пакет шлется ТОЛЬКО на один порт. Это достаточно сильно повышает пропускную способность сети, да и как ни посмотри, отсылать пакет получателю гораздо разумнее чем слать его всем подряд. Я НЕ специалист по сетям, устройству коммутоторов, сетевых карт и написанию драйверов для них. Просто пару раз пробовал пользоваться сниферами, а когда ничего не вышло, попытался почитать и разобраться почему это не работает. 
Другое дело, если сетевая карта не Ethernet, a DVB, которая принимает пакеты не по витой паре от свича, а со спутниковой тарелки. Тут уже все как раз попадает под описание "эфирная сеть", т.к. спутник не может "шпулять" пакеты прямо мне в тарелку и в результате данные летят всем по всей зоне покрытия спутника на заданной частоте. И вот тут уже решение брать или не брать принимает сама карта. Чем последний десяток лет успешно пользуются "рыбаки" - ловят чужой трафик в промышленных масштабах. Я этим делом тоже не брезговал =). Всегда приятно на халяву получить свеженький фильмец или образ с игрой. Провайдеры пытаются боротся, шифруя трафик, но не все и не всегда успешно. И софта для перехвата, отсеивания и сортировки чужого трафика через спутник очень много. Но ничего похожего для Ethernet-сетей пока мне не попадалось. Если я заблуждаюсь, и в современных сетях возможно ловить чужой трафик - ткните меня пожалуйста носом в софт, который это может и в сайт\форум, посвященный этому делу. Буду очень благодарен, и с удовольствием этим займусь.

Автор: PashaPash 22.1.2009, 11:42
Temdegon, есть такая замечательная вещь как ARP spoofing, в вики подробно описана. Но очень легко обнаруживается и стучится по ушам smile

Автор: DenwerD 22.1.2009, 11:55
1) Лог
Мне кажется лучше в таких приложениях использовать буфферизованый вывод строк (BufferedStream) лога в файл. Строка определённого формата в которой сущности разделяются например символом ";"

Сериализация здесь в принципе нафик не нужна ибо что вы будите делать например с 1000 объектами IPHEader, куда их девать? обратно в файл, придётся десериализовать. Вообщем лишняя нагрузка.

Потом этот текстовый файл парсится в форме. 


2) Насчёт трафика непонятно, какой трафик вы хотите отловить? 

1.1 Только с конкретной машины
1.2 Всей локалки.

В случае 1.2 нада инсталировать снифер на сервер который пропускает трафик из интернета в локалку. Тут можно отловить все HTTP, аську и т.д. Так делают файрволы.

В 1.1  непонятно что понимается под словом трафик. Если принимается понятие трафика как количество бит пройденых через сетевую карту в единицу времени, то в режиме RAW на сокет должны валится всё что входит и выходит в/из сетевой карты. А дальше ваша фантазия что делать с эти множеством битов.



 


Автор: Flogrimm 22.1.2009, 12:04
Спасибо большое! Имелся в виду вариант 1.1, т.е. трафик конкретной машины.

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