|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。+ r/ @0 m7 s2 C8 K7 Y3 r+ A6 B
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
h( k+ L6 }9 t! l6 p/*/ Z! \) t% {+ `( ]# q) |& @0 Z
利用操作系统提供的API编写防火墙.
, \3 I, d$ `8 L8 g& c该程序涉及到的API说明请访问微软的MSDN Library. H2 W) D1 ]6 g$ f( ?) H+ K
代码在C++ Builder 5编译通过* P5 k: D$ M9 j2 Z, ?; V/ T) H! `
如果您想和我交流请email:zzwinner@163.com& z/ E ]+ o* n: S
*/2 u7 k! H% N. ^2 \& r# ~: y
#pragma hdrstop
& d/ b* M- ?: m3 ] c#include "windows.h"
: \+ Y" |- c+ M5 M4 J4 t#include "Fltdefs.h"( m: f% D) e0 E0 e. D
// 需要加载"iphlpapi.lib"
# o$ M1 s! k5 Z/ ^& h4 @8 d: g//---------------------------------------------------------------------------7 g( j3 z, t$ F5 [2 \' t
1 d( a) l- \, q9 y. A0 z* V0 E#pragma argsused8 J0 t- {, p) ~" U& x/ L
int main(int argc, char* argv[]) c- X% m# ?5 j
{
% N7 ?9 f& H+ E. u5 B // 一个创建网络包过滤接口
1 F$ T; z) o( P) a) N INTERFACE_HANDLE hInterface;
! |& ~6 K X& C: o3 ^% w! d1 l PfCreateInterface(0,
' e/ n! l) w1 b9 N/ [ f PF_ACTION_DROP,//PF_ACTION_FORWARD,
% u* d8 r, S1 A' C PF_ACTION_DROP,//PF_ACTION_FORWARD,
. j: y* M- Z$ A, |4 W8 e/ l. F1 X, D FALSE, ; Y6 S& n, X3 z2 \4 v* L1 h" N
TRUE,
" B) K, h/ W }; @) x &hInterface);2 g: K# v' I& X. Z3 e
8 m6 Y( @0 u6 o3 X
// 绑定需要网络包过滤的IP地址$ n8 _1 z" Y& C) p4 n# E& d
BYTE localIp[] = {192,168,0,2};
7 c' O8 j( y* }' k) C# f! e& ~ PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
7 L# x/ Y7 G, ?: W/ _( Z9 F // 现在我们开始过滤HTTP协议的的接口" F$ q/ I/ O0 `2 C; l
FILTER_HANDLE fHandle;! y5 \9 ?; k) M* S+ G
// 填充过滤包的规则结构
9 V. c( _9 G9 @$ M PF_FILTER_DESCRIPTOR inFilter; d/ \4 q7 b" z Y
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值4 \1 S& j9 N5 H, w; i
inFilter.dwRule = 0; //一直添这个值$ L) D o. U5 u' s, b# O
inFilter.pfatType = PF_IPV4; //用 ipV4 地址9 B5 a' G4 T. g: A& f
inFilter.SrcAddr = localIp; //设置本地IP地址: F Z: G) V# b+ ~9 j0 {# ^( @
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码: W. X' M. ?5 x( f4 D0 [, n
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
A" ]) c W, d inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
, k2 ?0 B, K( J1 T: Q9 `, r3 B inFilter.DstAddr = 0; //任意目标地址0 x& W# Z' J" ]3 r1 m% g- W
inFilter.DstMask = 0;
1 p$ J2 ^9 k# k" j* |- g inFilter.wDstPort = 80; //目标端口 80(http 服务)
' `# }9 Z$ U) {. e2 t6 a, e inFilter.wDstPortHighRange = 80;( G8 r {0 G5 T+ `$ \
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议 F0 x3 c- t' n& ]7 l" f
// 加入一个过滤接口0 U+ q: d, U4 B
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
+ i* _- b1 `& b; m9 w( m; S // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
5 H( L9 J' m, W( c3 ?8 |4 M* Y // 移除过滤接口' u! q, r# G t+ l9 Y
PfRemoveFilterHandles(hInterface, 1, &fHandle);
" S5 \) _& S; v; H# F PfUnBindInterface(hInterface);
: w" x4 |- B! G4 S5 Q) X+ v PfDeleteInterface(hInterface);
' [) F! Y6 p. H* h return 0;* q! z* C1 z0 @& N+ d) h
} |
|