|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。' C7 `* e3 v2 B$ [% R: Q
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593& w" t5 ~( I4 {3 {1 L
/*
9 y. t# p$ O" o# w5 C0 D. h0 V利用操作系统提供的API编写防火墙.
7 P, m9 ?2 R$ J该程序涉及到的API说明请访问微软的MSDN Library6 {) m" i. @: ~. q& v
代码在C++ Builder 5编译通过; N. Q p E- v L M! x; @
如果您想和我交流请email:zzwinner@163.com
3 W, g7 R! C$ b9 ~( k |$ U3 ]. W7 W*/
4 c r: ], B- g#pragma hdrstop& E i, h3 y4 Z4 r; B$ r/ A
#include "windows.h"
0 \( Z+ v+ S5 B#include "Fltdefs.h"% {" Q; h* b" E F# W$ _
// 需要加载"iphlpapi.lib"& q" T3 z% a: ?2 u! D. `
//---------------------------------------------------------------------------- V1 R* r4 l6 G! I/ v
5 F/ A& u3 D, k- E" y#pragma argsused
4 k, V1 u: h8 ?5 sint main(int argc, char* argv[])
' ~* L; V$ b/ |{
& f6 X6 |1 k8 I // 一个创建网络包过滤接口
/ u% f9 e5 v1 b8 u/ U% e INTERFACE_HANDLE hInterface;
/ @! b4 R+ `1 S% c0 a PfCreateInterface(0, ) }( v: P9 N: E* h5 Q: a- L; T
PF_ACTION_DROP,//PF_ACTION_FORWARD,
* p& d$ |9 b Y3 n' U PF_ACTION_DROP,//PF_ACTION_FORWARD, $ I n0 ?% N0 y4 j0 Y0 M; o
FALSE, 6 D3 e% [4 z$ Z- o5 C0 \
TRUE, 7 A' v" A6 y7 G9 {: ^1 S
&hInterface);3 h/ f! [+ l1 q- _& y( k6 w4 V
; O4 c, [& d, j // 绑定需要网络包过滤的IP地址0 f5 U+ b8 D# H$ y
BYTE localIp[] = {192,168,0,2};3 U: C# u H) [) y `# ~. k( u
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
( G& E% ?1 f0 e% ^$ i: \' U0 B // 现在我们开始过滤HTTP协议的的接口
% d' G% i6 O- S$ G' a FILTER_HANDLE fHandle;
+ _/ c- a9 w' k- c. J" [( | // 填充过滤包的规则结构0 u) }% Z& [; D$ K/ O* H
PF_FILTER_DESCRIPTOR inFilter;
, H: ]( R0 m( m inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
& Y p' `7 X- |5 O3 I3 e inFilter.dwRule = 0; //一直添这个值, [6 J! B+ o5 I- c0 ]
inFilter.pfatType = PF_IPV4; //用 ipV4 地址" }, y, k, {- T# `
inFilter.SrcAddr = localIp; //设置本地IP地址
& b N) T: |8 b2 g" w. B, J$ ? inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码$ a {* r9 B, V0 K" v
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口* N2 r! \" t7 s
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;& h/ \5 d& |, O$ N3 }$ x
inFilter.DstAddr = 0; //任意目标地址4 ?9 v9 n s5 K) L
inFilter.DstMask = 0;% o, V" f& C( O7 q
inFilter.wDstPort = 80; //目标端口 80(http 服务)
. h/ S( I: }; l! | inFilter.wDstPortHighRange = 80;$ l/ ?1 \' a4 h) [8 q7 F
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议; e9 I# w7 W- b$ {
// 加入一个过滤接口
: d. c$ C* X- \) s, F PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);3 _0 L" O5 Q7 U% k& B
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)6 r/ _7 d; h1 q
// 移除过滤接口9 B) |: [$ ~) V! i
PfRemoveFilterHandles(hInterface, 1, &fHandle);3 m2 m" J E9 w$ o8 n
PfUnBindInterface(hInterface);
+ s' o# a4 @4 k2 a PfDeleteInterface(hInterface);
* }0 l) W8 Y' h6 y7 N2 G return 0;$ x4 @# f* a, E
} |
|