|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
K! i3 r& M" J, m6 O& W7 T欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
4 Z! h2 _4 p% o) m5 n; c9 {/*
/ M0 r8 r8 G: n7 s利用操作系统提供的API编写防火墙.
: D( u9 x C" }& k& c该程序涉及到的API说明请访问微软的MSDN Library; }& t; c9 P& w3 p/ Y% t' ~
代码在C++ Builder 5编译通过
! ]' R+ t6 t- l& f0 `3 [如果您想和我交流请email:zzwinner@163.com3 A+ O1 a }( ?& z9 ^2 Z) m
*/
2 t" R4 z2 ~, y& r1 b$ H, Y w#pragma hdrstop9 y5 ~0 q& }5 }7 k) y7 t
#include "windows.h"
1 o B$ U- a4 @; D#include "Fltdefs.h"5 J# H7 f( L$ e* M9 q
// 需要加载"iphlpapi.lib"
$ D4 l! Z; H& G. }* L7 A5 ^//---------------------------------------------------------------------------
. p: E0 \4 H3 W% A$ r3 X# F+ c8 V8 i% e
! J$ m7 _- x, `) } p/ U" A, f: S* j#pragma argsused3 q# `' x3 H; [2 |% u6 N
int main(int argc, char* argv[])% I" [ t1 e; ]- c4 b
{- ^% j' C1 A: c5 v% ?/ v
// 一个创建网络包过滤接口- U/ P, }. i4 P8 |
INTERFACE_HANDLE hInterface;
0 E4 H- F4 ~9 G4 `/ }) c6 l PfCreateInterface(0, 9 j! \; H4 G1 M, {2 M& I V+ h
PF_ACTION_DROP,//PF_ACTION_FORWARD,
$ f# R$ @/ B5 S4 V PF_ACTION_DROP,//PF_ACTION_FORWARD, 2 Z, o' a4 _& b
FALSE,
) V& w8 H2 M* n6 C TRUE,
5 y/ r) \3 ~' M5 {! h &hInterface);; I8 a/ P3 s/ [5 c D
4 ] \+ M* i7 ^/ h7 N8 _. y // 绑定需要网络包过滤的IP地址8 y' t! c2 n. e4 l2 @: J7 k3 E
BYTE localIp[] = {192,168,0,2};) e6 {5 \% p. y1 [
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);2 a$ n. s4 j. _, C
// 现在我们开始过滤HTTP协议的的接口
7 R# l* H& y! W FILTER_HANDLE fHandle;6 C2 q( _1 z8 _; O l
// 填充过滤包的规则结构
3 V$ _7 E" h% @) u1 N+ S6 C- y1 M PF_FILTER_DESCRIPTOR inFilter;$ `4 h, p# s! [+ x( w) p/ O* c2 i( i
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值! G/ t4 K I9 I3 o
inFilter.dwRule = 0; //一直添这个值2 j& c2 r/ ]4 p
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
% v7 g, O* C4 {4 e$ _' q inFilter.SrcAddr = localIp; //设置本地IP地址
+ k8 }+ ^+ W7 [& T$ f, E; p- A2 K inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码( P3 k- @8 r2 f' a2 N
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口" r. X0 P- C& `4 N+ p
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
; _9 Y( d4 `- j3 y7 r' E inFilter.DstAddr = 0; //任意目标地址5 {3 [2 `4 E# Z, [
inFilter.DstMask = 0;" E K% G, v5 q E* z
inFilter.wDstPort = 80; //目标端口 80(http 服务)2 K1 `( T, ]; I7 Y* G0 |6 l
inFilter.wDstPortHighRange = 80;1 Y( e$ ^1 D" {; E0 G7 K
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议- V1 A- q+ y' ]+ m! x% n9 t
// 加入一个过滤接口. b* x6 t$ z) a7 D$ i* l. H
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);9 n3 [& ^- |0 e$ j
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
0 M R1 v1 q, r4 X3 O // 移除过滤接口
- K! B7 j7 W f8 v PfRemoveFilterHandles(hInterface, 1, &fHandle);, R1 F& q7 H5 ^' N9 p, ^# @# L2 B
PfUnBindInterface(hInterface);6 b9 w) a1 a: F3 s1 J
PfDeleteInterface(hInterface);
/ S6 n% K: h) t return 0;
* {" i8 R. L9 E5 S6 c9 T} |
|