|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。3 J9 H9 J! Q \. p! [
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593) a. E E' @2 N3 k' b, \5 {$ ^' {
/*
8 b' B2 w7 B) f( n7 g- s8 \# ?利用操作系统提供的API编写防火墙.
5 ~, B1 ?7 L4 P" i* }! Z1 D该程序涉及到的API说明请访问微软的MSDN Library9 n; }$ ]/ |2 i g3 p+ m7 J
代码在C++ Builder 5编译通过! Z1 m0 b8 i+ ?6 l
如果您想和我交流请email:zzwinner@163.com( }& V6 f0 {9 a3 D5 R" {
*/
7 G, M* ~% l/ k+ m0 V3 J#pragma hdrstop' i$ C+ e: n0 y3 X2 Z
#include "windows.h"
. h: Y+ d! y* l& Q a#include "Fltdefs.h"
. l: o$ z2 r. F// 需要加载"iphlpapi.lib"
/ K" e$ W o: ^: z+ }//---------------------------------------------------------------------------/ o, E6 A. e- d' u6 Z$ C1 s- w
7 p! l) M& U% [5 l4 ^#pragma argsused
6 |7 _8 p+ D- w" T" @% Qint main(int argc, char* argv[])
% {! T" u2 W, m: r# b{1 m& J8 ^( @1 R
// 一个创建网络包过滤接口# d( c; s- o6 K
INTERFACE_HANDLE hInterface;) q: r$ c! w$ R) y
PfCreateInterface(0,
1 {& v# ]% l( q9 t- o PF_ACTION_DROP,//PF_ACTION_FORWARD,: Z2 G7 j, }; W6 |% r" N
PF_ACTION_DROP,//PF_ACTION_FORWARD, 2 @; _6 @' Z! E' o4 J' B
FALSE, ; W* f2 |( W4 S
TRUE, ) T6 H" `7 Q1 b$ B- w ]' z
&hInterface);
0 t- c0 a& R k/ }$ i
$ k" H8 ~ L7 M // 绑定需要网络包过滤的IP地址. @$ U, z: P) Z6 r4 X
BYTE localIp[] = {192,168,0,2};" N/ s- t+ p3 {6 L
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
2 ~, A5 O% O+ c // 现在我们开始过滤HTTP协议的的接口" c6 \6 K# ]* m% H! `7 m% S. x
FILTER_HANDLE fHandle;
$ g; O. v0 [$ V& b- } c // 填充过滤包的规则结构
. f8 S! l& U8 `, V PF_FILTER_DESCRIPTOR inFilter;7 e2 ?9 Z* C8 J* H$ J; M$ Q
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值( R. S& B3 a: x8 E" o
inFilter.dwRule = 0; //一直添这个值
+ N- a0 h3 O1 W3 x" ?, c( L9 Y inFilter.pfatType = PF_IPV4; //用 ipV4 地址7 s) r9 c* I" P
inFilter.SrcAddr = localIp; //设置本地IP地址
2 N6 p- X' j9 K6 y" j; c8 `( G inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码% x' ~) @. i5 d
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口, a9 Z( X) U( s. @
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;5 `5 S& t' s3 c+ ^: l7 I( D
inFilter.DstAddr = 0; //任意目标地址
' ^& N, g% Y& J$ H. ?: u inFilter.DstMask = 0;% i# o' B1 V% K5 {
inFilter.wDstPort = 80; //目标端口 80(http 服务)0 W7 ~ T1 f2 a5 T8 G) ?( R
inFilter.wDstPortHighRange = 80;
$ _5 v! F5 X' d z inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议* z8 Q& t# t* g3 W+ h8 `' C
// 加入一个过滤接口
+ X, e. e7 n% { PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
( Q9 v. n+ r& [ // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
5 M. T8 i: }2 l( S9 l; K* Y5 n // 移除过滤接口
, j% i0 O& C& G3 i! `! s. f PfRemoveFilterHandles(hInterface, 1, &fHandle);
+ |3 k/ h. Z) ]; z PfUnBindInterface(hInterface);
& T! n: |8 u" G- K8 f2 M PfDeleteInterface(hInterface);& B% M5 l1 i) j) D* u6 q+ R5 r9 Z4 n
return 0;
' I: h1 B l. A3 \2 B: t} |
|