|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。& d$ _% ^0 F# c. j7 u: M, `
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593. g9 k! y# |0 U7 N- S9 x
/*: ]4 o- B7 z- k' `2 A
利用操作系统提供的API编写防火墙.
$ q3 b# G) E! }4 `, P该程序涉及到的API说明请访问微软的MSDN Library; {* l6 c* g# U" Q% p9 y) h
代码在C++ Builder 5编译通过
' G, L/ d" o& g; z如果您想和我交流请email:zzwinner@163.com
% i3 j& k7 D/ S) x' f; i# }& A*/# k; e' b7 [/ A# N8 B5 H; {" C
#pragma hdrstop
, l1 r* r0 h2 w( G3 i6 x9 N& `#include "windows.h"2 J. n2 O# E' h& ?- C8 E
#include "Fltdefs.h"
; f$ }5 J( Z0 @; L// 需要加载"iphlpapi.lib"0 u+ Y0 `) A4 o+ c% C4 q8 ~
//---------------------------------------------------------------------------6 F6 s5 J4 j; n
) x3 e: d; E( A) w% E
#pragma argsused9 ^& M! J' c7 T" _0 T
int main(int argc, char* argv[])
6 D( B" K8 C1 H) O8 _" k{* d- w6 c" w3 m$ z" x# W% R
// 一个创建网络包过滤接口- b0 E% Z# h, O
INTERFACE_HANDLE hInterface;
2 j. I# Y" B% b9 h# e PfCreateInterface(0,
$ p0 g% B. [* E7 m PF_ACTION_DROP,//PF_ACTION_FORWARD,' _# A# h z) V# v- f. j
PF_ACTION_DROP,//PF_ACTION_FORWARD, + f- o0 c% D0 l2 }6 @4 X2 I" i
FALSE,
4 E/ ]# _; @+ i. N6 { TRUE,
6 b) ~. n% v3 ~: x! Q& Q &hInterface);
^1 G8 b7 m& p
& ]1 a0 W3 N6 |% w4 z // 绑定需要网络包过滤的IP地址
4 s' i; R+ {9 n/ Y6 r BYTE localIp[] = {192,168,0,2};$ q5 d# o9 n* t' w$ `' A
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
. P& ^ S+ j" H+ ?+ {% D/ C4 v) B: } // 现在我们开始过滤HTTP协议的的接口
9 B1 B& G6 o, F) U FILTER_HANDLE fHandle;
$ ]) r- l6 ^3 g: v& p8 S; W0 a // 填充过滤包的规则结构3 X0 x0 c$ B; p
PF_FILTER_DESCRIPTOR inFilter;
2 o$ N6 w( N/ H& d* |- G7 }2 K inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值3 r$ ?7 m9 K h# v& X3 Y% D* F! w1 U
inFilter.dwRule = 0; //一直添这个值9 S! p& ~. u$ ]+ g
inFilter.pfatType = PF_IPV4; //用 ipV4 地址$ q! l7 `# u2 o2 S
inFilter.SrcAddr = localIp; //设置本地IP地址
& J/ W8 L9 P, h A1 p4 n0 ~. c/ @ inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
( o( p$ q/ O& z" n) v inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
% O K& P6 k0 E3 | I inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
! s! Y" L2 y" h5 B& U5 s% V( v5 b inFilter.DstAddr = 0; //任意目标地址
" w/ w7 X& i1 ] inFilter.DstMask = 0;+ U& }5 Y7 a% ]9 I. \3 Y) _
inFilter.wDstPort = 80; //目标端口 80(http 服务)* ^# f9 J0 ^- z: L; R1 M
inFilter.wDstPortHighRange = 80;
6 p5 z" B7 U4 }: z: T inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议& @ w4 X/ a" b0 N9 i5 ^) `' H
// 加入一个过滤接口
2 A: T* Q4 r E: x PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);, ^5 L# [( L5 H! z" m
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)% d! N/ |6 T; U
// 移除过滤接口
4 a6 t2 [$ l, }* G5 g: b H5 { PfRemoveFilterHandles(hInterface, 1, &fHandle);
' `* L# f; K0 ]6 c PfUnBindInterface(hInterface);6 V9 _" m+ L' s0 J* F
PfDeleteInterface(hInterface);3 r0 B% _% r' d9 w4 P% Z* Y- i5 K
return 0;: l& M/ E$ W4 A; O7 ^3 Z6 i
} |
|