|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。8 T7 B/ g2 _1 Q" w3 B: n% T
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
1 N8 i4 U& ~$ u3 I1 F/*2 k+ o$ g! ?( v/ ^
利用操作系统提供的API编写防火墙.9 R4 I" e% E3 J$ z1 U( P% L. H
该程序涉及到的API说明请访问微软的MSDN Library
8 p2 y- v- o- f2 k! C! n代码在C++ Builder 5编译通过
$ w+ s5 C5 }0 }& `如果您想和我交流请email:zzwinner@163.com
( T( h% @; c. X( ^/ }+ U. w" E*/( |: i; Q0 X/ f- d' c
#pragma hdrstop/ m9 Y5 q2 A! `" I6 v1 p1 r( K; c
#include "windows.h"# L) W4 p( L1 S8 L" A& t
#include "Fltdefs.h"
$ Q) e( F, P( W// 需要加载"iphlpapi.lib"" P- I; j' v( o; ?
//---------------------------------------------------------------------------/ X/ O* J d- g0 F( z
. w, I5 D% a3 y: O0 A# S#pragma argsused
: ?* o: C0 K3 T) g" y9 Oint main(int argc, char* argv[])
2 ?" t$ S7 F- l. R: s! e; B& w1 B{
, g/ Q" r: O/ }/ F) r // 一个创建网络包过滤接口+ e( ^! {6 @# \! H9 Q
INTERFACE_HANDLE hInterface;
/ O# [2 |4 L# P, }, V) Z& G PfCreateInterface(0, . \5 U( U/ ^" c: L- ~1 Y
PF_ACTION_DROP,//PF_ACTION_FORWARD,- P- E5 r4 Y% I2 p# n. N% U
PF_ACTION_DROP,//PF_ACTION_FORWARD,
1 g* l( O+ k3 k7 q% F FALSE,
9 D) @7 s4 _4 W2 c8 g- | TRUE,
( }$ Z1 ^% R, K &hInterface);1 G5 j8 `$ ?4 N0 V* k
, p5 _! }) ?2 d // 绑定需要网络包过滤的IP地址
' Z, Q8 F2 U: o/ P BYTE localIp[] = {192,168,0,2};0 D2 i7 G: h2 @ T
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
0 r O" V; ~. j) x // 现在我们开始过滤HTTP协议的的接口: E3 A( g# S+ Z) q: V3 G! ^& J
FILTER_HANDLE fHandle;
+ Y! [/ _* i& w) `1 r( j // 填充过滤包的规则结构
2 y; v' p3 ?$ j2 ]; C PF_FILTER_DESCRIPTOR inFilter;
) `" F3 z9 Y `* X( D inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
! A$ k& d/ A. ]# q3 b2 @, m2 h inFilter.dwRule = 0; //一直添这个值
7 f6 Z2 `2 ]" D4 a4 W# G inFilter.pfatType = PF_IPV4; //用 ipV4 地址
E) P* i! E( D: `5 g( R& ` inFilter.SrcAddr = localIp; //设置本地IP地址
8 y0 ~- \7 |9 e& ? inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
2 ^4 ]7 f1 N) b inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
/ [# A% H. ?& L; g9 V+ b inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;' j a/ R( a9 e- I" z6 q; }
inFilter.DstAddr = 0; //任意目标地址$ i5 K$ a) E$ w5 x/ H8 P8 t7 V
inFilter.DstMask = 0;1 `5 O4 b, k( F
inFilter.wDstPort = 80; //目标端口 80(http 服务)4 A# T& S" Q# c+ M
inFilter.wDstPortHighRange = 80;% z7 E0 z! s' B ^' h9 t
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
& g+ m. X5 `8 K/ w8 C // 加入一个过滤接口
; S& X# c- l/ H/ y PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
% ~- W! n2 i5 i) R6 q$ k // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
7 i% X# L; G3 G: _' @6 X // 移除过滤接口
5 a3 x* u: I5 ] l. B6 W4 z$ S PfRemoveFilterHandles(hInterface, 1, &fHandle);* c- J8 o, ^/ q" c
PfUnBindInterface(hInterface);% p1 b. B' y; m1 p
PfDeleteInterface(hInterface);
% I- B$ ?$ L' z( z1 ~ return 0;) [- e! u( D8 V* q2 F( I( e! g
} |
|