找回密码
 注册
搜索
查看: 4433|回复: 0

利用操作系统提供的API编写防火墙

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。+ X7 f( Z1 X- C. f3 y7 J) y7 q  i
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593% Q- M- G2 y, ^# t' F% @
/*( R) F% Y  ~( A6 r! q
利用操作系统提供的API编写防火墙.
  j+ c9 g9 p- W1 L: R/ g+ B; w该程序涉及到的API说明请访问微软的MSDN Library3 ^. I7 p' C) q
代码在C++ Builder 5编译通过9 i, r+ \! ?$ U  `: T: S) A
如果您想和我交流请email:zzwinner@163.com( m- R- A2 e1 A0 G7 c
*/" b  q. z! G, ~% W, W
#pragma hdrstop
+ f/ M, x" E0 s: O- x#include "windows.h". P* I2 c8 }5 e5 U
#include "Fltdefs.h"
' \( a; w& p8 z- k7 O: P// 需要加载"iphlpapi.lib"& U" E, V- `4 s9 p  U
//---------------------------------------------------------------------------
7 A8 O% X% m6 p& `2 P$ N" l( J- |. X% V4 [8 c
#pragma argsused
; y0 \: @% ]( k4 n9 i/ d% c4 x. i7 h: z9 dint main(int argc, char* argv[])
; z& O) L: S, A* D: ~0 h1 z5 a- V{
+ x+ y' ~9 X- ]! `1 G8 M    // 一个创建网络包过滤接口
! L! i' w  h6 |    INTERFACE_HANDLE hInterface;
+ L6 {. ~" O, W# i! U; n( w- D    PfCreateInterface(0,
6 a2 K9 v! M. L                     PF_ACTION_DROP,//PF_ACTION_FORWARD,8 N: g, A% m6 o+ x
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
# j9 |7 f6 h# E4 p                     FALSE, 8 M/ K: V# t: ]  j3 N
                     TRUE, % |, n8 I+ i4 R
                     &hInterface);
! J) A4 f2 _1 B# w& M+ c# j5 Z0 L$ l" Q3 c9 o
    // 绑定需要网络包过滤的IP地址2 J5 V- y  ~7 E6 s9 g
    BYTE localIp[] = {192,168,0,2};+ a8 O" P3 g0 }4 D. f
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
! z) a8 F1 ?  b$ L5 L+ I) u, M( t0 {    // 现在我们开始过滤HTTP协议的的接口4 {& E. d" o( e( E" l# i% a6 d8 T
    FILTER_HANDLE fHandle;! s& v1 ^6 [; M
    // 填充过滤包的规则结构
1 |$ P- X7 c) P# P    PF_FILTER_DESCRIPTOR inFilter;
- ?' ^# {  a9 |7 G    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值4 b# J3 U9 W* M/ l7 ~& z
    inFilter.dwRule = 0; //一直添这个值
: S1 ~! i. F3 P& h! p    inFilter.pfatType = PF_IPV4; //用 ipV4 地址! g+ O& D* v! D9 A( B9 G
    inFilter.SrcAddr = localIp; //设置本地IP地址% ]( E' ]9 L& L  U! Q
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码, o" U* [" r) Q! P) C; H+ g
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口/ K" N7 |. b, l3 |' p3 M
    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;5 y* W( J! T# O8 ~2 h  @4 V
    inFilter.DstAddr = 0; //任意目标地址
& N$ J: n3 D  w5 d* C- K; v    inFilter.DstMask = 0;
& }; t+ j7 i5 C- W    inFilter.wDstPort = 80; //目标端口 80(http 服务)) k0 a8 n, b; X1 M" J
    inFilter.wDstPortHighRange = 80;
2 E* m% K- A/ c" `* v/ z6 {0 {. P9 _$ }  ?    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议3 v- K7 \9 k: @  Y* f4 s
    // 加入一个过滤接口; W& j  R2 O+ P3 l' T- y
    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);/ \2 o( C: ]' \6 c- G; ]
    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)% Q* `+ L1 k  A& ~
    // 移除过滤接口- g* E4 D: N; F! b& `" Z# s
    PfRemoveFilterHandles(hInterface, 1, &fHandle);
  f6 {5 v* D; K% n    PfUnBindInterface(hInterface);
- Y- D( \2 \$ k/ x) M0 X7 h    PfDeleteInterface(hInterface);
) w5 a! w" ?2 F/ t    return 0;  u0 L8 G, b) d- H0 K( ~. e( N
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-8-15 10:25 , Processed in 0.017397 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表