Страница на английском языке Страница на русском языке
загрузить поддержка
Реклама

Руководство пользователя


Сканирование сети


Cканирование сети с примерами кода


<< 1 2 2.1 3 ... 10 >>


   В утилите используется сканирование сети ARP пакетами и на основе анализа локального ARP кэша делаются выводы о существовании хостов с IP и MAC адресами. Как послать в сеть ARP пакет? Самый простой способ - средствами WinAPI очистить локальный ARP кэш, создать стандартный UDP сокет и посылать датаграммы в цикле с первого по последний адрес подсети выбранного интерфейса. Так-как ARP кэш пуст, операционная система сама будет посылать ARP запросы и заполнять на основе анализа полученных ARP ответов локальный кэш IP и MAC адресами существующих хостов. Опытным путём было выяснено, что для безошибочного определения "живых" хостов ARP кэш нужно очищать полностью после каждого запроса, а также посылать минимум два запроса с определённым интервалом между запросами. Это по меньшей мере удваивает время сканирования сети, но повышает надёжность определения почти до 100%. Далее код на С/С++ и WinAPI:

///////////библиотеку iphlpapi.dll я подключаю динамически, позтому нужно объявить указатели на функции где-то глобально

typedef DWORD(CALLBACK* PTR_GETIPNETTABLE) (PMIB_IPNETTABLE, PULONG, BOOL);
typedef DWORD(CALLBACK* PTR_DELETEIPNETENTRY) (PMIB_IPNETROW);

///////////это универсальная функция очистки/получения MAC адреса из кэша

   



   Всё, замучился форматировать код, позтому здесь лежит в архиве папка проекта Visual Studio 2005, консольная утилита для сканирования сети. Для упрощения в код зашито количество хостов сети класса C = 254, утилита тупо обнуляет последнюю цифру IP адреса локального хоста и далее в цикле наращивая его на единицу 254 раза посылает в сеть UDP пакеты. Код несколько неряшлив, сколько ни пытался его причесать - возвращался обратно к этим "goto", т.к. только в таком виде утилита работает стабильно и надёжно определяет живые хосты.
   Хотя утилита в принципе должна работать на всех Windows начиная с 98, у этого метода сканирования есть один недостаток - на локальном хосте с операционными системами Windows Vista, Windos 2008 и Windows 8 "developer previw" время сканирования превышает все разумные пределы. Как видно на скриншотах, под Windows 7 время перебора 254 адресов около 8 секунд, а под Windows 8 - около 25 минут! Видимо разработчики что-то круто изменили в сетевом окружении начиная с Windows Vista, на семёрке откатили почему-то назад, а на Windows 2008 и 8 "developer previw" снова сетевое окружение Vista - подобное. Вот и здесь, в блоге компании-разработчика средств мониторинга сетей Paessler AG, рекомендуют не использовать Windows Vista и Windos 2008 в качестве хоста для их программы, использующей для мониторинга службу WMI.
   В таком случае остаётся один выход - использовать протокольный NDIS драйвер, такой как предустановленный в системе ndisuio(ndisprot).sys или качать и ставить библиотеку WinPCap, и программно формировать и посылать ARP запросы и ловить от "живых" хостов ARP ответы. Чем мы далее может быть и займёмся. А пока давайте вспомним о достоинствах: в сети наверняка найдутся компьютеры под управлением операционных систем Windows 2000 или XP, 2003 или Windows 7, в том числе и 64 разрядные версии, где "нормальный" ARP кэш и скорее всего таким и останется, где и должен будет хоститься наш сканер сети. И если мы согласимся с таким ограничением, у нашего сканера появляется масса достоинств в сравнении со сканером на основе NDIS драйвера. Первое - это портабельность. Штатный драйвер ndisuio(ndisprot).sys в версии NDIS 5 в системах Windows XP и 2003 обычно уже использется в системе, в службе автоконфигурирования беспроводных сетей, и для того чтобы получить доступ к этому драйверу нужно остановить службу, что не всегда приемлимо. Подобный же драйвер версии NDIS 6 в системах Windows Vista , Windows 7 и далее, вообще не работает ни с ARP протоколом, ни слюбыми другими кроме протоколов 0x888E (EAP over LAN) и 0x8100 (802.1Q - Virtual Lan). Сторонний драйвер нуждается в далеко не тривиальной инсталляции, которая в свою очередь требует привилегии локального администратора. А наш сканер запускается даже с флэшки, под обычным юзером. И не обращает внимания на операционные системы сканируемых хостов - Windows там или Linux какой, может даже принтер сетевой, определится даже любая железяка с MAC и IP адресом и умеющая отвечать на ARP запросы.
   Далее - как получить диапазон IP адресов для сканирования.