|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
3 r6 b5 E$ k* \& {) s欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5934 U1 a' P$ L! M- o v! q
/** G" K$ [- k0 E
利用操作系统提供的API编写防火墙.
! c% T% s: ~- H- Z2 r, H# S该程序涉及到的API说明请访问微软的MSDN Library
7 v. ~) Q" V' u. O0 @代码在C++ Builder 5编译通过+ T6 g2 v- I: M+ ~* z! \+ J
如果您想和我交流请email:zzwinner@163.com
- V% Q* W+ p8 C; P/ L+ x*/
0 O6 q* r5 f7 V6 {+ _( F( \#pragma hdrstop
& [+ A: Z( E0 J0 L& |3 b#include "windows.h"- H, }4 x3 X7 p$ e
#include "Fltdefs.h"$ x7 @; a- _; R ? ?: c
// 需要加载"iphlpapi.lib"
9 d5 `# M {0 w( D( [//---------------------------------------------------------------------------. B: W* {/ U" @$ V& ^, v: ?
5 }" c5 L2 \8 P
#pragma argsused `) R6 J+ K: o3 |$ f: b) t
int main(int argc, char* argv[])) V& A+ j2 ]7 K) H
{
4 k, a* e v s, ?8 G! T // 一个创建网络包过滤接口
7 T3 s6 B8 }, {3 R. C5 X$ I INTERFACE_HANDLE hInterface;
3 s* Y5 P9 W% K& |* X9 P) |" x+ l9 j PfCreateInterface(0, , Z. g- l% V! }: j5 R0 ^
PF_ACTION_DROP,//PF_ACTION_FORWARD,$ S' [9 Q' a& X
PF_ACTION_DROP,//PF_ACTION_FORWARD,
$ }4 i$ t+ y4 i& L7 V FALSE, " C4 l# T6 _3 N1 T7 _
TRUE, & B& U5 v: f0 g! Z( e
&hInterface);
( [ U" K2 S! H% J3 _0 f
& w8 m: N. L+ g" B# i* @ // 绑定需要网络包过滤的IP地址
1 |; H3 ^# a4 a6 p' s# w W3 f BYTE localIp[] = {192,168,0,2};
& }% u# p2 [9 p2 L PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
, E% H% c2 p2 F3 x/ f+ Y; I9 j // 现在我们开始过滤HTTP协议的的接口+ k5 b- {5 W9 A9 | P( w5 Q! o
FILTER_HANDLE fHandle;
8 U0 L% U1 j+ U: \ // 填充过滤包的规则结构" C+ S3 @+ O& z% h) k$ K
PF_FILTER_DESCRIPTOR inFilter;9 V, `: Z! b6 T) J% v9 H
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值2 `; @* \+ Z; f( E
inFilter.dwRule = 0; //一直添这个值
! f( e0 Q6 `9 I J inFilter.pfatType = PF_IPV4; //用 ipV4 地址
% ^ t2 X9 F# E; M* t inFilter.SrcAddr = localIp; //设置本地IP地址
" G" ^: \% u. c# K( X inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
- m/ Y* D& q# l1 ^' b inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口9 w; T" V. b& [( y" S4 Q
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
- ~1 g0 `% s3 ?& Q5 Q9 b' a inFilter.DstAddr = 0; //任意目标地址4 c7 e5 x A( t) ?; r
inFilter.DstMask = 0;
! \" B, q* @6 L( g* m! O) d inFilter.wDstPort = 80; //目标端口 80(http 服务)
0 V/ _2 n' H& j0 X inFilter.wDstPortHighRange = 80;: N8 P% {* N0 k3 ?! M3 M" W- a0 w
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
/ ~) Z/ q: }' F // 加入一个过滤接口9 z; k2 r3 T. J4 ?1 O' J
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
( H+ a5 M- m3 C: K0 U6 H // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
3 [# U/ x- v' _" {0 F7 m // 移除过滤接口
/ z$ ^0 M+ W8 b1 C5 b( u PfRemoveFilterHandles(hInterface, 1, &fHandle);+ |8 d" Z) N: T$ |5 s8 V/ x" _
PfUnBindInterface(hInterface);& ~0 N& d# C$ i' P. w' |( y0 I
PfDeleteInterface(hInterface);
" H B j. l7 u2 B3 S5 G return 0; F5 ~+ S- M! {) {7 i, ~% H y
} |
|