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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
, J8 H% C5 O% [. X0 c) t欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
0 Z4 V9 H% w$ h/ Z7 F9 a( E2 r/*
! D# v! d1 N9 d5 r, t利用操作系统提供的API编写防火墙.
) P. m: b5 w& ]8 X7 p0 V; L: T- e该程序涉及到的API说明请访问微软的MSDN Library
$ K, |1 {# d% V8 j% \$ v代码在C++ Builder 5编译通过
" j; R  g' d7 j; N如果您想和我交流请email:zzwinner@163.com
/ _0 u% o) N2 E. N*/4 l! g' l, @! V, G/ `/ Z
#pragma hdrstop
* B$ R7 g' T6 R' f$ p; h2 H' e#include "windows.h", b/ V: I0 {- T; p/ L6 Y/ w& X$ M
#include "Fltdefs.h"! ^: y  E  e3 H2 e  O8 h+ l  E: V1 z
// 需要加载"iphlpapi.lib"4 S: U5 R6 E0 ^1 H. q
//---------------------------------------------------------------------------
, @9 b0 d* J# z; e0 M( F! _) R" u
. _. ]# M+ J) `5 x& q! {" \#pragma argsused
6 O9 T: g0 ^' Q2 V8 z6 G3 x4 i; |. C' i6 vint main(int argc, char* argv[])
" c; _; k+ q) c" L* K{
9 @* T& C( n6 f8 m    // 一个创建网络包过滤接口
6 q) a3 w  i; R* S. d    INTERFACE_HANDLE hInterface;
1 w5 h4 _; }8 Q1 S( i    PfCreateInterface(0,
' Z+ g7 z. {$ J4 e. P                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
% M4 d' [) q6 h' H% H1 q                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
0 X& m6 W( P2 \                     FALSE,
" @1 M5 n/ S# b0 a                     TRUE,
/ e) N, W0 b$ ]9 \                     &hInterface);# Q, y5 q+ P- L' `2 r7 k

4 d! `- H0 T+ D9 n" i" ^# u    // 绑定需要网络包过滤的IP地址+ i7 R$ S$ e' r" v+ Z/ ]
    BYTE localIp[] = {192,168,0,2};2 A2 M) S$ W4 t" U4 r  @, Z+ }1 `% ~
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);6 v1 ]1 g. N+ ^# ?5 q
    // 现在我们开始过滤HTTP协议的的接口
# b3 i8 r. `& |6 K    FILTER_HANDLE fHandle;& H: S, o5 T. q! `) E; c6 B7 w
    // 填充过滤包的规则结构( o3 o7 r2 p3 [0 o  I" T0 Y* f
    PF_FILTER_DESCRIPTOR inFilter;
( Q1 Y" f+ c- _& [. q- ]' {    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值* V& v% E' D7 M8 ~2 p2 m! W
    inFilter.dwRule = 0; //一直添这个值
0 B" W! y# P4 Q1 L, Z0 f    inFilter.pfatType = PF_IPV4; //用 ipV4 地址
1 I( E. b8 e; {2 e7 d+ y    inFilter.SrcAddr = localIp; //设置本地IP地址  \, v/ R: A5 e% H
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
' W: C/ m, J* u+ u4 L    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口7 e5 P# M6 `7 |3 M& S: m
    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
& e6 _. |/ C# E. k! p$ H& U+ k    inFilter.DstAddr = 0; //任意目标地址
* o- `5 m# h1 t: f7 A8 O8 [    inFilter.DstMask = 0;
7 a% G" k' T  {2 O7 e    inFilter.wDstPort = 80; //目标端口 80(http 服务)# G, q9 ]2 f: E: u
    inFilter.wDstPortHighRange = 80;9 I$ X9 t6 z$ I& Q
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议- ]) @/ t; ]' `3 F
    // 加入一个过滤接口
+ a; {% _: H' B1 L$ U    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);1 }+ d% H( N5 L" L( h2 ?0 u
    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
' R2 W/ h2 z( b) N2 F# S    // 移除过滤接口' P- K/ A- l  A9 H2 H# W0 }1 B0 s
    PfRemoveFilterHandles(hInterface, 1, &fHandle);
5 Z0 M4 C* Z3 n& I' B8 \1 a8 W2 m    PfUnBindInterface(hInterface);
7 R; l& d8 o/ p    PfDeleteInterface(hInterface);
* p& z3 |/ O" e6 ?' c    return 0;
( M2 ^7 r+ a# N: }}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:19 , Processed in 0.034445 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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