фильтрация трафика для приложения. WFP user mode
От: fwd_ex Россия  
Дата: 14.05.11 16:26
Оценка:
Разрабатываю сетевой фильтр использующий Windows Filtering Platform. Компилирую в Visual Studio 2010. Запускается в системе Windows 7 x32. Проблема — не удается заблокировать доступ в сеть для определенного приложения. При удалении условия фильтрации в котором указано приложение — программа фильтрует запросы в сеть для всех приложениях. Тут следует отметить следующий момент: вместо Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4 приходится установить Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4, иначе будет ошибка при добавлении фильтра. Заранее благодарен за ответы!

Код программы:

void main(){
cout << "Test firewall\n";
HANDLE hEngine=NULL;
DWORD dwFwAPiRetCode = ERROR_BAD_COMMAND;
//Initialization Engine
cout << "Create engine\n";
dwFwAPiRetCode=FwpmEngineOpen0(NULL, RPC_C_AUTHN_WINNT,NULL,NULL,&hEngine);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";

FWPM_SUBLAYER0 SubLayer = {0};

SubLayer.subLayerKey=subLayer_GUID;
SubLayer.displayData.name=SubLayer_name;
SubLayer.displayData.description=SubLayer_name;
SubLayer.flags=FWPM_SUBLAYER_FLAG_PERSISTENT;
SubLayer.weight=0x01;

cout << "Sublayer Add\n";
dwFwAPiRetCode=FwpmSubLayerAdd0(hEngine,&SubLayer,NULL);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";
else {
cout << " Error\n";
}

FWPM_FILTER0 Filter = {0};
FWPM_FILTER_CONDITION0 Condition[3];
memset(&Filter,0,sizeof(Filter));
Filter.action.type = FWP_ACTION_BLOCK;
Filter.subLayerKey = subLayer_GUID;
Filter.displayData.name = L"Test Sublayer";
Filter.weight.type = FWP_EMPTY;
Filter.layerKey=FWPM_LAYER_ALE_AUTH_CONNECT_V4 ;//FWPM_LAYER_INBOUND_TRANSPORT_V4
Filter.numFilterConditions=3; ///
Filter.filterCondition=Condition;

FWP_V4_ADDR_AND_MASK AddrMask;
//IP 192.168.2.1
AddrMask.addr=0xC0A80201;
AddrMask.mask=0xffffffff;

Condition[0].fieldKey=FWPM_CONDITION_IP_REMOTE_ADDRESS;
Condition[0].matchType=FWP_MATCH_EQUAL;
Condition[0].conditionValue.type=FWP_V4_ADDR_MASK;
Condition[0].conditionValue.v4AddrMask=&AddrMask;

UINT16 port_block;

port_block = 80;
Condition[1].fieldKey=FWPM_CONDITION_IP_REMOTE_PORT;
Condition[1].matchType=FWP_MATCH_EQUAL;
Condition[1].conditionValue.type=FWP_UINT16;
Condition[1].conditionValue.uint16=port_block;
 

FWP_BYTE_BLOB *applicationID=NULL;
dwFwAPiRetCode=FwpmGetAppIdFromFileName0(L"C:\\Program File\\Mozilla Firefox\\firefox.exe",&applicationID);
cout << "RETCODE FwpmGetAppIdFromFileName0: " << dwFwAPiRetCode << endl;
Condition[2].fieldKey=FWPM_CONDITION_ALE_APP_ID;
Condition[2].matchType=FWP_MATCH_EQUAL;
Condition[2].conditionValue.type=FWP_BYTE_BLOB_TYPE;
Condition[2].conditionValue.byteBlob=applicationID;
 
UINT64 filterId;
cout << "Add filter\n";
dwFwAPiRetCode = FwpmFilterAdd0(hEngine,&Filter,NULL,&filterId);
if (dwFwAPiRetCode==ERROR_SUCCESS) cout << "ERROR_SUCCESS\n";
else printf("Error code: %x \n",dwFwAPiRetCode);
 
cin.get();
 
cout << "Deleting filter\n";
FwpmFilterDeleteById0(hEngine,filterId);
cout << "Deleting Sublayer\n";
FwpmSubLayerDeleteByKey0(hEngine,&subLayer_GUID);
cout << "Close engine\n";
FwpmEngineClose0(hEngine);
cin.get();
}
wpf application filtering usermode
Re: фильтрация трафика для приложения. WFP user mode
От: fwd_ex Россия  
Дата: 15.05.11 11:17
Оценка:
Разобрался! проблема была в том, что параллельно был запущен KIS 2011. Он использует локальный прокси сервер, на который перенаправляет все соединения на USER MODE.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.