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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。, R3 N' Z. {1 w- R( W+ F
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5936 P' t  a$ u: F  z, ?3 {/ s5 b* b
/*) y, p% q& {4 f6 B3 S& C
利用操作系统提供的API编写防火墙.
2 X0 {) ~$ g' F9 q5 ]4 K该程序涉及到的API说明请访问微软的MSDN Library
+ M# @! F0 q8 D( C代码在C++ Builder 5编译通过
: j* X$ M% W7 H( i如果您想和我交流请email:zzwinner@163.com
5 p& Q$ h: ]+ O*/, F& c3 r- h0 {- s! I1 Y6 L
#pragma hdrstop
+ S2 _. o- j2 M/ J#include "windows.h"
' e% ~7 p# i7 P5 x; G5 M#include "Fltdefs.h"- W) Z- y  P+ i7 i% H/ @
// 需要加载"iphlpapi.lib"2 O1 F. w' \' ^# J8 }3 f# {9 m2 G8 f
//---------------------------------------------------------------------------
# Z4 ^+ u; J5 r; P8 i. A& M
% V$ E  y3 M: Q. T! M  \/ I#pragma argsused
  {* m0 ?# W' Jint main(int argc, char* argv[])
' h# h' `% v& M! e7 f. t3 R{- ^# d) _& v- q+ Y5 {
    // 一个创建网络包过滤接口
# `2 v6 R% K$ ^( ]* @' B    INTERFACE_HANDLE hInterface;
: J8 ^8 v; B9 m+ X: ~+ Z3 T    PfCreateInterface(0,
0 y  D6 u3 m8 f                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
* a" T# Q: q: T                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
8 A: \3 {9 ^+ I  E' ?$ ^4 T! o                     FALSE, 7 C$ ~/ z+ M" }3 Z
                     TRUE,
0 H6 w5 w, }6 I6 {                     &hInterface);- x7 v+ y1 b; g  e/ W: f/ R

- z- i2 Q) g/ h8 `% Z$ `3 x    // 绑定需要网络包过滤的IP地址
4 O, b% r5 M* ^' ^3 V7 g0 O    BYTE localIp[] = {192,168,0,2};- o% x5 ~) J; L3 R
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
/ _' p& T$ J% m- n    // 现在我们开始过滤HTTP协议的的接口5 G2 P4 o. l0 a. C
    FILTER_HANDLE fHandle;+ H# P9 n  L4 a0 k# B5 |- I
    // 填充过滤包的规则结构
; k7 B7 |: {5 j. Y    PF_FILTER_DESCRIPTOR inFilter;( i% |, z6 |: C7 j) o* |) a) X
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
+ @7 N0 y: \$ l0 Z  @  K& h$ J    inFilter.dwRule = 0; //一直添这个值2 `8 X* b0 ?- L  V) O/ `2 d
    inFilter.pfatType = PF_IPV4; //用 ipV4 地址
' s9 N$ Y. m9 x: X; w& P    inFilter.SrcAddr = localIp; //设置本地IP地址; k* Z/ m9 C' {4 R) Y3 I
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码" j( K7 H/ W2 N+ c1 D. a3 ~
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
9 p. @" I0 Z8 E) \/ p6 ?    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;: T! r" [( B: p: ~$ X; x4 N3 x
    inFilter.DstAddr = 0; //任意目标地址
0 c& w( {% _; j, }# m) H7 W, R    inFilter.DstMask = 0;
$ C4 w  q* F  O8 i. K3 t8 ~    inFilter.wDstPort = 80; //目标端口 80(http 服务)0 W: W& R$ s9 @4 F) L
    inFilter.wDstPortHighRange = 80;
7 m$ x. g1 k* ~& l+ [" \& Q" l    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议5 `1 U! Y* m) m# u& \
    // 加入一个过滤接口
0 L/ q/ q* h8 m2 L. x    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
2 L: I8 D: g2 ^4 e* _    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
* l, j% c) ^1 u2 a1 A    // 移除过滤接口
3 j) c  ~+ p- k7 K    PfRemoveFilterHandles(hInterface, 1, &fHandle);) y% R% K9 w, F' [; W# O$ ^+ \
    PfUnBindInterface(hInterface);3 D! f. D+ {' A7 B/ U. ~  D; N5 f
    PfDeleteInterface(hInterface);
. B( [# f( h- K) C- A    return 0;8 O6 f5 R6 {+ j* Y( |6 c: Z( E' i6 F) ~
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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