allasm.ru |
|
Введение. В данной статье даются основные сведения по способам фильтрации сетевого траффика в Windows 9x/2000/Net.2003 Server, даётся описание фильтрации IP-траффика в Windows 2000 на основе Windows 2000 Filter-Hook Driver способа.Также указываются особенности реализации других методов фильтрации. Часть первая, теоретическая. Способы фильтрации сетевого трафика . Существует несколько способов фильтрации сетевого траффика .Для начала кратко рассмотрим основы сетевой подсистемы Windows: 1) NDIS. В 1989 году Microsoft и 3Com совместно разработали Network Driver Interface Specification (NDIS), которая позволяет драйверам сетевых протоколов использовать сервисы сетевых интерфейсов (отправка/прием сетевых пакетов) скрывая детали их реализации. Драйвер сетевого адаптера, разработанный в соответствии с этой спецификацией, принято называть NDIS минипортом (miniport).Одно из преимуществ - то, что код свободно переносится из 9x/ME - winNT/2000 . Детальное описание предмета можно найти в документации DDK (раздел NetworkDrivers), вкратце NDIS описывает правила (интерфейсы и структуры), в соответствии, с которыми должны разрабатываться драйвера сетевых адаптеров, а так же предоставляет библиотеку функций, к которой должен обращаться разработчик вместо прямого использования сервисов ядра. 2) Драйвера сетевых протоколов. Вкратце, драйвер сетевого протокола (такого как, например TCP/IP) для работы с сетевыми интерфейсами использует функции уже упомянутой библиотеки NDIS и может предоставлять TDI (Transport Data Interface) вышележащим уровням (TDI-клиентам, одним из типичных представителей которых в ядре NT/2000/XP является afd.sys - kernel-mode часть Windows Sockets). 3) User-Mode DLL's которые формируют интерфейс WindowsSockets. Это ws2_32.dll, msafd.dll, wshtcpip.dll и другие. Тех, кто хочет более детально рассмотреть сетевую подсистему Windows , отсылаю к David Solomon, Mark Russinovich : Inside Windows 2000, часть 13. Технологии фильтрации: Технологии фильтрации в User-mode автор не рассматривает. Технологии фильтрации сетевого трафика в режиме ядра: 1) Kernel-mode sockets filter. Эта технология применима для WindowsNT/2000. Основана на перехвате всех вызовов из msafd.dll (самая низкоуровневая user-mode DLL из состава Windows Sockets) к модулю ядра afd.sys (kernel-mode часть WindowsSockets). Данная технология требует аккуратного обращения с интерфейсами AFD , т.к. они изменяются в разных версиях NT. AFD является TDI клиентом и реализует приём/отправку данных через драйвер протокола. Msafd.dll сообщает AFD название протокола для каждого сокета.Для более подробного изучения отправляю в Inside Windows 2000, раздел 13, подраздел Networking APIs.Способ бесполезен при маршрутизации, т.к. она осуществляется внутри TCPIP.SYS(иногда и вне его - поиск по DDK: Fast Forwarding Path - происходит внутри NDIS ) и не доходит до сокетов. Хотя данный способ удобен для шифрования потоков данных и QoS - Quality of Service - предоставляется специальное API (смотреть в MSDN - поиск по QOS Reference). 2) TDI-filter driver. Технология применима как в Windows 9x/ME так и в WindowsNT/2000, хотя конкретные реализации сильно отличаются. Что касается Windows NT/2000, то в случае TCP/IP фильтрации необходимо перехватывать все вызовы, направленные устройствам (devices) созданным модулем tcpip.sys (\Device\RawIp, \Device\Udp, \Device\Tcp). Технология достаточно известная и используется в ряде коммерческих продуктов (например, OutpostFirewall). 3) NDIS Intermediate Driver Способ очень неудобен в инсталляции и программировании. Желающие могут изучить DDK. Ниже приведён пример кода, показывающего громоздкость программирования :
Вкратце способ заключается в создании виртуального адаптера и его установки таким образом,что при каждом вызове реального адаптера сначала шло обращение к виртуальному.Т.е мы как бы накладываем наш виртуальный адаптер на реальный. Вся обработка поступивших вызовов идёт в MP* и Pt* функциях. Где MP* -относится к Miniport, т.е. к нашему виртуальному адаптеру, а Pt* - к Protocol , протоколу, реализуемуму нашим адаптером. Т.е если мы хотим фильтровать TCP/IP , Protocol должен уметь обрабатывать IP - пакеты . 4) Windows 2000 Filter-Hook Driver. Метод описан в документации DDK и применим только в Windows 2000 и выше, его мы и будем рассматривать в практической части. 5) NDIS Hooking Filter Driver.Способ сводится к перехвату некоторых функций NDIS библиотеки, которые в дальнейшем позволяют отследить регистрацию всех протоколов установленных в операционной системе и открытие ими сетевых интерфейсов. Используется в небезызвестном ZoneAlarm. Для Windows 2000 достаточно перехватить 4 функции:
6) Packet Filtering API. На данный момент доступно в Windows 2000 Server и Windows .NET Server 2003. Насчёт пунктов 2,3,5 : автор надеется осветить их в отдельной обширной статье по NDIS и TDI. Часть вторая, практическая. Использование Windows 2000 Filter-Hook Driver Начиная с Windows 2000 Microsoft включила возможность фильтрации IP траффика в контексте IP Filter driver - стандартного сервиса Windows 2000. Как написано в DDK ,драйвера , используемые IP Filter driver сервисом, могут обрабатывать и фильтровать IP траффик, т.е расширять возможности IP Filter driver сервиса. Правда при этом необходимо учитывать нюанс - только один драйвер может использоваться при фильтрации. Драйвер для фильтрации траффика представляет собой обычный Kernel Mode Driver, реализующий определённую функцию фильтрации , которую он и регестрирует в IP Filter driver сервисе .Фильтруются как исходящий, так и входящий траффик. Вот исходный текст простейшего драйвера для IP Filter driver, драйвер просто drop -ает все пакеты :
Для компиляции потребуется masm32 by hutch ,последний KMDKit by Four-F, Update KMDKit by van (пока состоит из pfhook.inc и неполного ndis.inc). Рассмотрим более подробно данный код. 1) CCOUNTED_UNICODE_STRING "\\Device\\IPFILTERDRIVER" ,drvsmbl,4 - название нашего IP Filter driver сервиса. 2) hook_nfo PF_SET_EXTENSION_HOOK_INFO <> - структура , содержащая указатель типа PacketFilterExtensionPtr, т.е на нашу функцию фильтрации. Все остальные типы описаны в MSDN и KMD by Four-F. 3)
Вызываем set_hook , в качестве параметра выступает offset нашей функции фильтрации. Если хук не удалось установить, выходим. 4)
Стандартная процедура регистрации функции выхода. 5)
Устанавливаем указатель на функцию фильтрации в IP Filter driver сервисе в NULL 6)
Наша функция установки фильтра. IoGetDeviceObjectPointer - возвращает указатель в devobj на Device и file object , соответсвующий ему , название которого в drvsmbl . При условии, что доступ к нему разрешён. 7)
Данная функция подробно описана в Walter Oney's Programming the Microsoft Windows Driver Model. Макрос IOCTL_PF_SET_EXTENSION_POINTER() определён в pfhook.inc Результат - устанавливаем irp для нашего драйвера. Все остальные функции в данном разделе описаны в DDK и Programming the Microsoft Windows Driver Model. 8)
Наш фильтр. Как видно, перед нами внутренности пакета.Заголовок и содержимое. Возвращаем PF_DROP. В pfhook.inc определены следующие константы для работы с IP пакетами:
PF_FORWARD - форвардит пакет. Т.е. если destination address != наш адрес и включена маршрутизация, то немедленно посылается forward response в IP стек. PF_PASS - пропускает пакет на наш компьютер. PF_ICMP_ON_DROP - дропает пакет и отправляет ICMP - сообщение. Данная константа недокументирована, хотя и определена. Как установить наш драйвер ? Автор использовал утилиту instdrv из NT DDK . К сожалению, в Win2000 DDK она отсутсвует. Итак, набираем в консоли:
Заключение. Автор не претендует на полноту изложения , он постарался дать лишь общее представление о предмете. Автор также надеется , что данная статья позволит самостоятельно создавать firewall'ы на основе IP Filter driver сервиса и данного сэмпла. Рекомендуемая литература:
Walter Oney's Programming the Microsoft Windows Driver Model. Благодарности:
Volodya /wasm.ru , за то, что терпел и наставлял меня , и за instdrv. Файлы: [C] van |