|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。6 X. r3 M B: q" u' Q/ ]
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593 {6 {8 n4 J9 y8 t- t
/*
- B+ x3 @! y/ ^3 ]6 z利用操作系统提供的API编写防火墙.) O9 T& r3 R" s% G
该程序涉及到的API说明请访问微软的MSDN Library) ^( a' H* B. L9 } ?) R$ Q/ w: w
代码在C++ Builder 5编译通过8 U$ T( J+ R1 ~6 S2 A* o
如果您想和我交流请email:zzwinner@163.com
' g" {+ e1 w( L) F' J8 Y*/
2 z" l3 a* `" k( L6 D#pragma hdrstop
6 _7 h1 o( ~2 N L2 T! C#include "windows.h"
8 D, }. V8 ?8 N' f#include "Fltdefs.h"7 x' t2 f5 O+ y8 q& N
// 需要加载"iphlpapi.lib"( D C/ r$ v1 s0 V/ O) r$ N: ~* i
//---------------------------------------------------------------------------% s# A8 P- o& \3 _. [5 k7 m4 d
M) x4 }3 j1 Y* i5 D( {
#pragma argsused
3 u+ V" y/ S4 `$ t8 y/ mint main(int argc, char* argv[])
+ b; W a8 t) k& x6 Q% b+ T{
5 ~- Z( n6 `# C // 一个创建网络包过滤接口; d+ o, I4 q7 S1 G; Y
INTERFACE_HANDLE hInterface;6 N- n5 X) d" ?6 ~6 t
PfCreateInterface(0,
) L" `3 K: R4 T, }' `4 d PF_ACTION_DROP,//PF_ACTION_FORWARD,
7 `' g# p3 h! B( f! t H0 ?. x PF_ACTION_DROP,//PF_ACTION_FORWARD,
$ r4 q8 B5 p# e P/ d% i FALSE,
( i5 G7 r' r. \( D TRUE,
* Q J. E% r9 f+ ? &hInterface);$ X5 s+ z0 C( K6 x" A2 i6 L' Z
( m/ w D/ d3 N: ?8 Y // 绑定需要网络包过滤的IP地址) R/ {7 @3 g6 T2 R
BYTE localIp[] = {192,168,0,2};( ]/ e6 [: o* ^* b# A2 N
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);: B8 f% [) k. Q/ Y8 K7 V% g
// 现在我们开始过滤HTTP协议的的接口- m$ {% b2 m- b" a' c$ B% j
FILTER_HANDLE fHandle;+ b" f8 K2 ~4 Q; r3 s
// 填充过滤包的规则结构1 q% c; U( c" \0 w- x5 u
PF_FILTER_DESCRIPTOR inFilter;
9 K. z7 Z0 V' J) w4 m4 {/ v inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
) @8 ~$ S+ \1 @$ g, W1 ?! b inFilter.dwRule = 0; //一直添这个值1 M, P) F+ b% s% \; \: s( F
inFilter.pfatType = PF_IPV4; //用 ipV4 地址) ]1 ~. n- p* A6 u; o
inFilter.SrcAddr = localIp; //设置本地IP地址! l7 ]* {1 p. x/ k6 d# P
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码$ f0 c, z" S( v* _/ }9 {
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
, H1 c e8 k/ \* T1 C inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
/ H6 M7 {* @) h7 { inFilter.DstAddr = 0; //任意目标地址
, m4 i: m0 k, k7 { inFilter.DstMask = 0;
! @4 b6 A R( N inFilter.wDstPort = 80; //目标端口 80(http 服务)
+ \3 o% j! t% M: H1 i" w inFilter.wDstPortHighRange = 80;
% d9 b+ `4 J8 q7 P2 a% O inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议3 A+ k' P+ C' A( V. l+ C; Z
// 加入一个过滤接口0 c* V' @) N6 i
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);# p! h2 m2 K$ Q6 a4 z/ ]
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)6 {! G! ]) u" k9 L; ]: R$ p' p
// 移除过滤接口- z+ W" T" p1 o( ~" l
PfRemoveFilterHandles(hInterface, 1, &fHandle);& u0 B. U! o% X# S6 l- A
PfUnBindInterface(hInterface);) b" ]6 |: |4 c" I5 \
PfDeleteInterface(hInterface);% {5 I( Y4 D4 w2 ^ \. i
return 0;
# ~2 m0 k! m$ W/ f* n) O$ [8 y9 h} |
|