ПЗ (1195114), страница 4
Текст из файла (страница 4)
if (Lines[0][i]!=' ') return FWA_Skip;
i++;
for(;i<LinesLen[0]&&Lines[0][i]&&Lines[0][i]!='\r'&&HTTPSize<32;i++)
HTTP[HTTPSize++]=Lines[0][i];
HTTP[HTTPSize]=0;
for(l=1;l<NumLine;l++)
if (strncmp(Lines[l],"Host: ",6)==0)
{
int j; for(j=6;j<LinesLen[l]&&Lines[l][j]&&Lines[l][j]!='\r'&&HOSTSize<128;j++)
HOST[HOSTSize++]=Lines[l][j];
HOST[HOSTSize]=0;
}
if (HOSTSize==0) return FWA_Skip;
if (URLSize==0) return FWA_Skip;
HostN = GetHostTable(HOST);
if (HostN!=-1) return FWA_Block;
URLN = GetURLTable(URL);
if (URLN!=-1) return FWA_Block;
return FWA_Skip;
}
}
return FWA_Skip;
}
Функция FilterHTTP обрабатывает пакеты которые через неё проходят и ищет пакеты, содержащие HTTP запрос, после это она анализирует этот запрос и возвращает идентификатор действия, которое необходимо проделать с этим пакетом.
3.6 Установка драйвера
При установки любого драйвера его необходимо зарегистрировать в реестре системы. Чтобы это осуществить в ОС предусмотрено множество способов. Но кроме регистрации необходимо привязать драйвер к конкретным устройствам, а также произвести настройку драйвера.
Мой драйвер является NDIS Miniport драйвером, для таких драйверов в системе есть встроенные средства установки и настройки драйверов. Чтобы запустить мастер установки необходимо в открыть свойства любого сетевого соединения в окне «Сетевые подключения»(Рисунок 3.8).
Рисунок 3.8 – Окно сетевые подключения.
В открывшихся свойствах на закладке «Общие» (Рисунок 3.9а ) или «Сеть»( Рисунок 3.9б), в зависимости от типа сетевого подключения, необходимо нажать кнопку «Установить» для запуска мастера установки сетевых компонентов.
Рисунок 3.9 – Закладка «Общие» для сетевой карты(а) и Закладка «Сеть» для виртуальных соединений и модемов(б).
В открывшемся окне мастера (Рисунок 3.10) выбрать тип компонента служба и нажать кнопку «Добавить». Появится стандартное окно установки драйверов с заголовком «Выбор сетевой службы»(Рисунок 3.11а). Если драйвер не разу не устанавливался, то его не будет в списке сетевых служб, в таком случае необходимо нажать кнопку установить с диска. В открывшемся окне необходимо указать папку, в которой находятся следующие файлы: netsf.inf, netsf_m.inf, MyFireWall.dll, MyFireWall.sys. После этого опять появится окно «Выбор сетевой службы» в котором будут перечислены драйвера сетевых служб находящихся в выбранной папке(Рисунок 3.11б).
Рисунок 3.10 – Окно мастера установки компонентов.
Рисунок 3.11 – Окно установки драйверов сетевых служб установленных в системе(а) и из выбранной папки (б).
Из них необходимо выбрать драйвер «MyFireWall driver». После этого система сама установит и пропишет драйверы, но при этом сообщит что драйвер не имеет цифровой подписи(Рисунок 3.12), которую выдаёт только корпорация Microsoft, в открывшемся окне необходимо будет на жать «Все равно продолжить».
Рисунок 3.12 – Сообщение об отсутствии цифровой подписи у драйвера.
После всех выполненных действий, система запустит драйвер. Который необходимо будет настроить с помощью мастера. Для запуска мастера необходимо будет запустить программу Master.exe. После настройки драйвер будет работать в полностью автономном режиме.
Разработанный код драйвера находится в приложении А. он представлен в двух файлах «FireWall.h»(Листинг А.1) и «FireWall.с» (Листинг А.1) остальной код взят из примера DDK Passthru.
4 ПРОВЕРКА И ТЕСТИРОВАНИЕ МЕЖСЕТЕВОГО ЭКРАНА
Как и любую другую программу, драйвер межсетевого экрана необходимо протестировать, прежде чем начинать работу с ним. Так как у драйвера невозможно использовать режим отладки, будет проводиться тестирование, те будут задаваться разные режимы и настройки драйвера, после этого будет анализироваться лог работы драйвера, на соответствие выбранному режиму.
Тестирование будет проводиться на компьютере, подключенном сразу к Интернету и локальной сети.
4.1 Взаимодействие с драйвером
Для взаимодействия с драйвером был разработан класс TFireWall(Листинг 4.1), который и осуществляет доступ ко всем функциям драйвера. Такая организация позволяет достаточно просто взаимодействовать с драйвером.
При создании объекта класса используется конструктор, который в качестве параметров получает имя драйвера в системе, и указатель на объект класса TStrings, который используется в качестве лога работы класса. Для доступа получения доступа к драйверу используется функция API CreateFile которой в качестве параметра передаётся имя драйвера/2/.
Для непосредственного доступ к функциям драйвера используется функция DeviceIOCTRL которая в качестве параметров принимает номер функции, указатель на буфер и максимальный передаваемый и получаемый размер буфера, а возвращает размер полученных данных в буфере/6/. DeviceIOCTRL использует функцию API DeviceIoControl для взаимодействия с драйвером/8/.
Функции ReadLog, GetQueryPacket, GetQP_PacketDataSize, GetQP_PacketData, QP_PacketDel, WritePraviloTable, ReadPraviloTable, SetTableHTTPHost и SetTableHTTPURL функции, обращающиеся напрямую к соответствующим функциям драйвера IOCTRLGetLog, IOCTRLGetQueryPacket, IOCTRLGetQP_PacketDataSize, IOCTRLGetQP_PacketData, IOCTRLQP_PacketDel, IOCTRLWriteTablePravilo, IOCTRLReadTablePravilo, IOCTRLWriteTableHTTPHost и IOCTRLWriteTableHTTPURL.
Листинг 4.1 – Описание класса TFireWall
class TFireWall
{ private:
HANDLE hDevice; TStrings* Log;
public:
void Print(char* Text){if (Log) Log->Add(Text);};
DWORD DeviceIOCTRL(DWORD Function,void* Buffer,
unsigned int dInput,unsigned int dOutput);
void GetFD(FD* fd);
void DeviceConnect(char* DeviceName);
void DeviceDisconnect();
TFireWall(char* DeviceName,TStrings* Log);
~TFireWall();
bool IsCreate(){return (hDevice!=INVALID_HANDLE_VALUE);};
bool ReadLog(PFirewall_Log Log){return DeviceIOCTRL(FunctionGetLog,Log,0,sizeof(Firewall_Log))==sizeof(Firewall_Log);}
bool GetQueryPacket(LPQueryPacket Packet);
INT GetQP_PacketDataSize(INT ID);
void GetQP_PacketData(INT ID,void* Data,int Size);
void QP_PacketOK(INT ID);
void QP_PacketDel(INT ID);
bool GetTypesSize(LPTypesSize TS);
void SetTableHTTPHost(char* Strings,int Size);
void SetTableHTTPURL(char* Strings,int Size);
};
4.2 Загрузка драйвера
Прежде чем начинать проверку драйвера необходимо проверить загружен ли сам драйвер и если загружен, то удостоверится, что версия загруженного драйвера является последней. Для того чтобы проверить, что программа получила доступ к драйверу необходимо просмотреть лог работы программы. В случае если программа получила доступ, то лог будет содержать следующие строки:
Device open
Version:
V0.5a
А если программа не смогла открыть драйвер то лог будет содержать строку:
Error:device not open
Так что для проверки необходимо всего лишь просмотреть лог работы программ, который выводится в нижнюю часть основной формы. Также для повторного подключения можно использовать меню программы (ДрайверОткрыть). В появившемся окне надо будет указать имя драйвера.
4.3 Результат работы драйвера
Все действия, которые выполняет драйвер с пакетами, отображаются в логе работы драйвера. Мастер настройки драйвера выводит данный лог в отдельном окне(Рисунок 4.1). В этот лог выводится информация об обработанных пакетах. Одна запись в логе означает один обработанный пакет. Для всех пакетов выводится следующая информация:IP адрес отправителя, IP адрес получателя, Направление, Действие, Размер пакета, Размер данных, Время и Правило которое было применено при обработке пакета.
Рисунок 4.1 – Окно «Результат работы драйвера».
В поле «Направление» может значение только «In» или «Out». «In» - пакет получаемый из сети, а «Out» - пакет отправляемый в сеть. Поле Протокол показывает, к какому протоколу из семейства протоколов TCP/IP, относится пакет, может иметь одно из следующих значений:IP, ICMP, IGMP, GGP, TCP, PUP, UDP, IDP, IPV6, ND, ICLFXBM, RAW. Поле «Действие» показывает действие, которое выполнил драйвер над пакетом. Драйвер выполняет всего два действия над пакетом: удаление(«Del»), пропуск пакета(«Skip»). Поле «Размер пакета» показывает полный размер пакета, а поле «Размер данных» показывает размер пакета за вычетом заголовков. Поле «Правило ID» показывает под какое правило попал пакет и выводит номер этого правила из таблицы правил, если данное поле содержит надпись «Default» значил пакет не подпал не под одно из правил. Поля «Локальный порт» и «Удалённый порт» выводятся только у протоколов TCP и UDP. Поле «Время» показывает, в какой момент произошла обработка пакета по системному времени. Используемый формат времени «DD.MM.YYYY hh:mm:ss.ms», где DD – день, MM – месяц, YYYY – год, hh – часы, mm – минуты, ss – секунды, ms – миллисекунды.
Обновление лога происходит примерно 3 раза в секунду. Что позволяет несильно загружать процессор и в тоже время достаточно быстро для восприятия человека.
4.4 Фильтр пакетов
Фильтр пакетов выполняет фильтрацию по полям пакета и в мастере настроек имеется Менеджер TCP/IP фильтров(Рисунок 4.2), который может добавлять и удалять фильтры. Для создания фильтров используется небольшая панель, с левой стороны окна, на которой поля подсвечивается разными цветами. Темные цвета означают, что данное поля не выбрано, а светлые на обор, если поле имеет красный оттенок то значит в этом поле допущена ошибка, если зеленый то значит что поле введено правильно, а если поле имеет серый цвет то оно будет просто проигнорировано.
Рисунок 4.2 – Окно «Менеджер TCP/IP фильтров».
Для проверки работы фильтра будут задаваться различные правила, после чего по сети будут передаваться пакеты, подпадающие и не подпадающие под действие созданного правила. После этого будет анализироваться лог работы драйвера, из которого можно будет определить действительно ли фильтр работает так как надо.
Для отправки пакетов по сети будет использовано несколько программ:Ping, HiperTerminal, Интернет браузер.
Для начала стоит проверить запрещение и разрешение пакетов. Для этого надо провести два теста, в первом тесте создать правило для разрешения всех пакетов, а во втором для запрещения всех пакетов. Для проверки в логе необходимо будет проверить, что все пакеты по полю «Правило ID» имеют значение 00000000, так как в обоих тестах использовано всего одно правило, также необходимо просмотреть «Поле действие» в первом случае все записи должны иметь значение «Skip» а во втором «Del».
В первом случае для проверки используется программа Ping которая отправила четыре запроса и должна получить четыре ответа. Как видно из лога программы(Таблица 4.1) и результата работы программы Ping(Рисунок 4.3)пакеты действительно прошли и драйвер сработал нормально.
Рисунок 4.3 – Результат работы программы Ping при проверке разрешения пакетов.
Таблица 4.1 – Результат работы драйвера для проверки разрешения пакетов.
| IP Отправителя | IP Получателя | Направление | Протокол | Действие | Правило ID |
| 192.168.1.2 | 192.168.1.4 | In | ICMP | Skip | 00000000 |
| 192.168.1.4 | 192.168.1.2 | Out | ICMP | Skip | 00000000 |
| 192.168.1.2 | 192.168.1.4 | In | ICMP | Skip | 00000000 |
| 192.168.1.4 | 192.168.1.2 | Out | ICMP | Skip | 00000000 |
| 192.168.1.2 | 192.168.1.4 | In | ICMP | Skip | 00000000 |
| 192.168.1.4 | 192.168.1.2 | Out | ICMP | Skip | 00000000 |
| 192.168.1.2 | 192.168.1.4 | In | ICMP | Skip | 00000000 |
| 192.168.1.4 | 192.168.1.2 | Out | ICMP | Skip | 00000000 |
Во втором случае при проверке используется также программа Ping, которая отправляет четыре запроса и не должна получить ни одного ответа, так как все отправленные пакеты будут удаленны. Как видно из лога программы(Таблица 4.2) все четыре пакета отправленных программой были удалены, вследствие чего программа Ping выдала, что всё четыре запроса потеряны(Рисунок 4.4).















