Презерватив для Windows Фленов Михаил Xakep, номер #068, стр. 068-098-3 Структура правил _PF_FILTER_DESCRIPTOR = packed record dwFilterFlags: DWORD; dwRule: DWORD; pfatType: PFADDRESSTYPE; SrcAddr: PByteArray; SrcMask: PByteArray; DstAddr: PByteArray; DstMask: PByteArray; dwProtocol: DWORD; fLateBound: DWORD; wSrcPort: Word; wDstPort: Word; wSrcPortHighRange: Word; wDstPortHighRange: Word; end; Рассмотрим параметры этой структуры: dwFilterFlags – флаги, но сейчас поддерживается только FD_FLAGS_NOSYN. dwRule – определяет роль для фильтра. pfatType – тип адреса для фильтра. Здесь можно указывать PF_IPV4 или PF_IPV6. SrcAddr, SrcMask и wSrcPort – IP-адрес, маска и порт источника пакета. DstAddr, DstMask и wDstPort – IP-адрес, маска и порт получателя пакета. dwProtocol – протокол. Здесь можно указать одно из следующих значений: 1. FILTER_PROTO_ANY любой протокол; 2. FILTER_PROTO_ICMP протокол ICMP; 3. FILTER_PROTO_TCP протокол TCP; 4. FILTER_PROTO_UDP протокол UDP. Это основные параметры, которые необходимо указать при создании нового правила. Остальное можно заполнить нулевыми значениями. Пилите гирю, она золотая… ЛИТРЕД – СИМБЕ: заголовок - ??? это к чему вообще? Когда создан интерфейс и готовы правила, все это можно связать с сетевым интерфейсом, который надо защитить. Это делается функцией PfBindInterfaceToIPAddress, которая выглядит так: Привязка интерфейса Function PfBindInterfaceToIPAddress( pInterface: INTERFACE_HANDLE; pfatLinkType: PFADDRESSTYPE; IPAddress: PByteArray): DWORD; stdcall; external IPHLPAPI name '_PfBindInterfaceToIPAddress@12'; Изучим параметры этой функции: pInterface – указатель на созданный нами интерфейс. pfatLinkType – указывает на тип адреса. В настоящее время чаще всего используется 4-байтная IP-адресация, поэтому без раздумий указываем PF_IPV4. Но библиотека уже готова к использованию 6-й версии адресации, и в ближайшем будущем можно будет указывать PF_IPV6. IPAddress – байтовый массив, определяющий IP-адрес интерфейса, который надо защитить. Кстати, чтобы отключить защиту, нужно сначала отсоединить интерфейс с фильтрами, а потом удалить его. Для отсоединения используется функция PfUnBindInterface. У нее только один параметр – указатель на созданный нами ранее интерфейс. Для удаления используем функцию PfDeleteInterface. Здесь тоже один параметр в виде указателя на интерфейс, который надо найти и уничтожить. Кодинг Пример написать легко, сложнее рассказать компилятору о функциях фильтрации. В Visual Studio .NET для этого есть нужный заголовочный файл - fltdefs.h, а вот Borland в этом деле почему-то отстает. Мне пришлось потратить целый день на поиски нормальной портации этого файла под Delphi. В конце концов, решение было найдено в виде модуля fltdefs.pas. Нетрудно догадаться, что теперь модуль лежит на диске к этому номеру вместе с исходником :). В листинге 1 показан пример создания нескольких фильтров. Обрати внимание, что в самом начале загружается библиотека WinSock, потому что для работы нам понадобятся сетевые функции. Если этого не сделать, то ошибок во время выполнения программы не оберешься. Конечно же, для компиляции такого примера нужно подключить в раздел uses помимо модуля fltdefs еще и winsock. |