|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。$ R7 I9 a" x! J: p; p1 }0 i) k
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593% O" p- L9 F+ ~5 @/ K" }) B9 l
/*
& m+ x7 d+ k* K5 X8 O8 ~; Z5 \. z利用操作系统提供的API编写防火墙.
/ u. L+ h8 v7 n/ q/ w. M* A9 J该程序涉及到的API说明请访问微软的MSDN Library
9 l2 X" m# Y" w- V$ m代码在C++ Builder 5编译通过
1 Q& H/ Y5 \6 X如果您想和我交流请email:zzwinner@163.com
1 D' w+ v) r1 e0 _*/* c$ K9 d6 M. c! E$ A
#pragma hdrstop
; i6 d' i! v! q7 o# e4 h6 g#include "windows.h"( K% q3 B, l9 } e- E
#include "Fltdefs.h"
( b4 M$ a$ y4 x9 q! n// 需要加载"iphlpapi.lib", S' D! d$ I2 d0 w2 b6 z2 a* o
//---------------------------------------------------------------------------" ~; v+ N8 X! A6 u/ ~
! Z" Z8 C* ^+ V: @2 N3 k: Z) F
#pragma argsused# ?3 i# l9 G4 W- [- j* t
int main(int argc, char* argv[])
+ p9 _ }$ J, D' s" J9 D& h{2 N. \% H! N: G1 T
// 一个创建网络包过滤接口) @" {6 c6 _3 Y% U. c
INTERFACE_HANDLE hInterface;2 ^. P7 \; E4 i R3 n
PfCreateInterface(0,
+ e+ z6 c$ K% A- Y: |' J' k% e PF_ACTION_DROP,//PF_ACTION_FORWARD,
( q8 L! d3 ^! N" }/ l; [- [2 x PF_ACTION_DROP,//PF_ACTION_FORWARD,
2 C+ I: q0 X# T, m% R. J+ i4 }9 O FALSE, - }6 M" O! n+ z
TRUE, * { ~& k, I- ?% X7 _/ u3 Z& p
&hInterface);
9 x: W) X" L6 T5 ?* M
, I) x; Q" G1 b+ ? // 绑定需要网络包过滤的IP地址! Y+ s. y( x& }
BYTE localIp[] = {192,168,0,2};
9 J0 t5 ^* O/ O2 k; z7 B PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
K% |& r0 h& y3 i1 E // 现在我们开始过滤HTTP协议的的接口
d R0 i# c! _9 l1 q2 [5 y9 n FILTER_HANDLE fHandle;0 N0 ]; u) g* V/ V$ u6 J! }: I
// 填充过滤包的规则结构
8 J7 ~: d# l& Z' |" } j PF_FILTER_DESCRIPTOR inFilter;5 P8 \) P" l1 p$ Q+ w% Q& Y1 y
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值" c! ?4 q2 j% V5 r5 `
inFilter.dwRule = 0; //一直添这个值
8 L) C) F: h N! t7 A0 m2 z inFilter.pfatType = PF_IPV4; //用 ipV4 地址0 C# N+ ]9 V+ A3 P2 v2 i1 d& u
inFilter.SrcAddr = localIp; //设置本地IP地址2 r( k! K \/ \- C
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码9 x" l4 J0 w: A9 U9 V
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
, ~4 M+ d# `( a inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
5 t( G; K! ?* J7 Z- S) l inFilter.DstAddr = 0; //任意目标地址) O- d( E7 ~0 W Y2 R1 M
inFilter.DstMask = 0;9 h! C: E; H( M8 V9 N
inFilter.wDstPort = 80; //目标端口 80(http 服务)
+ \1 q! D3 u# ?# c" l inFilter.wDstPortHighRange = 80;' t8 X( r$ `! u; l
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议: z* S2 M% p! ^1 }2 a/ F
// 加入一个过滤接口7 s8 W: l0 H1 J
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);" q$ U6 ~4 _- r8 \5 Q0 h+ G7 W
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)& E( _ M% x5 ]- g( K3 j
// 移除过滤接口9 ?6 w* N6 W, P
PfRemoveFilterHandles(hInterface, 1, &fHandle);$ y& o* Q$ w: T4 k; u. _ Z
PfUnBindInterface(hInterface);: a( R+ C$ \- V8 C
PfDeleteInterface(hInterface); j2 C5 w+ i6 f' O0 u+ y# J
return 0;0 p( B/ B0 b% W, ^0 c$ ^# `( W
} |
|