Разработка межсетевого экрана для компьютеров пользователей с использованием технологии WFP

  • Вид работы:
    Контрольная работа
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    194,15 Кб
  • Опубликовано:
    2012-08-06
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка межсетевого экрана для компьютеров пользователей с использованием технологии WFP

Оглавление

Введение

Теоретическая часть

Инструкция

Практическая часть

Заключение

Список используемых источников

Приложение

Введение

Начиная с версий Server 2008 и Vista в Windows был встроен механизм WFP (Windows Filtering Platform - платформа фильтрации Windows), представляющий собой набор API и системных сервисов. Данный набор позволяет запрещать и разрешать соединения, управлять отдельными пакетами. Эти нововведения были предназначены для упрощения жизни разработчиков различных защит. Внесенные в сетевую архитектуру изменения затронули как kernel-mode, так и user-mode части системы. В первом случае необходимые функции экспортируются fwpkclnt.sys, во втором - fwpuclnt.dll (буквы "k" и "u" в названиях библиотек означают kernel и user соответственно).

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

Теоретическая часть

Библиотеки, содержащие средства для работы с WFP, находятся в наборе для разработчиков WDK (Windows Driver Kit).

Первым делом необходимо создать экземпляр типа Handle - дескриптор, описывающий различные объекты. В нашем случае переменная этого типа будет предназначена для работы с фильтром. Инициализации этой переменной происходит при вызове функции FwpmEngineOpen0, которая открывает сессию для работы с фильтром.

Прототип этой функции выглядит следующим образом:

DWORD WINAPI FwpmEngineOpen0(

__in_optconstwchar_t *serverName,

__in UINT32authnService,

__in_optSEC_WINNT_AUTH_IDENTITY_W *authIdentity,

__in_optconst FWPM_SESSION0 *session,

__out HANDLE *engineHandle

);

где: Данное значение должно быть NULL

authnService Особенности аутентификации. Допустимые значения:RPC_C_AUTHN_WINNTи RPC_C_AUTHN_DEFAULT. Аутентификация и авторизация для доступа к фильтру. Для нашей задачи можно использовать NULL

session Специфические параметры открытия сессии. Для нашей задачи можно использовать NULL

engineHandle Уже описанная выше переменная для открытия работы с фильтром.

В случае успеха операции метод возвращает ERROR_SUCCESS.

Сетевой уровень можно разделить на три группы подуровней:

) Подуровни сетевого доступа - протоколы, занимающиеся интерфейсом сетей, такие как X.25

) Подуровни зависимого сетевого сближения - необходимо для приведения уровня транзитной сети до уровня сети на другой стороне

) Подуровни независимого сетевого сближения - для переноса через многочисленные сети

Следующим шагом необходимо добавить подуровень, в который, в дальнейшем, пропишем наш фильтр.

Для этого создадим переменную типа FWPM_SUBLAYER0

typedefstruct FWPM_SUBLAYER0_ {subLayerKey;_DISPLAY_DATA0displayData;flags;*providerKey;_BYTE_BLOB providerData;weight;

} FWPM_SUBLAYER0;

где: Уникальный идентификатор подуровня (GUID).

displayData Название и описание подуровня в понятной для пользователя форме.

Flags Флаг. Должен быть FWPM_SUBLAYER_FLAG_PERSISTENT Уникальный идентификатор провайдера, управляющего данным подуровнем.

providerData Специфические данные провайдера.

Weight Вес подуровня. Подуровни с большим весом вызываются раньше.

Добавим созданный подуровень в систему при помощи метода FwpmSubLayerAdd0

DWORD WINAPI FwpmSubLayerAdd0(

__in HANDLE engineHandle,

__in const FWPM_SUBLAYER0 *subLayer,

__in_opt PSECURITY_DESCRIPTOR sd

);

где:

engineHandle переменная для открытия работы с фильтром.

subLayer добавляемый подуровень

sd информация о безопасности для данного подуровня

В случае успеха операции метод возвращает ERROR_SUCCESS.

Теперь создадим уже непосредственно фильтр. Для этого объявим и проинициализируем переменную типа FWPM_FILTER0:

typedefstruct FWPM_FILTER0_ {;_DISPLAY_DATA0displayData;flags;*providerKey;_BYTE_BLOB providerData;;;_VALUE0 weight;numFilterConditions;_FILTER_CONDITION0 *filterCondition;_ACTION0 action;{rawContext;providerContextKey;

};*reserved;filterId;_VALUE0effectiveWeight;

} FWPM_FILTER0;

где: Уникальный идентификатор фильтра (GUID).

displayData Название и описание фильтра в понятной для пользователя форме.

FlagsКомбинация значений. Для нашей задачи берется значение по умолчанию - FWPM_FILTER_FLAG_NONE

providerKey Уникальный идентификатор провайдера, управляющего данным подуровнем.

providerData Специфические данные провайдера.

layerKeyУникальный идентификатор уровня, на который нужно добавить фильтр.

FilteringLayerIdentifiers <#"552373.files/image001.jpg">

Рисунок 1. Начальный вид графической оболочки.

Рисунок 2. Вид работы консольного приложения.

Просмотр списка фильтров.

Для просмотра списка фильтров нужно нажать кнопку Show Information. При нажатии появится сообщение с информацией, как например на рисунке 3.

Рисунок 3. Сообщение с информацией.

Если у вас стоит фильтр, который блокирует весь трафик то появится сообщение, как на рисунке 4:

Рисунок 4. Сообщение о блокировании всего трафика.

Вся информация о фильтрах хранится в файле BlockList

Добавление и удаление фильтров.

Для того, чтобы добавить или удалить необходимый фильтр нужно нажать на соответствующую кнопку: Block/Unblock all traffic, Block/Unblock by IP-adress, Block/Unblock by port или Block/Unblock application.

Блокирование и разблокирование всего трафика.

Если вы хотите добавить или удалить фильтр, который будет блокировать(блокирует) весь ваш трафик, вам нужно нажать на кнопку Block/Unblock all traffic. На рисунках 5 и 6 изображены сообщения об успешном выполнении:

Рисунок 5. Выполнение операции разблокирования всего трафика.

Рисунок 6. Выполнение операции блокирования всего трафика.

Блокирование и разблокирование IP-адресов и портов.

Для добавления или удаления фильтра, который будет блокировать(блокирует) IP-адрес или порт, вам нужно нажать на соответствующую кнопку Block/Unblock by IP-adress или Block/Unblock by port(на рисунке 7 изображена панель добавления/удаления IP-адреса). При нажатии появится панель для ввода необходимого IP-адреса или порта, выбора действия Add или Delete и кнопки вернуться в начальную панель Back или применить действие для введенного IP-адреса или порта Apply. Для добавления или удалении фильтра необходимо ввести необходимый IP-адрес или порт(при вводе IP-адреса не забудьте расставить точки, например: 192.168.0.1) выбрать действие и нажать кнопку подтверждения Apply.

Рисунок 7. Окно добавления/удаления IP-адреса.

На рисунках 8 и 9 показана ошибки добавления уже существующего фильтра или удаления несуществующего фильтра.

Рисунок 8. Ошибка при добавлении уже существующего фильтра.



На рисунках 10 и 11 показаны ошибки о вводе неверных данных.

Рисунок 10. Ошибка при вводе неверного IP-адреса.

Рисунок 11. Ошибка при вводе неверного порта.

При успешном добавлении или удалении фильтра появится первая панель с выбором действий.

Блокирование и разблокирование приложений.

Для добавления или удаления фильтра, который будет блокировать(блокирует) приложение, вам нужно нажать на соответствующую кнопку Block/Unblock application. При нажатии появится панель, как на рисунке 12:

Рисунок 12. Панель добавления/удаления в список фильтров программ

На панели присутствуют кнопки Add и Delete для выбора необходимого действия, Choose necessary program для выбора необходимого приложения, Back для возврата в начальную панель, Apply для применения необходимого действия. На рисунке 13 изображена ошибка, которая возникает, если нажать на кнопку Apply до выбора приложения:

Рисунок 13. Ошибка, если не выбрана программа.

Применение изменений.

Для перезапуска приложения ConsoleFilter нужно нажать на кнопку Reboot Filter. При успешном выполнении операции будет показано сообщение, как на рисунке 14:

Рисунок 14. Сообщение о перезапуске фильтра.

Закрытие программы.

При закрытии программы, если вы забыли нажать после некоторых изменений кнопку Reboot Filter, вам будет показано сообщение с вопросом, которое изображено на рисунке 15, хотите ли вы перезапустить фильтры сейчас или же они будут перезапущены при следующем запуске программы или перезагрузке компьютера.

Рисунок 15.Сообщение с запросом о перезапуске фильтра.

Если нажать кнопку "Да", то фильтры будут перезапущены, если "Нет", то фильтры перезапустятся при следующем запуске программы.

Фильтры обнулятся после перезагрузки компьютера.

Практическая часть

Для практической реализации использовалась среда VisualStudio 2012 ReleaseCandidate с предустановленным пакетом WindowsDriverKit 8.0.

Работа с WFP происходит в консольном приложении, написанном на языке C++ (исходный код представлен в приложении). Графическая оболочка написана в той же среде программирования, но на языке C#(исходный код представлен в приложении).

Все условия добавляются и хранятся в файле BlockList.

Заключение

сетевой трафик блокировка фильтр

В ходе работы над практическим заданием мы изучили и разобрались с относительно новым продуктом от Microsoft для работы с сетевым трафиком - Windows Filtering Platform. Мы разработали работоспособную программу для блокирования трафика по IP-адресу либо по порту соединения на языке C++, а так же графическую оболочку для более удобной работы с нашей программой. При написании графическом оболочки были повторены и углублены знания языка C#. Так же мы познакомились с новой версией одной из самых популярных сред программирования - Visual Studio 2012 RC с обновленным пакетом для разработчиков Windows Driver Kit 8.0.

Список используемых источников

1.         Windows Filtering Platform. Введение и преимущества WFP.

(<http://msdn.microsoft.com/en-us/library/windows/hardware/gg463267.aspx>)

2.         WFPFunctions. Описание и пояснение в использовании методов WFP.

(<http://msdn.microsoft.com/en-us/library/windows/desktop/aa364931(v=vs.85).aspx>)

3.         WFPErrorCodes. Специфические ошибки WFP с кодом и описанием.

(<http://msdn.microsoft.com/en-us/library/windows/desktop/bb540652(v=vs.85).aspx)>

4.         Windows Filtering Platform в защите и нападении. Статья с журнала Хакер.

(<http://www.xakep.ru/post/54421/>)

Приложение

Исходный код консольного приложения

#include "stdafx.h"

#include <windows.h>

#include <fwpmu.h>

#include <stdio.h>

#include <conio.h>

#include "winreg.h"

#define bufSize 100

#pragma comment(lib, "fwpuclnt.lib")

#pragma region   ПрототипыAddAllFilters(GUID subLayerGUID, HANDLE engineHandle);AddFilter(GUID subLayerGUID, HANDLE engineHandle, UINT32 cond, char * str);AddFilter(GUID subLayerGUID, HANDLE engineHandle, GUID guid);DelFilter(HANDLE engineHandle);DelFilter(HANDLE engineHandle, GUID ID);DelSubLayer(HANDLE engineHandle, GUID _idSubLayer);CloseSeans(HANDLE engineHandle);AutoStart();

#pragma endregion_tmain(int argc, char* argv[])

{result;//Результат произведенной операции. В случае успеха Error_SuccessengineHandle = NULL;//Основной двигатель процесса

#pragma region   Открытие сеанса= FwpmEngineOpen0(,_C_AUTHN_WINNT,,,

&engineHandle);(result != ERROR_SUCCESS)

{("Engine Open failed with error: %d\n",result);("pause");;

}("Engine Opened successfully!\n");

#pragma endregion

#pragma region   Добавление подуровня

//GUID {6AE8A860-A30E-4253-80A1-C1807E17AAFC}subLayerGUID = { 0x6ae8a860, 0xa30e, 0x4253, { 0x80, 0xa1, 0xc1, 0x80, 0x7e, 0x17, 0xaa, 0xfc } };

FWPM_SUBLAYER0 *mySubLayer={0};        //Подуровень, в который будем прописывать наши фильтры

//Проверка на существование подуровня с данным GUID

result = FwpmSubLayerGetByKey0(engineHandle,&subLayerGUID,&mySubLayer);(result!=ERROR_SUCCESS)

{=new FWPM_SUBLAYER0();>subLayerKey = subLayerGUID;>flags = FWPM_SUBLAYER_FLAG_PERSISTENT;>weight=0x01;>displayData.description=L"Sublayer";>displayData.name=L"Sublayer";= FwpmSubLayerAdd0(engineHandle,mySubLayer,NULL);(result != ERROR_SUCCESS)

{("SubLayer Added failed with error: %d\n",result);(engineHandle);;

}("SubLayer Added successfully!\n");

}("SubLayer is already exist.\n");

#pragma endregion

#pragma region Добавление фильтров

if(!(argc>1))//Консоль открывается из автозапуска

{

//Добавляем новые основные фильтры(subLayerGUID,engineHandle);

printf("Filters added successfully!\n");

}//Консоль открывается из GUI-оболочки

{();

//GUID {1C046A9A-9187-4629-8184-24836DFE5EEB}allFilterGUID = { 0x1c046a9a, 0x9187, 0x4629, { 0x81, 0x84, 0x24, 0x83, 0x6d, 0xfe, 0x5e, 0xeb } };

//Добавляем вспомогательный фильтр(subLayerGUID, engineHandle,allFilterGUID);

//Удаляем основные фильтры(engineHandle);

//Добавляем новые основные фильтры(subLayerGUID,engineHandle);("Filters added successfully!\n");

//Удаляем вспомогательный фильтр(engineHandle,allFilterGUID);

}

#pragma endregion(engineHandle);;

}

//Добавление массива фильтровAddAllFilters(GUID subLayerGUID, HANDLE engineHandle)

{result = NULL;

#pragma region Подсчет каждого вида условий*buf = new char[bufSize];//Буфер для хранения считанной строкиipCount=0,//Количество условий по IP=0,//Количество условий по порту=0;//Количество условий по приложениям

//Считываем из БД*f = fopen("C:\\Program Files\\Filter\\BlockList.iff","r");(!f)

{("File \"BlockList.iff\" dosen't exist!\n");

return;

}

//Считываем первую строку - блокировать весь трафик или нет

fgets(buf,bufSize,f);[strlen(buf)-1]='\0';*filterFile = fopen("C:\\Program Files\\Filter\\FilterList.iff","w");(!filterFile)

{("File \"FilterList.iff\" dosen't create!\n");;

}filterID=NULL;("Blocked all traffik: %s.\n",buf);

if(!strcmp(buf,"true"))   //Если нужно заблокировать весь трафик

{= AddFilter(subLayerGUID,engineHandle,0,"All");(filterID!=-1)(filterFile,"%d\n",filterID);(filterFile);(f);;

}

//Считываем пустую строку(buf,bufSize,f);n=1;//Счетчик пустых строк

//Считывание количества каждого вида условий

while(!feof(f))

{(buf,bufSize,f);

//Если последняя строка, то выходим из цикла

if(feof(f));[strlen(buf)-1]='\0';(buf[0]=='\0')

{++;;

}(n)

{1: ipCount++; break;2: portCount++; break;3: appCount++; break;: break;

}

}("\nIP %d\nPort %d\nApplications %d\n\n",ipCount,portCount,appCount);(ipCount+portCount+appCount==0)

{("There is no conditions.\n");;

}

#pragma endregion

#pragma region Создание фильтров

fseek(f,0,SEEK_SET);(buf,bufSize,f);//Пропускаем строку, содержащую значение флага, показывающего блокировать всё или нет(buf,bufSize,f);//Пропускаем первую пустую строкуi;//счетчик цикловbuffer=0;//буфер для считывания

//Блокировка по IP(i=0; i < ipCount; i++)

{(f,"%d",&buffer);//cчитываем i-ый адрес= AddFilter(subLayerGUID,engineHandle,buffer,"IP");(filterID!=-1)(filterFile,"%d\n",filterID);

}(buf,bufSize,f);//Считываем пустую строку

//Блокировка по порту(i=0; i < portCount; i++)

{(f,"%d",&buffer);//cчитываем i-ый порт БД= AddFilter(subLayerGUID,engineHandle,buffer,"Port");(filterID!=-1)(filterFile,"%d\n",filterID);

}(buf,bufSize,f);//Считываем пустую строку

//Блокировка по приложениям(i=0; i < appCount; i++)

{(buf,bufSize,f);//cчитываем i-ое приложение БД

buf[strlen(buf)-1]='\0';= AddFilter(subLayerGUID,engineHandle,0,buf);(filterID!=-1)(filterFile,"%d\n",filterID);

}(filterFile);(f);

#pragma endregion

}

//Добавление фильтра на подуровеньAddFilter(GUID subLayerGUID, HANDLE engineHandle, UINT32 cond, char * str)

{result = NULL;

#pragma region Создание фильтра_FILTER0_ myFilter={0};id=NULL;(&myFilter,sizeof(myFilter));_FILTER_CONDITION0 condition;.action.type= FWP_ACTION_BLOCK;.subLayerKey = subLayerGUID;.weight.type = FWP_EMPTY;.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4;.displayData.description=L"Filter";.displayData.name=L"Filter";(str=="All")

{.numFilterConditions = 0;("Added all blocked filter.\n");

}

{.numFilterConditions = 1;.filterCondition = &condition;

if(str=="IP")

{_V4_ADDR_AND_MASK addr;//адрес, который нужно добавить в фильтр

addr.addr=cond;.mask=0xffffffff;("Added IP: %d\n",addr.addr);.fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS;.matchType=FWP_MATCH_EQUAL;.conditionValue.type=FWP_V4_ADDR_MASK;.conditionValue.v4AddrMask = &addr;

}

{

if(str=="Port")

{port = cond;//порт, который нужно добавить в фильтр

printf("Added port: %d\n",port);.fieldKey = FWPM_CONDITION_IP_REMOTE_PORT;.matchType=FWP_MATCH_EQUAL;.conditionValue.type=FWP_UINT16;.conditionValue.uint16=port;

}

{_t *app = new wchar_t[bufSize];

swprintf(app,L"%S",str);//приложение, которое нужно добавить в фильтр

FWP_BYTE_BLOB *applicationID = NULL;= FwpmGetAppIdFromFileName0(app,&applicationID);(result != ERROR_SUCCESS)

{("Add application \"%s\" failed with error: %d.\n\n",str,result);-1;

}("Added application: %s\n",str);.fieldKey = FWPM_CONDITION_ALE_APP_ID;.matchType=FWP_MATCH_EQUAL;.conditionValue.type=FWP_BYTE_BLOB_TYPE;.conditionValue.byteBlob=applicationID;

}

}

}

#pragma endregion

#pragma region Добавление фильтра= FwpmFilterAdd0(engineHandle,&myFilter,NULL,&id);(result != ERROR_SUCCESS)

{("Filter Added failed with error: %d\n\n",result);-1;

}

#pragma endregionid;

}

//Добавление вспомогательного фильтра на подуровеньAddFilter(GUID subLayerGUID, HANDLE engineHandle, GUID guid)

{result = NULL;

#pragma region Создание фильтра_FILTER0_ myFilter={0};(&myFilter,sizeof(myFilter));.action.type= FWP_ACTION_BLOCK;.subLayerKey = subLayerGUID;.weight.type = FWP_EMPTY;.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4;.displayData.description = L"Secondary filter";.displayData.name = L"Secondary filter";.filterKey = guid;.numFilterConditions = 0;

#pragma endregion

#pragma region Добавление фильтра= FwpmFilterAdd0(engineHandle,&myFilter,NULL,NULL);(result != ERROR_SUCCESS)("Secondary filter added failed with error: %d\n\n",result);("Secondary filter added successfully!\n");

#pragma endregion

}

//Удаление фильтров по сохраненным IDDelFilter(HANDLE engineHandle)

{

#pragma region Удаление фильтров по сохраненным ID

FILE *filterFile = fopen("C:\\Program Files\\Filter\\FilterList.iff","r");(!filterFile)

{("File \"FilterList.iff\" dosen't exist!\n");;

}id = NULL;result = NULL;(!feof(filterFile))

{(filterFile,"%d",&id);//cчитываем i-ый адрес

//Если последняя строка, то выходим из цикла

if(feof(filterFile));(id==0);= FwpmFilterDeleteById0(engineHandle,id);(result!=ERROR_SUCCESS)("Filter (ID=%d) close failed with error: %s\n",id,result);

}(filterFile);("Filters closed successfully!\n");

#pragma endregion

}

//Удаление фильтра по GUID

void DelFilter(HANDLE engineHandle, GUID ID)

{

#pragma region Удаление фильтра по GUID

DWORD result = FwpmFilterDeleteByKey0(engineHandle,&ID);(result != ERROR_SUCCESS)

{(result == FWP_E_FILTER_NOT_FOUND)("Secondary filter doesn't exist.\n");("Secondary filter closed failed with error: %d\n",result);;

}("Secondary filter closed successfully!\n");

#pragma endregion

}

//Удаление подуровняDelSubLayer(HANDLE engineHandle, GUID _idSubLayer)

{

#pragma region Удаление подуровняresult = FwpmSubLayerDeleteByKey0(engineHandle,&_idSubLayer);(result != ERROR_SUCCESS)("SubLayer closed failed with error: %d\n",result);("SubLayer closed successfully!\n");

#pragma endregion

}

//Закрытие сеансаCloseSeans(HANDLE engineHandle)

{

#pragma region Закрытие сеансаresult = FwpmEngineClose0(engineHandle);(result != ERROR_SUCCESS)("Engine close failed with error: %d\n",result);("Engine closed successfully!\n");("pause");

#pragma endregion

}

//Запись в автозапускAutoStart()

{

#pragma region Запись в автозапускresult=NULL;hKey = NULL;= RegCreateKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",,,_OPTION_VOLATILE,_ALL_ACCESS,,

&hKey,);(result!=ERROR_SUCCESS)("Open failed with error: %d\n",result);

{* buf = new byte[100];= (LPBYTE)L"\"C:\\Program Files\\Filter\\ConsoleFilter.exe\"";= RegSetValueEx(hKey,"ConsoleFilter.exe",,_SZ,,

);(result!=ERROR_SUCCESS)("Add failed with error: %d\n",result);= RegCloseKey(hKey);(result!=ERROR_SUCCESS)("Close failed with error: %d\n",result);

}

#pragma endregion

}

Исходный код графической оболочки

using System;

using ADOX;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;using System.Text;System.Windows.Forms;System.IO;PracticGUI

{partial class Form1 : Form

{Form1()

{();

}void Form1_Load(object sender, EventArgs e)

{.Enabled = false;path = FileAdress;

if (!File.Exists(path))// Проверка на существования файла со списком фильтров

{

// Если файла нет, то создаем файл с пустым списком фильтров

try

{(StreamWriter sw = File.CreateText(path))

{.WriteLine("false");.WriteLine("");.WriteLine("");.WriteLine("");

}.Diagnostics.Process proc = new System.Diagnostics.Process();.StartInfo.FileName = FilterAdress;.StartInfo.Arguments = "Yes";

proc.Start();//Запуск консольного приложения.Close();

}(Exception ex)

{.Show(ex.ToString(), "Error");.Exit();;

}

}

{

{.Diagnostics.Process proc = new System.Diagnostics.Process();.StartInfo.FileName = FilterAdress;.StartInfo.Arguments = "Yes";

proc.Start();// Запуск консольного приложения.Close();

}(Exception ex)

{.Show(ex.ToString(), "Error");

Application.Exit();;

}

}

}reboot = 0;//Проверка были ли изменения в файле со списком фильтровFileAdress = "BlockList.iff", //Файл в который сохраняет список фильтров= "ConsoleFilter.exe";//Консольное приложение для работы с фильтрами

//Меняет панель в зависимости от нажатой кнопки

private void changeState(bool flag)

{(flag)

{.Visible = false;.Visible = true;.Text = "";

}

{.Visible = true;.Visible = false;

}

}void label1_Click(object sender, EventArgs e)

{[] lines = File.ReadAllLines(FileAdress);

if (lines[0] == "true")//Проверка: в каком состоянии находится фильтр блокирующий весь трафик

{("All", "false");.Show("It was successfully unblocked", "Operation coplete", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

{("All", "true");.Show("It was successfully blocked", "Operation coplete", MessageBoxButtons.OK, MessageBoxIcon.Information);

}

}void label2_Click(object sender, EventArgs e)

{(true);.Text = "Input IP-address";

}void label3_Click(object sender, EventArgs e)

{(true);.Text = "Input port";

}void label4_Click(object sender, EventArgs e)

{(true);.Text = "Choose necessary program";.BorderStyle = BorderStyle.FixedSingle;.Enabled = true;

}void label5_Click(object sender, EventArgs e)

{addr = textBox1.Text;

#region Add/Delete IP

if (label6.Text == "Input IP-address")//Проверка, какая из панелей запущена

{(addr.Length < 7)//Если количество символов меньше минимально возможного

{.Show("Invalid IP-adress", "Error");

return;

}.Trim();n = 0,//Количество символов в блоках адреса (между точками)= 0;//Количество точек в адресе[] array = new int[4];//Массив, содержащий блоки адреса. Для фильтрации лишних нулей(int i = 0; i < addr.Length; i++)

{ch = addr[i];(ch >= 0x30 && ch <= 0x39)

{++;(n > 3)

{.Show("Invalid IP-adress", "Error");;

};

{

//Если предыдущий символ был не точка, данный символ является последним

if (n == 0 || addr.LastIndexOf(ch) == addr.Length - 1)

{.Show("Invalid IP-adress", "Error");;

}(n == 3)

{a = Convert.ToInt32(addr.Substring(i - n, n));(a > 255)//Блок больше 255

{.Show("Invalid IP-adress", "Error");;

}

}[nDot] = Convert.ToInt32(addr.Substring(i - n, n));= 0;++;;

}.Show("Invalid IP-adress", "Error");;

}(nDot != 3)

{.Show("Invalid IP-adress", "Error");;

}[3] = Convert.ToInt32(addr.Substring(addr.Length - n, n));

//Преобразование IP-адреса для консольного приложения

addr = "";(int i = 0; i < 4; i++)

{(Convert.ToString(array[i], 16).Length < 2) addr += "0" + Convert.ToString(array[i], 16);addr += Convert.ToString(array[i], 16);

}= Convert.ToUInt32(addr, 16).ToString();

if (radioButton1.Checked == true)//Проверка на выбранное действие

{(CheckCondition(addr) == false)//Проверка на наличие IP-адреса в файле

{

//Добавление IP-адреса в файл("IP", addr);

}

{.Show("This IP already exists in the database", "Error");;

}

}

{(CheckCondition(addr) == true)//Проверка на наличие IP-адреса в файле

{

//Удаление IP-адреса из файла("IP", addr);

}

{.Show("This IP not exists in the database", "Error");;

}

}

}

#endregion

#region Add/Delete Port_a;(label6.Text == "Input port")

{(addr.Length < 1)//Если количество символов меньше минимально возможного

{.Show("Invalid port", "Error");;

}(char ch in addr)

{(ch >= 0x30 && ch <= 0x39);.Show("Invalid port", "Error");;

}

_a = Convert.ToInt32(addr);(_a < 1)

{.Show("Invalid port", "Error");;

}(radioButton1.Checked == true)//Проверка на выбранное действие

{(CheckCondition(addr) == false)//Проверка на наличие порта в файле

{

//Добавление порта в файл("Port", addr);

}

{.Show("This port already exists in the database", "Error");;

}

}

{(CheckCondition(addr) == true)//Проверка на наличие порта в файле

{

//Удаление порта из файла("Port", addr);

}

{.Show("This port not exists in the database", "Error");;

}

}

}

#endregion

#region Add/Delete Programm(label6.Text == "Choose necessary program")

{(textBox1.Text.Length == 0)//Проверка выбрана ли программа

{.Show("Please choose necessary program", "Error");;

}(radioButton1.Checked == true)//Проверка на выбранное действие

{(CheckCondition(textBox1.Text) == false)//Проверка на наличие в файле

{

//Добавление программы в файл("Programm", textBox1.Text);

}

{.Show("This programm already exists in the database", "Error");;

}

}

{(CheckCondition(textBox1.Text) == true)//Проверка на наличие в файле

{

//Удаление программы из файла("Programm", textBox1.Text);

}

{.Show("This Programm not exists in the database", "Error");;

}

}.ReadOnly = false;.BorderStyle = BorderStyle.None;

}

#endregion(false);.Enabled = false;

}void label7_Click(object sender, EventArgs e)

{(false);.ReadOnly = false;.BorderStyle = BorderStyle.None;.Enabled = false;

}void label8_Click(object sender, EventArgs e)

{();

}void Form1_FormClosing(object sender, FormClosingEventArgs e)

{(reboot == 1)//Проверка были ли введены изменения в список фильтров

{result = MessageBox.Show("If you close this application without rebooting the filter, it will refresh after this program restarts. Do you want to reboot the filter now?", "Do you want to reboot the filter now?", MessageBoxButtons.YesNo, MessageBoxIcon.Question);(result == DialogResult.Yes)

{

{.Diagnostics.Process proc = new System.Diagnostics.Process();.StartInfo.FileName = FilterAdress;.Start();//Запуск консольного приложения.Close();.Show("The filter successfully rebooted", "Reboot filter", MessageBoxButtons.OK, MessageBoxIcon.Information);

}(Exception ex)

{.Show(ex.ToString(), "Reboot filter", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}

}

}void label9_Click(object sender, EventArgs e)

{

{.Diagnostics.Process proc = new System.Diagnostics.Process();.StartInfo.FileName = FilterAdress;.StartInfo.Arguments = "Yes";

proc.Start();//Запуск консольного приложения.Close();

MessageBox.Show("The filter successfully rebooted", "Reboot filter", MessageBoxButtons.OK, MessageBoxIcon.Information);= 0;

}(Exception ex)

{.Show(ex.ToString(), "Reboot filter", MessageBoxButtons.OK, MessageBoxIcon.Error);

}

}void label6_Click(object sender, EventArgs e)

{

//Выбор программы для добавления\удаления.Visible = true;

OpenFileDialog openFile = new OpenFileDialog();.Filter = "exe files (*.exe) | *.exe";(openFile.ShowDialog() == DialogResult.OK)

{.Text = openFile.FileName.ToString();

textBox1.ReadOnly = true;

}

}

//Перевод IP для отображения в информации

private string IPtoInfo(string IP16)

{IP10 = "", str = "";aa = 0;= Convert.ToString(Convert.ToInt64(IP16, 10), 16);(IP16.Length == 7) IP16 = "0" + IP16;(int i = 0; i < 8; i += 2)

{= IP16.Substring(i, 2);+= Convert.ToInt32(str, 16).ToString();(aa < 3)

{+= ".";

}++;

}IP10;

}

//Добавление нового условия в файлvoid AddNewCondition(string column, string addr)

{num = 0;(column)

{"All": num = 0; break;"IP": num = 1; break;"Port": num = 2; break;"Programm": num = 3; break;

}<string> ListOfCondititon = new List<string>();[] lines = File.ReadAllLines(FileAdress);

int i = 0;(num == 0)//Если изменяем фильтр блокирующий весь трафик

{(string s in lines)

{(i == 0)

{.Add(addr);++;

}

{.Add(s);

}

}.WriteAllLines(FileAdress, ListOfCondititon);= 1;;

}

//Добавление нового условия(string s in lines)

{(s == "")

{(num == 0)

{.Add(addr);

}-= 1;

}

++i;.Add(s);

}(column == "Programm")

{.Add(addr);

}.WriteAllLines(FileAdress, ListOfCondititon);= 1;

}

//Проверка на присутствие данного условия в файле

private bool CheckCondition(string addr)

{[] lines = File.ReadAllLines(FileAdress);(string s in lines)

{(addr == s)

{true;

}

}false;

}

//Удаление условия из файла

private void DeleteCondition(string column, string addr)

{<string> ListOfCondititon = new List<string>();[] lines = File.ReadAllLines(FileAdress);(string s in lines)

{(addr != s)

{.Add(s);

}

}.WriteAllLines(FileAdress, ListOfCondititon);= 1;

}

//Вывести на экран все условияvoid ShowCondition()

{m = 0;//Проверка, что считалось из файла(порт или программа и тд)

string message = "";<string> ListOfCondititon = new List<string>();[] lines = File.ReadAllLines(FileAdress);//Считывание списка фильтров построчно(lines[0] == "true")

{.Show("All blocked", "Filters:", MessageBoxButtons.OK, MessageBoxIcon.Information);;

}+= "List of IP-addresses:\n";(string s in lines)

{(m != 0 && m != 1)

{(m == 2 && s != "")

{+= IPtoInfo(s) + "\n";

}

{+= s + "\n";

}(s == "")

{++;(m)

{3: message += "List of Ports:\n"; break;4: message += "List of Programms:\n"; break;5: break;

}

}

}

{++;

}

}.Show(message, "Filters:", MessageBoxButtons.OK, MessageBoxIcon.Information);

return;

}

}

}

Похожие работы на - Разработка межсетевого экрана для компьютеров пользователей с использованием технологии WFP

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!