找回密码
 注册
查看: 4465|回复: 0

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: 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
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:18 , Processed in 0.016384 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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