Разработка межсетевого экрана для компьютеров пользователей с использованием технологии 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;
}
}
}