|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
7 G1 t; x, }0 V; i# A8 |欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593& D B' |- i1 A, N y! ]
/*
* k& W W, e8 T4 Y G利用操作系统提供的API编写防火墙.
: B4 C) o4 C- {- }0 A3 f. v9 w该程序涉及到的API说明请访问微软的MSDN Library
6 e7 i2 N/ Y" i' g7 j$ `代码在C++ Builder 5编译通过
- a3 [- @" p9 h, x( j# h如果您想和我交流请email:zzwinner@163.com
; |4 |% I8 K. J* N' \) n*/# ?# l1 G& K) s: @& b# Q
#pragma hdrstop
, @* h: t8 Z' U1 E* [9 |1 B#include "windows.h"/ x! f {4 [6 ]8 h9 y9 E! N: Q* z
#include "Fltdefs.h"2 u. j: M3 H5 h1 d/ f
// 需要加载"iphlpapi.lib"' S/ {' ^, Y& f+ A
//---------------------------------------------------------------------------
3 ?' r8 x7 R% ]
/ I/ B; D9 v* j* \' s#pragma argsused0 X5 V3 b- d+ m! n
int main(int argc, char* argv[])
1 ~+ Y D4 l2 r+ d( u# l' ]{
9 b& g. ~5 v4 I! m% E0 u // 一个创建网络包过滤接口
2 M! \2 z# H9 D. ^. v INTERFACE_HANDLE hInterface;5 c3 n/ x0 j% X0 g+ O+ h W
PfCreateInterface(0,
0 N& f/ M) F+ Q8 t: J+ i+ C PF_ACTION_DROP,//PF_ACTION_FORWARD,
% X8 V* K( K" f+ \& _2 x. q PF_ACTION_DROP,//PF_ACTION_FORWARD,
! W r' g6 o+ k1 \# ? FALSE, 4 ]9 X4 W& T8 O, x7 |# I5 e
TRUE,
R) `& a% D$ U4 ] &hInterface);
4 x+ o' y2 [6 X& w! Z% M& V1 l) {# s0 e
// 绑定需要网络包过滤的IP地址/ s5 f8 ~% a6 C; T
BYTE localIp[] = {192,168,0,2};$ B" x: s$ v& |; J% Y5 t7 M
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
& A% L8 e+ Y8 S* d7 w* S/ H) V // 现在我们开始过滤HTTP协议的的接口
; p& R/ \7 v0 m! O5 x FILTER_HANDLE fHandle;
2 o4 U/ s2 \" R+ L5 u& `/ j {( t // 填充过滤包的规则结构# ?( ~$ y7 y' ^6 i7 j
PF_FILTER_DESCRIPTOR inFilter;/ z! }/ F# T; ]$ Y
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
q9 D: u; ~' o6 H inFilter.dwRule = 0; //一直添这个值
! j% o1 ^7 u+ Y( H# X inFilter.pfatType = PF_IPV4; //用 ipV4 地址+ v- v! |$ F+ R N" Z, l$ V) o
inFilter.SrcAddr = localIp; //设置本地IP地址
1 d% D& q+ M( P) z inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码2 F6 o: T# D4 c
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
6 Q* A2 z; ^# N inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
) K& d) m$ p' J1 R8 n+ Q inFilter.DstAddr = 0; //任意目标地址2 |3 Z2 F% N9 K
inFilter.DstMask = 0;
4 P6 R/ u; j5 f+ @, G( u: v inFilter.wDstPort = 80; //目标端口 80(http 服务)4 y2 Q9 C, q/ p9 A# k8 ~. m, _
inFilter.wDstPortHighRange = 80;' a" F5 E8 a2 @/ _5 N0 ~ C7 \$ c* }
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议2 h9 z l7 c+ ^ t8 A9 d
// 加入一个过滤接口
5 L A7 B' Q; W2 C7 r2 E PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
, J( L" ` B4 i5 f6 u4 ^ // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)& {1 r( g5 X7 w- n
// 移除过滤接口9 V+ u6 Y5 M; Q7 ~
PfRemoveFilterHandles(hInterface, 1, &fHandle);
( d, W# M) D, }# Y* H% h6 |- [ PfUnBindInterface(hInterface);7 }1 n, W- m$ p I- P4 y
PfDeleteInterface(hInterface);
- |. n9 u! z/ C4 A: X: U return 0;. h7 T+ G+ G/ d
} |
|