|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。7 I" l, R* W |2 j" t5 x
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593" f9 ]7 T! L$ C: B4 x
/*
8 a. T5 @" X& V" ~6 Y! u利用操作系统提供的API编写防火墙.: _0 _7 a2 n" N
该程序涉及到的API说明请访问微软的MSDN Library m- d& x2 W' a& o
代码在C++ Builder 5编译通过3 q' G4 h! p, E" F; M: N1 p$ G" d. R
如果您想和我交流请email:zzwinner@163.com
9 O2 h* e0 E6 @" g# I, X7 ]9 u*/: v0 S9 `! ` u8 h( A
#pragma hdrstop& V6 x- w( \/ l9 s
#include "windows.h"
" k6 M3 f9 b4 f9 {; f#include "Fltdefs.h"& F4 T- S' Q! ~+ U7 u4 n! h
// 需要加载"iphlpapi.lib"
' }- l& z, Q+ y! |6 a//---------------------------------------------------------------------------1 ]- J# E/ E; x+ w$ @9 I
) B, @- H k/ K) L* ~#pragma argsused
5 |& @7 \; V g+ y7 O+ Dint main(int argc, char* argv[])3 v: }. U% E9 ^8 M
{( \2 B0 U# l. \2 z! R
// 一个创建网络包过滤接口
) G* H( m% l. @3 O- S INTERFACE_HANDLE hInterface;% p2 Q% z+ s! \- J! A! d
PfCreateInterface(0, 2 ^' T: o3 Q* e! B3 j
PF_ACTION_DROP,//PF_ACTION_FORWARD,
0 x1 G+ f. K o1 q2 {6 M PF_ACTION_DROP,//PF_ACTION_FORWARD,
+ M' o. G! c H, H) @% h7 \0 p FALSE,
4 M+ n4 U& U1 y, q4 H; f6 k TRUE, , {9 _$ _% k! z
&hInterface);
3 \5 Q+ _# k1 b7 y
* ]. \" c) z5 W7 H7 j // 绑定需要网络包过滤的IP地址
, e5 C" h* I) V1 _/ J BYTE localIp[] = {192,168,0,2};
- h8 x- O% x0 y" ~: R* T4 a( ] PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
+ L7 a3 R/ e# u // 现在我们开始过滤HTTP协议的的接口
# n9 t7 l" M5 P FILTER_HANDLE fHandle;1 B% ^5 L' q3 d! I& F9 w9 Q, W
// 填充过滤包的规则结构
! Y! n1 D# S: S! h PF_FILTER_DESCRIPTOR inFilter;
' S, S1 w3 v1 S* c5 ~: \; m; Y inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
2 \6 i; H0 B& A5 A inFilter.dwRule = 0; //一直添这个值" L5 L: s1 q3 Y- ^
inFilter.pfatType = PF_IPV4; //用 ipV4 地址, \: I3 ]9 S/ b: H; D( ^
inFilter.SrcAddr = localIp; //设置本地IP地址# Z. g+ Y/ h j. i
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码+ U3 `4 H( f2 }& W5 c9 }
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口6 i3 ]( X4 {$ X5 ^, p- {) B
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;9 |* w8 J8 p1 E) U
inFilter.DstAddr = 0; //任意目标地址7 a9 T% f0 T2 m; f! q% ^9 k
inFilter.DstMask = 0;. C8 K" g, [' m( I8 y/ K
inFilter.wDstPort = 80; //目标端口 80(http 服务): @: c3 j; R5 K W
inFilter.wDstPortHighRange = 80;
$ G/ }- E& C4 a inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
, S% S) ^5 U! R/ _7 ` // 加入一个过滤接口
5 N! `' }( m" [ PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);6 G8 D6 b% U o6 L* T7 o J
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
3 C3 N6 d8 Z) ` // 移除过滤接口* A: X2 D( ?1 Z v4 S9 P. u3 M
PfRemoveFilterHandles(hInterface, 1, &fHandle);
' F) |" v8 O) @2 N; e5 }( D4 ` PfUnBindInterface(hInterface);4 p- p& {' U% f, t. h4 C/ M
PfDeleteInterface(hInterface);
9 X5 R- i$ @/ a4 H8 m return 0;
) p+ O/ h, D3 M1 e0 H} |
|