ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° мСТсСтСвого экрана для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с использованиСм Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ WFP

ΠšΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Для добавлСния ΠΈΠ»ΠΈ удалСния Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ (Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚) IP-адрСс ΠΈΠ»ΠΈ ΠΏΠΎΡ€Ρ‚, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ Block/Unblock by IP-adress ΠΈΠ»ΠΈ Block/Unblock by port (Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 7 ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° панСль добавлСния/удалСния IP-адрСса). ΠŸΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ появится панСль для Π²Π²ΠΎΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ IP-адрСса ΠΈΠ»ΠΈ ΠΏΠΎΡ€Ρ‚Π°, Π²Ρ‹Π±ΠΎΡ€Π° дСйствия Add ΠΈΠ»ΠΈ Delete ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ панСль Back… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° мСТсСтСвого экрана для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ с использованиСм Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ 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

);

Π³Π΄Π΅:

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 FilesFilter», ΠΈΠ½Π°Ρ‡Π΅ графичСская ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ автоматичСски. ΠŸΡ€ΠΈ запускС графичСской ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ‡Π½Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ. Π Π°Π±ΠΎΡ‚Π° графичСской ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Ρ‹ Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ°Ρ… 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/54 421/)

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ консольного прилоТСния

#include «stdafx.h»

#include

#include

#include

#include

#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: %dn», result);

system («pause»);

return;

}

printf («Engine Opened successfully! n»);

#pragma endregion

#pragma region Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ подуровня

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

GUID subLayerGUID = { 0x6ae8a860, 0xa30e, 0×4253, { 0×80, 0xa1, 0xc1, 0×80, 0x7e, 0×17, 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=0×01;

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: %dn», 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, 0×9187, 0×4629, { 0×81, 0×84, 0×24, 0×83, 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]='';

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," %dn", 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]='';

if (buf[0]=='')

{

n++;

continue;

}

switch (n)

{

case 1: ipCount++; break;

case 2: portCount++; break;

case 3: appCount++; break;

default: break;

}

}

printf («nIP %dnPort %dnApplications %dnn», 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," %dn", 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," %dn", filterID);

}

fgets (buf, bufSize, f);//Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π΅ΠΌ ΠΏΡƒΡΡ‚ΡƒΡŽ строку

//Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΏΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ

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

{

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

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

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

if (filterID≠-1)

fprintf (filterFile," %dn", 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: %dn», 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: %dn», 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.nn», str, result);

return -1;

}

printf («Added application: %sn», 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: %dnn», 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: %dnn», 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: %sn», 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: %dn», 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: %dn», 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: %dn», 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: %dn», 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: %dn», result);

result = RegCloseKey (hKey);

if (result≠ERROR_SUCCESS)

printf («Close failed with error: %dn», 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 >= 0×30 && ch <= 0×39)

{

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 >= 0×30 && ch <= 0×39)

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 ListOfCondititon = new List ();

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 ListOfCondititon = new List ();

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 ListOfCondititon = new List ();

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;

}

}

}

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ