|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。( v% l0 ]9 J# b- u9 V
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
; m; m# z \$ u# M/*
. j6 ^, _$ L0 ^. T利用操作系统提供的API编写防火墙.' R, ~1 j' g6 a% O+ [7 A
该程序涉及到的API说明请访问微软的MSDN Library# q/ I3 g" r( @1 b
代码在C++ Builder 5编译通过
1 y' W. ]1 h# M. I( U6 _如果您想和我交流请email:zzwinner@163.com
0 q; u# t5 T0 c% @! Y; A9 q6 n! u*/
: g6 q" a7 p& n1 J+ T% y#pragma hdrstop
3 c. Y+ P- T$ ]$ R( A( x5 ]1 V#include "windows.h"
2 H! h( f1 ^2 m+ V- a9 q; u#include "Fltdefs.h"$ k# Y3 c; u* J. a5 C
// 需要加载"iphlpapi.lib"
, q5 p9 x8 J# m//---------------------------------------------------------------------------
# E( |: ~' U) y9 }/ q
/ ^* R) d0 K3 X4 J* Y1 l; W# _#pragma argsused
5 H5 s* a) n8 d1 r: ]2 d, [- p* \int main(int argc, char* argv[])5 v1 B4 r+ t5 ]. d2 r
{# a9 I. B8 T7 d. K' A& j* @/ f3 u
// 一个创建网络包过滤接口. _7 t6 y/ e7 V9 A. x& i
INTERFACE_HANDLE hInterface;6 F$ R8 i9 S# B6 l6 R# S* H
PfCreateInterface(0, ; ~, P' {% C8 Q' i6 C" c2 M
PF_ACTION_DROP,//PF_ACTION_FORWARD,3 k2 b9 p# C; Z* S
PF_ACTION_DROP,//PF_ACTION_FORWARD,
+ m+ z' y E- K, e FALSE, ^% o3 _/ J8 I
TRUE, 0 J3 X$ n; J9 a
&hInterface);
/ ~9 P: g4 \4 k- n( u4 g$ s/ J. q8 Z1 H" _# ]
// 绑定需要网络包过滤的IP地址 [8 d" N) y0 _
BYTE localIp[] = {192,168,0,2};/ g2 [: Q9 F& R
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);% m V$ s- o9 R: y
// 现在我们开始过滤HTTP协议的的接口2 p5 |! M( M# O
FILTER_HANDLE fHandle;( t3 I% n0 p, ^8 X B( I5 E1 Z
// 填充过滤包的规则结构
$ U2 g6 B/ i3 P$ j PF_FILTER_DESCRIPTOR inFilter;# ~- I" Z! K# d$ q
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
- J6 Q& V4 M% J. R8 Z: B3 Q+ K inFilter.dwRule = 0; //一直添这个值0 {# o. I7 a1 k5 N+ u6 a: }. T* N
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
( Q$ w4 ?3 Y v/ R$ W* A inFilter.SrcAddr = localIp; //设置本地IP地址
5 _ P+ y, T7 a# p5 h7 x: U inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
! L+ K3 r2 a& R0 \. ~ inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
) h! {8 r1 E) m9 G3 q inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
( Q9 W5 ?% `; ^! W" ~0 n( k% M inFilter.DstAddr = 0; //任意目标地址
; H9 F, w6 b- Y3 M- A. f. p4 H2 Q inFilter.DstMask = 0;3 O4 s% b: v6 Z& V
inFilter.wDstPort = 80; //目标端口 80(http 服务)& K3 V( G' L5 h; K4 f+ a1 ?+ ?
inFilter.wDstPortHighRange = 80;- t0 Q* g# x1 F
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
G# C& q* S; c- f // 加入一个过滤接口* ~9 I- T8 m( \$ x
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);" R* S; B3 d$ E z( F2 e
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)% [5 x. {6 B/ L& H1 g9 I
// 移除过滤接口
- \3 D3 _& O* [% T PfRemoveFilterHandles(hInterface, 1, &fHandle);& s: p# \1 d# T' A
PfUnBindInterface(hInterface);
( i- {- k2 b& R3 G4 U& j/ c PfDeleteInterface(hInterface);
+ {2 _6 V( }9 T0 O return 0;9 L+ Q' h" t3 A0 ~9 \
} |
|