|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。+ X7 f( Z1 X- C. f3 y7 J) y7 q i
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593% Q- M- G2 y, ^# t' F% @
/*( R) F% Y ~( A6 r! q
利用操作系统提供的API编写防火墙.
j+ c9 g9 p- W1 L: R/ g+ B; w该程序涉及到的API说明请访问微软的MSDN Library3 ^. I7 p' C) q
代码在C++ Builder 5编译通过9 i, r+ \! ?$ U `: T: S) A
如果您想和我交流请email:zzwinner@163.com( m- R- A2 e1 A0 G7 c
*/" b q. z! G, ~% W, W
#pragma hdrstop
+ f/ M, x" E0 s: O- x#include "windows.h". P* I2 c8 }5 e5 U
#include "Fltdefs.h"
' \( a; w& p8 z- k7 O: P// 需要加载"iphlpapi.lib"& U" E, V- `4 s9 p U
//---------------------------------------------------------------------------
7 A8 O% X% m6 p& `2 P$ N" l( J- |. X% V4 [8 c
#pragma argsused
; y0 \: @% ]( k4 n9 i/ d% c4 x. i7 h: z9 dint main(int argc, char* argv[])
; z& O) L: S, A* D: ~0 h1 z5 a- V{
+ x+ y' ~9 X- ]! `1 G8 M // 一个创建网络包过滤接口
! L! i' w h6 | INTERFACE_HANDLE hInterface;
+ L6 {. ~" O, W# i! U; n( w- D PfCreateInterface(0,
6 a2 K9 v! M. L PF_ACTION_DROP,//PF_ACTION_FORWARD,8 N: g, A% m6 o+ x
PF_ACTION_DROP,//PF_ACTION_FORWARD,
# j9 |7 f6 h# E4 p FALSE, 8 M/ K: V# t: ] j3 N
TRUE, % |, n8 I+ i4 R
&hInterface);
! J) A4 f2 _1 B# w& M+ c# j5 Z0 L$ l" Q3 c9 o
// 绑定需要网络包过滤的IP地址2 J5 V- y ~7 E6 s9 g
BYTE localIp[] = {192,168,0,2};+ a8 O" P3 g0 }4 D. f
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
! z) a8 F1 ? b$ L5 L+ I) u, M( t0 { // 现在我们开始过滤HTTP协议的的接口4 {& E. d" o( e( E" l# i% a6 d8 T
FILTER_HANDLE fHandle;! s& v1 ^6 [; M
// 填充过滤包的规则结构
1 |$ P- X7 c) P# P PF_FILTER_DESCRIPTOR inFilter;
- ?' ^# { a9 |7 G inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值4 b# J3 U9 W* M/ l7 ~& z
inFilter.dwRule = 0; //一直添这个值
: S1 ~! i. F3 P& h! p inFilter.pfatType = PF_IPV4; //用 ipV4 地址! g+ O& D* v! D9 A( B9 G
inFilter.SrcAddr = localIp; //设置本地IP地址% ]( E' ]9 L& L U! Q
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码, o" U* [" r) Q! P) C; H+ g
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口/ K" N7 |. b, l3 |' p3 M
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;5 y* W( J! T# O8 ~2 h @4 V
inFilter.DstAddr = 0; //任意目标地址
& N$ J: n3 D w5 d* C- K; v inFilter.DstMask = 0;
& }; t+ j7 i5 C- W inFilter.wDstPort = 80; //目标端口 80(http 服务)) k0 a8 n, b; X1 M" J
inFilter.wDstPortHighRange = 80;
2 E* m% K- A/ c" `* v/ z6 {0 {. P9 _$ } ? inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议3 v- K7 \9 k: @ Y* f4 s
// 加入一个过滤接口; W& j R2 O+ P3 l' T- y
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);/ \2 o( C: ]' \6 c- G; ]
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)% Q* `+ L1 k A& ~
// 移除过滤接口- g* E4 D: N; F! b& `" Z# s
PfRemoveFilterHandles(hInterface, 1, &fHandle);
f6 {5 v* D; K% n PfUnBindInterface(hInterface);
- Y- D( \2 \$ k/ x) M0 X7 h PfDeleteInterface(hInterface);
) w5 a! w" ?2 F/ t return 0; u0 L8 G, b) d- H0 K( ~. e( N
} |
|