|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
. {4 F2 ~4 f1 `, z( q& X% n! {欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593" _+ r# p, q2 M* l; J
/*
* S9 o, j$ Z# M! X4 S利用操作系统提供的API编写防火墙.' t9 v) A' u, k) j" e
该程序涉及到的API说明请访问微软的MSDN Library
5 B" j8 K6 S$ z8 x/ `( B% p代码在C++ Builder 5编译通过
* Z8 w% X5 h! ^( Y如果您想和我交流请email:zzwinner@163.com! V( Z; _" T6 S7 l: \, ~6 }
*/
1 M8 s# ?( |+ _2 O2 N#pragma hdrstop3 ~$ a) B& N. u# r2 c" ~1 K& f0 T
#include "windows.h"4 z- X) A; f4 ~. [. H4 i
#include "Fltdefs.h"
5 b% I* j) _. C$ J) l// 需要加载"iphlpapi.lib"
% H# d& W3 X% f6 B$ T0 g) H* l* e# \; K//---------------------------------------------------------------------------- `9 ?6 F7 C7 f x2 o
; M, C' ~7 o9 c: H4 X
#pragma argsused2 N) i) }+ `+ x* p) l- i
int main(int argc, char* argv[])
3 q* v9 W' c4 c% x% j: f" |{6 f/ N0 M& `* n7 P+ i8 g
// 一个创建网络包过滤接口4 ~1 J0 y% }/ J
INTERFACE_HANDLE hInterface;
1 D) `0 H6 E3 ]+ C2 | PfCreateInterface(0,
* K6 V# O2 w* C' l/ r PF_ACTION_DROP,//PF_ACTION_FORWARD,
( F! f% w0 `! J, I/ R' C5 V PF_ACTION_DROP,//PF_ACTION_FORWARD,
& x% E4 c' l: {1 d; n3 H: l FALSE, 0 v5 O, P; Q4 K( d# @3 }
TRUE,
4 A8 J3 Q: x6 c( G) V! P3 S &hInterface);. w9 X( p$ n, p% o
" z( G$ T9 f1 v# n
// 绑定需要网络包过滤的IP地址9 Q( ^2 \ u$ S; o6 Y
BYTE localIp[] = {192,168,0,2};' t/ }- ?: L; k @
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
: q7 d5 p6 V9 Y2 T! n1 M3 I2 {( u // 现在我们开始过滤HTTP协议的的接口& F+ w1 x* ^; _% y j- }8 o5 J
FILTER_HANDLE fHandle;1 V, `+ T& m' H3 s
// 填充过滤包的规则结构- d* u* f; j" |6 N( q. G
PF_FILTER_DESCRIPTOR inFilter;& O$ T3 l$ ~( H2 M7 m1 y; t4 Y! {
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
& I& ^% I3 u% w/ c' m4 N9 } inFilter.dwRule = 0; //一直添这个值
8 x5 X. C- x9 j i* H2 e inFilter.pfatType = PF_IPV4; //用 ipV4 地址
9 G. D+ |4 O5 A inFilter.SrcAddr = localIp; //设置本地IP地址
. a; E7 w! D! h1 R/ o9 {- S( T" w) q; `. T inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
8 k! O9 U T' }( @$ ? inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口# m3 l& X3 r! _. @: X" Y) z
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;4 S* S) u; W/ i; g4 C
inFilter.DstAddr = 0; //任意目标地址
, G5 f' k& g5 u( ^2 b x inFilter.DstMask = 0;
" P4 l+ i9 V1 F inFilter.wDstPort = 80; //目标端口 80(http 服务)
" b4 o4 F1 o' H inFilter.wDstPortHighRange = 80;
/ b D+ l/ u1 h+ w/ L inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
9 \& ~0 Y6 y3 x B3 A1 K // 加入一个过滤接口% j0 O( |, d' \3 z* X
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);# q% I B! c# |
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
9 C9 ?& F( Q: U1 @! j; f // 移除过滤接口- S" ]$ S. A) z
PfRemoveFilterHandles(hInterface, 1, &fHandle);
* g- P z3 g4 | PfUnBindInterface(hInterface);
: U) E# L) y X8 \3 t6 R PfDeleteInterface(hInterface);- d8 x& v+ l2 Q% A* h3 D
return 0;
- o6 R" w: d4 ^) i} |
|