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

Библиотеки, содержащие средства для работы с WFP. Работа с сетевым трафиком. Блокировка трафика отдельных соединений по IP-адресу либо по порту. Добавление и удаление фильтров. Блокирование и разблокирование приложений. Добавление массива фильтров.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 07.08.2012
Размер файла 556,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Оглавление

  • Введение
  • Теоретическая часть
  • Инструкция
  • Практическая часть
  • Заключение
  • Список используемых источников
  • Приложение

Введение

Начиная с версий 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

);

где:

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

authnService Особенности аутентификации. Допустимые значения:RPC_C_AUTHN_WINNTи RPC_C_AUTHN_DEFAULT.

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

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

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

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

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

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

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

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

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

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

typedefstruct FWPM_SUBLAYER0_ {

GUID subLayerKey;

FWPM_DISPLAY_DATA0displayData;

UINT16 flags;

GUID *providerKey;

FWP_BYTE_BLOB providerData;

UINT16 weight;

} FWPM_SUBLAYER0;

где:

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

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

Flags Флаг. Должен быть FWPM_SUBLAYER_FLAG_PERSISTENT

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

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_ {

GUIDfilterKey;

FWPM_DISPLAY_DATA0displayData;

UINT32 flags;

GUID *providerKey;

FWP_BYTE_BLOB providerData;

GUIDlayerKey;

GUIDsubLayerKey;

FWP_VALUE0 weight;

UINT32numFilterConditions;

FWPM_FILTER_CONDITION0 *filterCondition;

FWPM_ACTION0 action;

union{

UINT64 rawContext;

GUID providerContextKey;

};

GUID *reserved;

UINT64filterId;

FWP_VALUE0effectiveWeight;

} FWPM_FILTER0;

где:

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

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

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

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

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

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

FilteringLayerIdentifiers - список доступных значений.

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

Filtering Sub-Layer Identifiers - список встроенных подуровней. Так же можно добавить идентификатор созданного вручную подуровня.

weightвесфильтра. Для нашей задачи будем использоватьFWP_EMPTY - автоматически принимаемое значение веса, основанное на условиях фильтра.

FilterWeightIdentifiers - список встроенных констант данного параметра.

numFilterConditions количество условий фильтра.

filterCondition массив условий фильтра. Содержат информацию о типе блокировки (по IP адресу, по порту, по идентификатору приложения, либо что-то другое), а так же значение, которое нужно блокировать.

actionструктура, описывающая действие, возникающее при выдачи всеми фильтрами значения true.

В нашей задаче будем использовать FWP_ACTION_BLOCK

rawContext Доступно, когда фильтр не имеет контекстной информации провайдера.

Filter Context Identifiers - список доступных значений.

providerContextKey Доступно, когда фильтр имеет контекстной информации провайдера.

Built-in Provider Context Identifiers - список доступных значений.

Reserved Запасной параметр для системного пользования.

filterId уникальный идентификатор фильтра

effectiveWeight структура, содержащая вес фильтра.

Добавим созданный фильтр при помощи метода FwpmFilterAdd0

DWORD WINAPI FwpmFilterAdd0(

__in HANDLE engineHandle,

__in const FWPM_FILTER0 *filter,

__in_opt SECURITY_DESCRIPTOR sd,

__out_opt UINT64 *id

);

где:

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

filter добавляемый фильтр

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

id уникальный идентификатор фильтра

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

И, наконец, необходимо закрыть сеанс. Для этого воспользуемся методом FwpmEngineClose0

DWORD WINAPI FwpmEngineClose0(

__in HANDLEengineHandle

);

где:

engineHandle переменная, использованная для открытия сессии.

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

Для отключения фильтра используется функция FwpmFilterDeleteById0

DWORD WINAPI FwpmFilterDeleteById0(

__in HANDLE engineHandle,

__inUINT64id

);

где:

engineHandle переменная, использованная для открытия сессии,

id уникальный идентификатор фильтра, который нужно отключить.

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

Для удаления созданного подуровня существует метод FwpmSubLayerDeleteByKey0

DWORD WINAPI FwpmSubLayerDeleteByKey0(

__in HANDLE engineHandle,

__in constGUID *key

);

где:

engineHandle переменная, использованная для открытия сессии,

key Уникальный идентификатор подуровня (GUID), который хотим удалить.

Инструкция

Запуск программы.

Для начала работы нужно запустить приложение PracticGUI. При запуске программы необходимо запускать ее с правами администратора. Так же необходимо, чтобы файлы ConsoleFilter.exe и PracticGUI.exe находились в папке "C:\Program Files\Filter", иначе графическая оболочка закончит работу автоматически. При запуске графической оболочки консольное приложение начнет работу. Работа графической оболочки и консольного приложения изображены на рисунках 1 и 2.

Рисунок 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 Прототипы

void AddAllFilters(GUID subLayerGUID, HANDLE engineHandle);

UINT64 AddFilter(GUID subLayerGUID, HANDLE engineHandle, UINT32 cond, char * str);

void AddFilter(GUID subLayerGUID, HANDLE engineHandle, GUID guid);

void DelFilter(HANDLE engineHandle);

void DelFilter(HANDLE engineHandle, GUID ID);

void DelSubLayer(HANDLE engineHandle, GUID _idSubLayer);

void CloseSeans(HANDLE engineHandle);

void AutoStart();

#pragma endregion

void _tmain(int argc, char* argv[])

{

DWORD result;//Результат произведенной операции. В случае успеха Error_Success

HANDLE engineHandle = NULL;//Основной двигатель процесса

#pragma region Открытие сеанса

result = FwpmEngineOpen0(

NULL,

RPC_C_AUTHN_WINNT,

NULL,

NULL,

&engineHandle);

if(result != ERROR_SUCCESS)

{

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

system("pause");

return;

}

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

#pragma endregion

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

//GUID {6AE8A860-A30E-4253-80A1-C1807E17AAFC}

GUID subLayerGUID = { 0x6ae8a860, 0xa30e, 0x4253, { 0x80, 0xa1, 0xc1, 0x80, 0x7e, 0x17, 0xaa, 0xfc } };

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

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

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

if(result!=ERROR_SUCCESS)

{

mySubLayer=new FWPM_SUBLAYER0();

mySubLayer->subLayerKey = subLayerGUID;

mySubLayer->flags = FWPM_SUBLAYER_FLAG_PERSISTENT;

mySubLayer->weight=0x01;

mySubLayer->displayData.description=L"Sublayer";

mySubLayer->displayData.name=L"Sublayer";

result = FwpmSubLayerAdd0(engineHandle,mySubLayer,NULL);

if(result != ERROR_SUCCESS)

{

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

CloseSeans(engineHandle);

return;

}

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

}

else

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

#pragma endregion

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

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

{

//Добавляем новые основные фильтры

AddAllFilters(subLayerGUID,engineHandle);

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

}

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

{

AutoStart();

//GUID {1C046A9A-9187-4629-8184-24836DFE5EEB}

GUID allFilterGUID = { 0x1c046a9a, 0x9187, 0x4629, { 0x81, 0x84, 0x24, 0x83, 0x6d, 0xfe, 0x5e, 0xeb } };

//Добавляем вспомогательный фильтр

AddFilter(subLayerGUID, engineHandle,allFilterGUID);

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

DelFilter(engineHandle);

//Добавляем новые основные фильтры

AddAllFilters(subLayerGUID,engineHandle);

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

//Удаляем вспомогательный фильтр

DelFilter(engineHandle,allFilterGUID);

}

#pragma endregion

CloseSeans(engineHandle);

return;

}

//Добавление массива фильтров

void AddAllFilters(GUID subLayerGUID, HANDLE engineHandle)

{

DWORD result = NULL;

#pragma region Подсчет каждого вида условий

char *buf = new char[bufSize];//Буфер для хранения считанной строки

int ipCount=0,//Количество условий по IP

portCount=0,//Количество условий по порту

appCount=0;//Количество условий по приложениям

//Считываем из БД

FILE *f = fopen("C:\\Program Files\\Filter\\BlockList.iff","r");

if(!f)

{

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

return;

}

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

fgets(buf,bufSize,f);

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

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

if(!filterFile)

{

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

return;

}

UINT64 filterID=NULL;

printf("Blocked all traffik: %s.\n",buf);

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

{

filterID = AddFilter(subLayerGUID,engineHandle,0,"All");

if(filterID!=-1)

fprintf(filterFile,"%d\n",filterID);

fclose(filterFile);

fclose(f);

return;

}

//Считываем пустую строку

fgets(buf,bufSize,f);

int n=1;//Счетчик пустых строк

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

while(!feof(f))

{

fgets(buf,bufSize,f);

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

if(feof(f))

break;

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

if(buf[0]=='\0')

{

n++;

continue;

}

switch (n)

{

case 1: ipCount++; break;

case 2: portCount++; break;

case 3: appCount++; break;

default: break;

}

}

printf("\nIP %d\nPort %d\nApplications %d\n\n",ipCount,portCount,appCount);

if(ipCount+portCount+appCount==0)

{

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

return;

}

#pragma endregion

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

fseek(f,0,SEEK_SET);

fgets(buf,bufSize,f);//Пропускаем строку, содержащую значение флага, показывающего блокировать всё или нет

fgets(buf,bufSize,f);//Пропускаем первую пустую строку

int i;//счетчик циклов

UINT32 buffer=0;//буфер для считывания

//Блокировка по IP

for(i=0; i < ipCount; i++)

{

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

filterID = AddFilter(subLayerGUID,engineHandle,buffer,"IP");

if(filterID!=-1)

fprintf(filterFile,"%d\n",filterID);

}

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

//Блокировка по порту

for(i=0; i < portCount; i++)

{

fscanf(f,"%d",&buffer);//cчитываем i-ый порт БД

filterID = AddFilter(subLayerGUID,engineHandle,buffer,"Port");

if(filterID!=-1)

fprintf(filterFile,"%d\n",filterID);

}

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

//Блокировка по приложениям

for(i=0; i < appCount; i++)

{

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

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

filterID = AddFilter(subLayerGUID,engineHandle,0,buf);

if(filterID!=-1)

fprintf(filterFile,"%d\n",filterID);

}

fclose(filterFile);

fclose(f);

#pragma endregion

}

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

UINT64 AddFilter(GUID subLayerGUID, HANDLE engineHandle, UINT32 cond, char * str)

{

DWORD result = NULL;

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

FWPM_FILTER0_ myFilter={0};

UINT64 id=NULL;

RtlZeroMemory(&myFilter,sizeof(myFilter));

FWPM_FILTER_CONDITION0 condition;

myFilter.action.type= FWP_ACTION_BLOCK;

myFilter.subLayerKey = subLayerGUID;

myFilter.weight.type = FWP_EMPTY;

myFilter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4;

myFilter.displayData.description=L"Filter";

myFilter.displayData.name=L"Filter";

if(str=="All")

{

myFilter.numFilterConditions = 0;

printf("Added all blocked filter.\n");

}

else

{

myFilter.numFilterConditions = 1;

myFilter.filterCondition = &condition;

if(str=="IP")

{

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

addr.addr=cond;

addr.mask=0xffffffff;

printf("Added IP: %d\n",addr.addr);

condition.fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS;

condition.matchType=FWP_MATCH_EQUAL;

condition.conditionValue.type=FWP_V4_ADDR_MASK;

condition.conditionValue.v4AddrMask = &addr;

}

else

{

if(str=="Port")

{

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

printf("Added port: %d\n",port);

condition.fieldKey = FWPM_CONDITION_IP_REMOTE_PORT;

condition.matchType=FWP_MATCH_EQUAL;

condition.conditionValue.type=FWP_UINT16;

condition.conditionValue.uint16=port;

}

else

{

wchar_t *app = new wchar_t[bufSize];

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

FWP_BYTE_BLOB *applicationID = NULL;

result = FwpmGetAppIdFromFileName0(app,&applicationID);

if(result != ERROR_SUCCESS)

{

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

return -1;

}

printf("Added application: %s\n",str);

condition.fieldKey = FWPM_CONDITION_ALE_APP_ID;

condition.matchType=FWP_MATCH_EQUAL;

condition.conditionValue.type=FWP_BYTE_BLOB_TYPE;

condition.conditionValue.byteBlob=applicationID;

}

}

}

#pragma endregion

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

result = FwpmFilterAdd0(engineHandle,&myFilter,NULL,&id);

if(result != ERROR_SUCCESS)

{

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

return -1;

}

#pragma endregion

return id;

}

//Добавление вспомогательного фильтра на подуровень

void AddFilter(GUID subLayerGUID, HANDLE engineHandle, GUID guid)

{

DWORD result = NULL;

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

FWPM_FILTER0_ myFilter={0};

RtlZeroMemory(&myFilter,sizeof(myFilter));

myFilter.action.type= FWP_ACTION_BLOCK;

myFilter.subLayerKey = subLayerGUID;

myFilter.weight.type = FWP_EMPTY;

myFilter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4;

myFilter.displayData.description = L"Secondary filter";

myFilter.displayData.name = L"Secondary filter";

myFilter.filterKey = guid;

myFilter.numFilterConditions = 0;

#pragma endregion

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

result = FwpmFilterAdd0(engineHandle,&myFilter,NULL,NULL);

if(result != ERROR_SUCCESS)

printf("Secondary filter added failed with error: %d\n\n",result);

else

printf("Secondary filter added successfully!\n");

#pragma endregion

}

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

void DelFilter(HANDLE engineHandle)

{

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

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

if(!filterFile)

{

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

return;

}

UINT64 id = NULL;

DWORD result = NULL;

while(!feof(filterFile))

{

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

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

if(feof(filterFile))

break;

if(id==0)

continue;

result = FwpmFilterDeleteById0(engineHandle,id);

if(result!=ERROR_SUCCESS)

printf("Filter (ID=%d) close failed with error: %s\n",id,result);

}

fclose(filterFile);

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

#pragma endregion

}

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

void DelFilter(HANDLE engineHandle, GUID ID)

{

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

DWORD result = FwpmFilterDeleteByKey0(engineHandle,&ID);

if(result != ERROR_SUCCESS)

{

if(result == FWP_E_FILTER_NOT_FOUND)

printf("Secondary filter doesn't exist.\n");

else

printf("Secondary filter closed failed with error: %d\n",result);

return;

}

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

#pragma endregion

}

//Удаление подуровня

void DelSubLayer(HANDLE engineHandle, GUID _idSubLayer)

{

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

DWORD result = FwpmSubLayerDeleteByKey0(engineHandle,&_idSubLayer);

if(result != ERROR_SUCCESS)

printf("SubLayer closed failed with error: %d\n",result);

else

printf("SubLayer closed successfully!\n");

#pragma endregion

}

//Закрытие сеанса

void CloseSeans(HANDLE engineHandle)

{

#pragma region Закрытие сеанса

DWORD result = FwpmEngineClose0(engineHandle);

if(result != ERROR_SUCCESS)

printf("Engine close failed with error: %d\n",result);

else

printf("Engine closed successfully!\n");

system("pause");

#pragma endregion

}

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

void AutoStart()

{

#pragma region Запись в автозапуск

DWORD result=NULL;

HKEY hKey = NULL;

result = RegCreateKeyEx(HKEY_LOCAL_MACHINE,

L"Software\\Microsoft\\Windows\\CurrentVersion\\Run",

NULL,

NULL,

REG_OPTION_VOLATILE,

KEY_ALL_ACCESS,

NULL,

&hKey,

NULL);

if(result!=ERROR_SUCCESS)

printf("Open failed with error: %d\n",result);

else

{

byte * buf = new byte[100];

buf = (LPBYTE)L"\"C:\\Program Files\\Filter\\ConsoleFilter.exe\"";

result = RegSetValueEx(hKey,

L"ConsoleFilter.exe",

NULL,

REG_SZ,

buf,

100);

if(result!=ERROR_SUCCESS)

printf("Add failed with error: %d\n",result);

result = RegCloseKey(hKey);

if(result!=ERROR_SUCCESS)

printf("Close failed with error: %d\n",result);

}

#pragma endregion

}

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

using System;

using ADOX;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;using System.Text;

using System.Windows.Forms;

using System.IO;

namespace PracticGUI

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

label6.Enabled = false;

string path = FileAdress;

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

{

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

try

{

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

{

sw.WriteLine("false");

sw.WriteLine("");

sw.WriteLine("");

sw.WriteLine("");

}

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = FilterAdress;

proc.StartInfo.Arguments = "Yes";

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

proc.Close();

}

catch (Exception ex)

{

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

Application.Exit();

return;

}

}

else

{

try

{

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = FilterAdress;

proc.StartInfo.Arguments = "Yes";

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

proc.Close();

}

catch (Exception ex)

{

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

Application.Exit();

return;

}

}

}

int reboot = 0;//Проверка были ли изменения в файле со списком фильтров

string FileAdress = "BlockList.iff", //Файл в который сохраняет список фильтров

FilterAdress = "ConsoleFilter.exe";//Консольное приложение для работы с фильтрами

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

private void changeState(bool flag)

{

if (flag)

{

panel1.Visible = false;

panel2.Visible = true;

textBox1.Text = "";

}

else

{

panel1.Visible = true;

panel2.Visible = false;

}

}

private void label1_Click(object sender, EventArgs e)

{

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

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

{

AddNewCondition("All", "false");

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

}

else

{

AddNewCondition("All", "true");

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

}

}

private void label2_Click(object sender, EventArgs e)

{

changeState(true);

label6.Text = "Input IP-address";

}

private void label3_Click(object sender, EventArgs e)

{

changeState(true);

label6.Text = "Input port";

}

private void label4_Click(object sender, EventArgs e)

{

changeState(true);

label6.Text = "Choose necessary program";

label6.BorderStyle = BorderStyle.FixedSingle;

label6.Enabled = true;

}

private void label5_Click(object sender, EventArgs e)

{

string addr = textBox1.Text;

#region Add/Delete IP

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

{

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

{

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

return;

}

addr.Trim();

int n = 0,//Количество символов в блоках адреса (между точками)

nDot = 0;//Количество точек в адресе

int[] array = new int[4];//Массив, содержащий блоки адреса. Для фильтрации лишних нулей

for (int i = 0; i < addr.Length; i++)

{

char ch = addr[i];

if (ch >= 0x30 && ch <= 0x39)

{

n++;

if (n > 3)

{

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

return;

}

continue;

}

if (ch == '.' || ch == ',')

{

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

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

{

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

return;

}

if (n == 3)

{

int a = Convert.ToInt32(addr.Substring(i - n, n));

if (a > 255)//Блок больше 255

{

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

return;

}

}

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

n = 0;

nDot++;

continue;

}

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

return;

}

if (nDot != 3)

{

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

return;

}

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

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

addr = "";

for (int i = 0; i < 4; i++)

{

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

else addr += Convert.ToString(array[i], 16);

}

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

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

{

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

{

//Добавление IP-адреса в файл

AddNewCondition("IP", addr);

}

else

{

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

return;

}

}

else

{

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

{

//Удаление IP-адреса из файла

DeleteCondition("IP", addr);

}

else

{

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

return;

}

}

}

#endregion

#region Add/Delete Port

int _a;

if (label6.Text == "Input port")

{

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

{

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

return;

}

foreach (char ch in addr)

{

if (ch >= 0x30 && ch <= 0x39)

continue;

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

return;

}

_a = Convert.ToInt32(addr);

if (_a < 1)

{

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

return;

}

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

{

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

{

//Добавление порта в файл

AddNewCondition("Port", addr);

}

else

{

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

return;

}

}

else

{

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

{

//Удаление порта из файла

DeleteCondition("Port", addr);

}

else

{

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

return;

}

}

}

#endregion

#region Add/Delete Programm

if (label6.Text == "Choose necessary program")

{

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

{

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

return;

}

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

{

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

{

//Добавление программы в файл

AddNewCondition("Programm", textBox1.Text);

}

else

{

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

return;

}

}

else

{

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

{

//Удаление программы из файла

DeleteCondition("Programm", textBox1.Text);

}

else

{

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

return;

}

}

textBox1.ReadOnly = false;

label6.BorderStyle = BorderStyle.None;

}

#endregion

changeState(false);

label6.Enabled = false;

}

private void label7_Click(object sender, EventArgs e)

{

changeState(false);

textBox1.ReadOnly = false;

label6.BorderStyle = BorderStyle.None;

label6.Enabled = false;

}

private void label8_Click(object sender, EventArgs e)

{

ShowCondition();

}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

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

{

var 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);

if (result == DialogResult.Yes)

{

try

{

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = FilterAdress;

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

proc.Close();

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

}

catch (Exception ex)

{

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

}

}

}

}

private void label9_Click(object sender, EventArgs e)

{

try

{

System.Diagnostics.Process proc = new System.Diagnostics.Process();

proc.StartInfo.FileName = FilterAdress;

proc.StartInfo.Arguments = "Yes";

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

proc.Close();

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

reboot = 0;

}

catch (Exception ex)

{

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

}

}

private void label6_Click(object sender, EventArgs e)

{

//Выбор программы для добавления\удаления

textBox1.Visible = true;

OpenFileDialog openFile = new OpenFileDialog();

openFile.Filter = "exe files (*.exe) | *.exe";

if (openFile.ShowDialog() == DialogResult.OK)

{

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

textBox1.ReadOnly = true;

}

}

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

private string IPtoInfo(string IP16)

{

string IP10 = "", str = "";

int aa = 0;

IP16 = Convert.ToString(Convert.ToInt64(IP16, 10), 16);

if (IP16.Length == 7) IP16 = "0" + IP16;

for (int i = 0; i < 8; i += 2)

{

str = IP16.Substring(i, 2);

IP10 += Convert.ToInt32(str, 16).ToString();

if (aa < 3)

{

IP10 += ".";

}

aa++;

}

return IP10;

}

//Добавление нового условия в файл

private void AddNewCondition(string column, string addr)

{

int num = 0;

switch (column)

{

case "All": num = 0; break;

case "IP": num = 1; break;

case "Port": num = 2; break;

case "Programm": num = 3; break;

}

List<string> ListOfCondititon = new List<string>();

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

int i = 0;

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

{

foreach (string s in lines)

{

if (i == 0)

{

ListOfCondititon.Add(addr);

i++;

}

else

{

ListOfCondititon.Add(s);

}

}

File.WriteAllLines(FileAdress, ListOfCondititon);

reboot = 1;

return;

}

//Добавление нового условия

foreach (string s in lines)

{

if (s == "")

{

if (num == 0)

{

ListOfCondititon.Add(addr);

}

num -= 1;

}

++i;

ListOfCondititon.Add(s);

}

if (column == "Programm")

{

ListOfCondititon.Add(addr);

}

File.WriteAllLines(FileAdress, ListOfCondititon);

reboot = 1;

}

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

private bool CheckCondition(string addr)

{

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

foreach (string s in lines)

{

if (addr == s)

{

return true;

}

}

return false;

}

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

private void DeleteCondition(string column, string addr)

{

List<string> ListOfCondititon = new List<string>();

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

foreach (string s in lines)

{

if (addr != s)

{

ListOfCondititon.Add(s);

}

}

File.WriteAllLines(FileAdress, ListOfCondititon);

reboot = 1;

}

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

private void ShowCondition()

{

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

string message = "";

List<string> ListOfCondititon = new List<string>();

string[] lines = File.ReadAllLines(FileAdress);//Считывание списка фильтров построчно

if (lines[0] == "true")

{

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

return;

}

message += "List of IP-addresses:\n";

foreach (string s in lines)

{

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

{

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

{

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

}

else

{

message += s + "\n";

}

if (s == "")

{

m++;

switch (m)

{

case 3: message += "List of Ports:\n"; break;

case 4: message += "List of Programms:\n"; break;

case 5: break;

}

}

}

else

{

m++;

}

}

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

return;

}

}

}

Размещено на Allbest.ru


Подобные документы

  • Ознакомление с основными правилами работы с изображением в программе Illustrator. Применение художественных (Artistic, Brushl Strokes) и мозаичных (Pixelate) фильтров для редактировании рисунка. Добавление текстуры в изображение при помощи группы Texture.

    контрольная работа [25,2 K], добавлен 12.09.2010

  • Разработка программного средства в среде MS Access, содержащего функции электронной библиотеки и которое обеспечивает удобное добавление, удаление, редактирование данных. Руководство пользователя и проверка правильности работы разработанной системы.

    курсовая работа [4,0 M], добавлен 23.02.2011

  • Разработка программы, моделирующей работу библиотеки. Функция поиска по базе книг и граждан, записанных в библиотеку. Поиск книги. Добавление или удаление абонента. Текст программы на С#. Просмотр списка должников. Запись книги на абонента в программе.

    курсовая работа [426,9 K], добавлен 20.02.2014

  • Microsoft PowerPoint 2007 и его новые возможности. Принципы планирования презентации. Присвоение имени и сохранение презентации. Добавление и удаление слайдов. Добавление и форматирование текста, маркированных списков. Добавление клипа, рисунков SmartArt.

    методичка [2,3 M], добавлен 16.03.2011

  • Разработка критериев оценки экрана веб-приложений. Основные подходы к защите веб-приложений. Анализ российских нормативных документов. Зарубежная практика выбора экрана веб-приложений. Разработка и обоснование общих требований к механизмам защиты.

    дипломная работа [68,7 K], добавлен 04.08.2016

  • Типы ограничений, поддерживающие целостность в реляционной модели данных. Определение значения поля первичного ключа с помощью генератора. Добавление, изменение и удаление записей в таблицу базы данных "Библиотека" на языке программирования SQL.

    лабораторная работа [30,5 K], добавлен 10.10.2012

  • Разработка приложения, которое содержит данные об экспонатах и выставках. Создание базы данных и добавление элемента с информацией в любую позицию списков. Добавление и удаление экспонатов с выставки. Сохранение всех списков в файлы, составление отчета.

    курсовая работа [1,2 M], добавлен 02.07.2014

  • Разработка блок-схемы алгоритмов и комплексного программного обеспечения для контроля работоспособности антивируса и межсетевого экрана. Исследование средств защиты компьютеров от вирусов, анализ и характеристика средств защиты межсетевого взаимодействия.

    курсовая работа [2,8 M], добавлен 07.11.2021

  • Разработка программного обеспечения для работы с информацией и ее обработкой на языке программирования Delphi. Описание алгоритмов процедуры работы со стеком - добавление, удаление элементов, редактирование записи. Инструкция по использованию программы.

    курсовая работа [2,9 M], добавлен 06.02.2013

  • Разработка и анализ функциональной модели деятельности предприятия. Создание базы справочника. Использование трансферов для передачи данных между клиентом и сервером. Требования для работы приложения. Добавление, изменение, хранение и удаление данных.

    курсовая работа [396,4 K], добавлен 26.10.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.