|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。, R3 N' Z. {1 w- R( W+ F
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5936 P' t a$ u: F z, ?3 {/ s5 b* b
/*) y, p% q& {4 f6 B3 S& C
利用操作系统提供的API编写防火墙.
2 X0 {) ~$ g' F9 q5 ]4 K该程序涉及到的API说明请访问微软的MSDN Library
+ M# @! F0 q8 D( C代码在C++ Builder 5编译通过
: j* X$ M% W7 H( i如果您想和我交流请email:zzwinner@163.com
5 p& Q$ h: ]+ O*/, F& c3 r- h0 {- s! I1 Y6 L
#pragma hdrstop
+ S2 _. o- j2 M/ J#include "windows.h"
' e% ~7 p# i7 P5 x; G5 M#include "Fltdefs.h"- W) Z- y P+ i7 i% H/ @
// 需要加载"iphlpapi.lib"2 O1 F. w' \' ^# J8 }3 f# {9 m2 G8 f
//---------------------------------------------------------------------------
# Z4 ^+ u; J5 r; P8 i. A& M
% V$ E y3 M: Q. T! M \/ I#pragma argsused
{* m0 ?# W' Jint main(int argc, char* argv[])
' h# h' `% v& M! e7 f. t3 R{- ^# d) _& v- q+ Y5 {
// 一个创建网络包过滤接口
# `2 v6 R% K$ ^( ]* @' B INTERFACE_HANDLE hInterface;
: J8 ^8 v; B9 m+ X: ~+ Z3 T PfCreateInterface(0,
0 y D6 u3 m8 f PF_ACTION_DROP,//PF_ACTION_FORWARD,
* a" T# Q: q: T PF_ACTION_DROP,//PF_ACTION_FORWARD,
8 A: \3 {9 ^+ I E' ?$ ^4 T! o FALSE, 7 C$ ~/ z+ M" }3 Z
TRUE,
0 H6 w5 w, }6 I6 { &hInterface);- x7 v+ y1 b; g e/ W: f/ R
- z- i2 Q) g/ h8 `% Z$ `3 x // 绑定需要网络包过滤的IP地址
4 O, b% r5 M* ^' ^3 V7 g0 O BYTE localIp[] = {192,168,0,2};- o% x5 ~) J; L3 R
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
/ _' p& T$ J% m- n // 现在我们开始过滤HTTP协议的的接口5 G2 P4 o. l0 a. C
FILTER_HANDLE fHandle;+ H# P9 n L4 a0 k# B5 |- I
// 填充过滤包的规则结构
; k7 B7 |: {5 j. Y PF_FILTER_DESCRIPTOR inFilter;( i% |, z6 |: C7 j) o* |) a) X
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
+ @7 N0 y: \$ l0 Z @ K& h$ J inFilter.dwRule = 0; //一直添这个值2 `8 X* b0 ?- L V) O/ `2 d
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
' s9 N$ Y. m9 x: X; w& P inFilter.SrcAddr = localIp; //设置本地IP地址; k* Z/ m9 C' {4 R) Y3 I
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码" j( K7 H/ W2 N+ c1 D. a3 ~
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
9 p. @" I0 Z8 E) \/ p6 ? inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;: T! r" [( B: p: ~$ X; x4 N3 x
inFilter.DstAddr = 0; //任意目标地址
0 c& w( {% _; j, }# m) H7 W, R inFilter.DstMask = 0;
$ C4 w q* F O8 i. K3 t8 ~ inFilter.wDstPort = 80; //目标端口 80(http 服务)0 W: W& R$ s9 @4 F) L
inFilter.wDstPortHighRange = 80;
7 m$ x. g1 k* ~& l+ [" \& Q" l inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议5 `1 U! Y* m) m# u& \
// 加入一个过滤接口
0 L/ q/ q* h8 m2 L. x PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
2 L: I8 D: g2 ^4 e* _ // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
* l, j% c) ^1 u2 a1 A // 移除过滤接口
3 j) c ~+ p- k7 K PfRemoveFilterHandles(hInterface, 1, &fHandle);) y% R% K9 w, F' [; W# O$ ^+ \
PfUnBindInterface(hInterface);3 D! f. D+ {' A7 B/ U. ~ D; N5 f
PfDeleteInterface(hInterface);
. B( [# f( h- K) C- A return 0;8 O6 f5 R6 {+ j* Y( |6 c: Z( E' i6 F) ~
} |
|