|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
2 x/ E0 ]7 |3 L$ F" J欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
- S9 s+ F6 C, f7 ^/*
4 s5 p7 B. y2 {/ _3 v1 r利用操作系统提供的API编写防火墙.
7 S$ g2 h+ T8 m( C该程序涉及到的API说明请访问微软的MSDN Library* e" Q3 Q' n, S5 I( X
代码在C++ Builder 5编译通过
$ ^+ ?& z; ]2 x0 j8 h如果您想和我交流请email:zzwinner@163.com
1 o+ B8 d, u! E3 k+ x; n*/
( E" |2 Y/ g; }' d5 J* T#pragma hdrstop
3 A! N7 O% R5 `+ L#include "windows.h"& }! f6 C2 J9 m! a/ \
#include "Fltdefs.h"
4 x+ M- U5 q7 {// 需要加载"iphlpapi.lib"8 y! B/ T! o; E# d
//---------------------------------------------------------------------------
' s" R7 y6 f' E# R& P3 M+ }% Q6 z' j8 C, G+ z( A9 e! ~: q# G
#pragma argsused; E+ E2 c, J! {
int main(int argc, char* argv[]) ?8 q$ O6 ^+ T+ l1 `3 |
{
! ?3 ^, s0 d, J9 N3 ]6 I // 一个创建网络包过滤接口
% O2 F1 _+ O% B4 M; ?# g INTERFACE_HANDLE hInterface;
5 @0 S' B+ d* j3 g PfCreateInterface(0,
# B* T8 R) ~! p PF_ACTION_DROP,//PF_ACTION_FORWARD,% Y$ d( ^' Z# o) V5 T" Z/ t, @
PF_ACTION_DROP,//PF_ACTION_FORWARD,
[$ K8 T @+ c* e FALSE,
# ]1 M: g( L: }+ `/ N- ~1 E TRUE, $ g3 A: k4 b. J6 g3 c5 `: g
&hInterface);4 ?. V& }; H/ L" X; W& S& u
. O: X& j- ? }$ s0 w2 E7 u: b // 绑定需要网络包过滤的IP地址3 x. |" n C' {2 `9 y! o
BYTE localIp[] = {192,168,0,2};# y+ Q5 {- x- X2 Z' x% f
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
' z9 Z3 P( @- S0 Z( Y9 Q // 现在我们开始过滤HTTP协议的的接口" A% O& C& S1 P6 c2 T% M
FILTER_HANDLE fHandle;
, e0 T7 a* Q. |7 k" d // 填充过滤包的规则结构
6 y1 i& h) W8 C3 A7 @! z: H PF_FILTER_DESCRIPTOR inFilter;8 v3 t* i! r% Z
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值# J5 ], @9 W0 I: F/ @" E
inFilter.dwRule = 0; //一直添这个值 T2 l* Z# q$ y0 i, i
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
0 \" |/ Q3 d6 x' w- B) b inFilter.SrcAddr = localIp; //设置本地IP地址; X! t$ P% G+ A* Y- P* f
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码- J/ Q0 H2 X( D- ]0 b4 Q
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
! G" F z2 x+ P b/ | inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;( R6 [; q- x2 m* F9 N% a( `
inFilter.DstAddr = 0; //任意目标地址) L/ q" z6 N2 T7 M2 N7 Q4 z( A
inFilter.DstMask = 0;$ \8 C/ m% x2 ]3 ~- O
inFilter.wDstPort = 80; //目标端口 80(http 服务) z, m9 q% [9 b
inFilter.wDstPortHighRange = 80;3 O# A* d# _+ Y, S1 J2 o! R) t
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议8 G& ]9 B2 s4 C/ p X) \
// 加入一个过滤接口5 s' }8 p; @+ m
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);( {7 C" m% Q H' c& H7 X7 ~
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)! V/ D, T, V0 H0 x
// 移除过滤接口
+ D v. @' k" H% P$ [ PfRemoveFilterHandles(hInterface, 1, &fHandle);4 j7 G0 \ ?6 M: H8 r X
PfUnBindInterface(hInterface);
# o$ ^, V/ q& V5 n5 y PfDeleteInterface(hInterface);
2 M2 E9 X. ?, Y. n$ F2 T8 ?4 ` return 0;
% }( y1 t1 x! M2 k} |
|