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

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

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

本版积分规则

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

GMT+8, 2026-6-18 06:55 , Processed in 0.016499 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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