|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
, J8 H% C5 O% [. X0 c) t欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
0 Z4 V9 H% w$ h/ Z7 F9 a( E2 r/*
! D# v! d1 N9 d5 r, t利用操作系统提供的API编写防火墙.
) P. m: b5 w& ]8 X7 p0 V; L: T- e该程序涉及到的API说明请访问微软的MSDN Library
$ K, |1 {# d% V8 j% \$ v代码在C++ Builder 5编译通过
" j; R g' d7 j; N如果您想和我交流请email:zzwinner@163.com
/ _0 u% o) N2 E. N*/4 l! g' l, @! V, G/ `/ Z
#pragma hdrstop
* B$ R7 g' T6 R' f$ p; h2 H' e#include "windows.h", b/ V: I0 {- T; p/ L6 Y/ w& X$ M
#include "Fltdefs.h"! ^: y E e3 H2 e O8 h+ l E: V1 z
// 需要加载"iphlpapi.lib"4 S: U5 R6 E0 ^1 H. q
//---------------------------------------------------------------------------
, @9 b0 d* J# z; e0 M( F! _) R" u
. _. ]# M+ J) `5 x& q! {" \#pragma argsused
6 O9 T: g0 ^' Q2 V8 z6 G3 x4 i; |. C' i6 vint main(int argc, char* argv[])
" c; _; k+ q) c" L* K{
9 @* T& C( n6 f8 m // 一个创建网络包过滤接口
6 q) a3 w i; R* S. d INTERFACE_HANDLE hInterface;
1 w5 h4 _; }8 Q1 S( i PfCreateInterface(0,
' Z+ g7 z. {$ J4 e. P PF_ACTION_DROP,//PF_ACTION_FORWARD,
% M4 d' [) q6 h' H% H1 q PF_ACTION_DROP,//PF_ACTION_FORWARD,
0 X& m6 W( P2 \ FALSE,
" @1 M5 n/ S# b0 a TRUE,
/ e) N, W0 b$ ]9 \ &hInterface);# Q, y5 q+ P- L' `2 r7 k
4 d! `- H0 T+ D9 n" i" ^# u // 绑定需要网络包过滤的IP地址+ i7 R$ S$ e' r" v+ Z/ ]
BYTE localIp[] = {192,168,0,2};2 A2 M) S$ W4 t" U4 r @, Z+ }1 `% ~
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);6 v1 ]1 g. N+ ^# ?5 q
// 现在我们开始过滤HTTP协议的的接口
# b3 i8 r. `& |6 K FILTER_HANDLE fHandle;& H: S, o5 T. q! `) E; c6 B7 w
// 填充过滤包的规则结构( o3 o7 r2 p3 [0 o I" T0 Y* f
PF_FILTER_DESCRIPTOR inFilter;
( Q1 Y" f+ c- _& [. q- ]' { inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值* V& v% E' D7 M8 ~2 p2 m! W
inFilter.dwRule = 0; //一直添这个值
0 B" W! y# P4 Q1 L, Z0 f inFilter.pfatType = PF_IPV4; //用 ipV4 地址
1 I( E. b8 e; {2 e7 d+ y inFilter.SrcAddr = localIp; //设置本地IP地址 \, v/ R: A5 e% H
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
' W: C/ m, J* u+ u4 L inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口7 e5 P# M6 `7 |3 M& S: m
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
& e6 _. |/ C# E. k! p$ H& U+ k inFilter.DstAddr = 0; //任意目标地址
* o- `5 m# h1 t: f7 A8 O8 [ inFilter.DstMask = 0;
7 a% G" k' T {2 O7 e inFilter.wDstPort = 80; //目标端口 80(http 服务)# G, q9 ]2 f: E: u
inFilter.wDstPortHighRange = 80;9 I$ X9 t6 z$ I& Q
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议- ]) @/ t; ]' `3 F
// 加入一个过滤接口
+ a; {% _: H' B1 L$ U PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);1 }+ d% H( N5 L" L( h2 ?0 u
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
' R2 W/ h2 z( b) N2 F# S // 移除过滤接口' P- K/ A- l A9 H2 H# W0 }1 B0 s
PfRemoveFilterHandles(hInterface, 1, &fHandle);
5 Z0 M4 C* Z3 n& I' B8 \1 a8 W2 m PfUnBindInterface(hInterface);
7 R; l& d8 o/ p PfDeleteInterface(hInterface);
* p& z3 |/ O" e6 ?' c return 0;
( M2 ^7 r+ a# N: }} |
|