|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。- q6 @+ `+ |( p. O a1 y% e
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
( @1 `% Z7 Q; h$ A& B/*
# M) U& g0 R# }4 O2 [7 u利用操作系统提供的API编写防火墙.3 L6 T% l* r7 i4 l
该程序涉及到的API说明请访问微软的MSDN Library
1 ]. j8 K+ @+ G- r代码在C++ Builder 5编译通过
! o+ x, a' o& H如果您想和我交流请email:zzwinner@163.com
* w/ Q% A( Z3 y; f) L3 M*/
5 n. M# I1 X/ R% J#pragma hdrstop, A7 L( j) h% s* K) m
#include "windows.h"2 X- q. G, E+ v) ]% {
#include "Fltdefs.h"
9 |6 s3 i. M, A9 p2 r6 n// 需要加载"iphlpapi.lib"
+ F, m" j5 M# R# c//---------------------------------------------------------------------------
" D* H$ P1 e; y% Q3 D
1 R- W& k& \7 [) c4 o; P7 Z" {; S; h#pragma argsused! Y0 w6 f! h* g( T
int main(int argc, char* argv[])
" `9 W, S M- e& F; O{2 r( _5 e! \# n$ `
// 一个创建网络包过滤接口! S! X( ^, ~) o0 V
INTERFACE_HANDLE hInterface;
' T0 w- G* a6 |, W! N: b: w PfCreateInterface(0,
" Q Q; F& }4 e" w( X PF_ACTION_DROP,//PF_ACTION_FORWARD,- E% L; k. c5 I0 |, U
PF_ACTION_DROP,//PF_ACTION_FORWARD, . c4 H6 ^$ \. A$ }4 J4 n8 H6 j) P
FALSE, , J" r& b7 G! b4 Q, {7 c
TRUE,
# |6 k& b y% S: Y u: T &hInterface);
. I" \4 o2 w ]% `. e- k: V0 a) s) K) P
// 绑定需要网络包过滤的IP地址
) o! d) _4 d+ r) y8 U) m BYTE localIp[] = {192,168,0,2};
' u7 n, W6 [ ~4 s" j PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
+ E1 M+ I& U4 c$ z/ D" k9 S // 现在我们开始过滤HTTP协议的的接口, m; u5 B/ f4 y1 v- R" X. h
FILTER_HANDLE fHandle;; ]- K8 i# h1 G7 Q6 g" e( V5 J5 n
// 填充过滤包的规则结构
5 f* d: X6 `1 x) U# @. S! F PF_FILTER_DESCRIPTOR inFilter;
M4 D B7 Z# C V/ A4 \6 d inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值7 [ u# n! L4 a5 ?3 \
inFilter.dwRule = 0; //一直添这个值
1 I2 r) B s4 E6 @9 s% Q inFilter.pfatType = PF_IPV4; //用 ipV4 地址
+ u' L( U4 m5 ?' F9 v inFilter.SrcAddr = localIp; //设置本地IP地址
8 {' M1 j+ d) \ Y inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码; {# r/ ]4 D0 q% [3 A4 E7 r6 k
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口* v& E; e+ y. s( o) e
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
* Z4 B; F4 ^9 Y% ^ inFilter.DstAddr = 0; //任意目标地址# e' S! h% ^" Z' p$ {$ l) o
inFilter.DstMask = 0;. b% V# X6 L- n, J4 w' k! A
inFilter.wDstPort = 80; //目标端口 80(http 服务)' \! I9 W. D3 s" `$ o2 ^/ J
inFilter.wDstPortHighRange = 80;# z9 X4 ]' |; x4 B
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议2 n* N' ~$ S- \ ?3 }* ?7 ?
// 加入一个过滤接口* M8 ]( I9 R" {4 [# q
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);1 p, J. Q- z: f, A& ^
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
" ~4 m) T1 k6 C# ^! ~9 m. A5 n. X // 移除过滤接口
+ d# u) g) U0 h1 y9 j% @0 \ PfRemoveFilterHandles(hInterface, 1, &fHandle);9 ]4 D% `+ e. @" \
PfUnBindInterface(hInterface);
# s! L+ ^2 t9 p, H PfDeleteInterface(hInterface);2 z7 j! ^ `) S+ z# Y: h2 f7 i/ k
return 0;* M5 H4 Z0 M* ^1 n5 S5 E, C4 C
} |
|