|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。4 f6 |3 X: L# @1 V; ^# D
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593. ?) V, Q2 a* f/ t1 j# ^* R4 [; b
/*
8 t. B& o* O7 H利用操作系统提供的API编写防火墙.2 F4 }' n8 a0 X M7 V$ E0 U
该程序涉及到的API说明请访问微软的MSDN Library
B4 g( k; T" | r" D# C: \9 W8 b代码在C++ Builder 5编译通过
& G5 [0 E) N% l! N0 q! Q2 V& n如果您想和我交流请email:zzwinner@163.com
" I K; l. r+ R/ L/ Z5 l: ]7 H*/
6 W8 n7 U- p2 o4 a6 E#pragma hdrstop
$ O& i# x2 O0 s- f#include "windows.h": b& j4 H6 L5 N2 \3 k
#include "Fltdefs.h", {3 |! p0 T) w8 W+ s1 s4 m
// 需要加载"iphlpapi.lib". I- Y) Z: s# L4 M% E6 S$ j
//---------------------------------------------------------------------------2 P1 j3 e# U6 l' Y' P, u
2 z2 P4 i5 r6 w
#pragma argsused6 x" | R- v0 V
int main(int argc, char* argv[])
) u/ J! G: v- ]& V% K; m; R6 T{
# z# F& n% H- O& Y/ ] // 一个创建网络包过滤接口
2 u( j% i+ x* s F0 A% i INTERFACE_HANDLE hInterface;
; x' J9 Q; l# D# v ~5 B! v* g PfCreateInterface(0, : l6 J; `& u5 P/ t
PF_ACTION_DROP,//PF_ACTION_FORWARD,
! {2 E4 y% e, Q: v" z PF_ACTION_DROP,//PF_ACTION_FORWARD, . Q$ E. f5 \; @4 N8 |
FALSE,
" [8 z7 k c5 [" z TRUE,
7 y# B( B6 m- t4 U* T4 E &hInterface);8 Q2 j2 `! w- A; \
; J$ T# r# Q7 n6 L3 M8 _& n) p
// 绑定需要网络包过滤的IP地址) Z5 A) ?" ^$ r/ c; p) s9 R
BYTE localIp[] = {192,168,0,2};3 T* J2 _0 t7 x& q1 F$ `" D
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);* A$ G+ v! P+ C; G0 o
// 现在我们开始过滤HTTP协议的的接口
6 a7 u o. @$ w1 @( n4 D H2 K( g% h FILTER_HANDLE fHandle;
4 ?1 c% }! c6 @1 @ ^! A. B // 填充过滤包的规则结构
; g4 y8 J* B: Y# w" f PF_FILTER_DESCRIPTOR inFilter;
" K& ~4 T5 s9 J& E inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值7 |5 o; j* I4 e; c x' ~
inFilter.dwRule = 0; //一直添这个值
) K$ }$ S/ u4 c6 y inFilter.pfatType = PF_IPV4; //用 ipV4 地址
7 N: I/ V6 V0 u L& x' d* x: ] inFilter.SrcAddr = localIp; //设置本地IP地址
& }& o* H! r$ {2 `9 m/ N inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码0 K, \; W6 }* a' t; d' p
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
' \2 x2 x" x' C7 ~- ?. U4 [# g inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;' I4 x% g3 N* W4 u+ N. s
inFilter.DstAddr = 0; //任意目标地址9 \: z# K# @; \0 R5 }7 l$ M3 x9 ~" O
inFilter.DstMask = 0;9 K3 u( k% U9 k a$ Q0 N
inFilter.wDstPort = 80; //目标端口 80(http 服务)( i+ ~, S0 l3 T2 G3 Y; ]
inFilter.wDstPortHighRange = 80;+ Y; L: N* n. \% ] L3 l' U
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
0 [5 h& q- h% J m6 Z M$ V // 加入一个过滤接口/ _% } m0 h. ?" p
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);% h% ]' w+ l6 M8 t
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)/ {1 B% |4 M& H2 E/ j9 n; `* N3 l
// 移除过滤接口$ c& u I; f/ F% `0 m
PfRemoveFilterHandles(hInterface, 1, &fHandle);5 o5 m& l1 I1 u) B
PfUnBindInterface(hInterface);
% j9 ~' o1 f* T+ `; G6 _ PfDeleteInterface(hInterface);
0 Q: D" m' o; S3 J: Q5 {- \0 t return 0;* P+ F% b+ a E
} |
|