|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
7 F1 y5 ^$ W$ Z欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
& ~; {; J v& p! ]8 t/*
- b( l$ @# [' X" l利用操作系统提供的API编写防火墙.
& k/ ~9 W. J2 G" t/ E该程序涉及到的API说明请访问微软的MSDN Library) @0 P0 S9 E0 S
代码在C++ Builder 5编译通过
. [+ c; F. @/ v* ^& F如果您想和我交流请email:zzwinner@163.com3 \: z @( y: {. C* b/ _+ N
*/
& }6 Q3 M# m) {( ]# I#pragma hdrstop
* U" A, }& b. ]: A) c! J#include "windows.h"
9 k9 z1 h1 ?" V2 t5 f0 @* i0 `#include "Fltdefs.h"
2 Q/ M$ Y+ |) l5 y7 X5 F// 需要加载"iphlpapi.lib"# s' u7 j! ^! R/ V" n2 V
//---------------------------------------------------------------------------
# G; P4 ^8 C% c8 b' q
0 w7 i# v5 {2 N% Z$ y$ D7 X#pragma argsused* E0 H+ v+ l4 n
int main(int argc, char* argv[])9 F$ `' e1 I, R, e
{+ U, Y$ f/ R* C
// 一个创建网络包过滤接口
6 N; A7 f+ W0 \9 K INTERFACE_HANDLE hInterface;
5 G ]& a% ?( Y! J$ a; L PfCreateInterface(0,
. R0 W' k9 {4 T% h* E6 ~0 u PF_ACTION_DROP,//PF_ACTION_FORWARD,
1 x+ Z) T+ Q2 ^ L& T( g PF_ACTION_DROP,//PF_ACTION_FORWARD, 8 @) O0 `( I& l H! o% B7 c
FALSE, ' q V- A4 {0 I3 A" j9 T. Q
TRUE, + q) B4 Q. K# Z( y
&hInterface);
* i: Q! [4 d' B( W& `2 D% V# k
$ u5 d& g" A1 C // 绑定需要网络包过滤的IP地址
. u% J4 T: V9 I7 V' d! d BYTE localIp[] = {192,168,0,2};
" C8 K" {- R$ o+ M8 T2 x PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);! J! f7 o$ Y* F& G$ P
// 现在我们开始过滤HTTP协议的的接口
3 U2 b8 w$ a0 S# R7 e& N FILTER_HANDLE fHandle;
1 x/ K* t: Z0 G% `- C1 a# p // 填充过滤包的规则结构. V2 C$ F9 d$ ~* t0 j1 K3 M
PF_FILTER_DESCRIPTOR inFilter;
+ G) v; }9 S0 y: `% I4 O inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值7 v4 B! `1 w# _
inFilter.dwRule = 0; //一直添这个值2 Q* X5 F6 t/ }1 E2 F; N: R
inFilter.pfatType = PF_IPV4; //用 ipV4 地址1 U2 c- V; U6 N, d9 I; q
inFilter.SrcAddr = localIp; //设置本地IP地址2 K- P& U! L4 w* H+ r6 j! ^
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码+ J B2 r) Q$ \% r7 `, M
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口! Z; g$ k, {; `7 H' l [9 B! ~) q4 l
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
) ]" }* U' @- g2 o" e inFilter.DstAddr = 0; //任意目标地址& j+ y: w( K( \- t1 z0 B
inFilter.DstMask = 0;
+ f3 f/ W4 I) X* O inFilter.wDstPort = 80; //目标端口 80(http 服务)* H: W$ ~# z) J7 C8 \
inFilter.wDstPortHighRange = 80;# X1 G0 q5 e& \# U9 [
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
: l2 ]! `' X5 K1 Z // 加入一个过滤接口. q/ g% I) q; i& h
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);& m! C2 U! v* k- g" q0 d
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
' h- X& p8 \' i* T // 移除过滤接口
+ G* }9 _4 }2 t0 ~% f7 h4 Y) @& t! M, u PfRemoveFilterHandles(hInterface, 1, &fHandle);1 n% a5 G7 g( Z
PfUnBindInterface(hInterface);
4 p( U; h7 C5 r- b! i' D$ Z% S% L( C PfDeleteInterface(hInterface);. h# X6 ^2 t) Z) k, ?
return 0;
! Q( ^1 I' J$ B# ~0 |- X$ B3 j" r} |
|