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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。3 B' e& s, H) p3 Y  q# c
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
! ^% P# S- v3 ?/*  G) z7 C1 p" B* W5 ~" r
利用操作系统提供的API编写防火墙.
  ]  d7 _' n' B& v! _6 }该程序涉及到的API说明请访问微软的MSDN Library
  F- H8 c/ r8 O1 T6 U( o: R1 N/ F+ N代码在C++ Builder 5编译通过
/ U) X- @* `4 U如果您想和我交流请email:zzwinner@163.com5 x1 y2 m9 H! W& K& i) T1 I! @
*/
: Q2 D1 F: Q  k! ]  z3 S( ~! A+ R#pragma hdrstop
& f  w- T* h; v, V  D#include "windows.h"* J; [# A7 m; W! b4 |) t
#include "Fltdefs.h": ~# g8 Z8 ]) s5 `/ l$ ?# _8 y
// 需要加载"iphlpapi.lib"
% v, x% k8 o$ B$ `//---------------------------------------------------------------------------
4 D" r/ ?, I  N( ?; l9 J8 j3 x8 f+ ?
#pragma argsused
8 R; L) j0 o5 s( w- \int main(int argc, char* argv[])
7 `6 S/ L0 d* E- A: j, T$ D+ x* ^{
+ K5 ?. u( v  [& H; F    // 一个创建网络包过滤接口
3 w" P3 O- I1 T0 `9 W    INTERFACE_HANDLE hInterface;
( L9 P3 }! U8 A9 q6 b+ e9 q    PfCreateInterface(0,
4 V4 \2 P2 D: V: ?3 K; G; X; y                     PF_ACTION_DROP,//PF_ACTION_FORWARD,3 }. ]( @, R3 y/ A0 j. n1 I
                     PF_ACTION_DROP,//PF_ACTION_FORWARD, 4 q7 O4 s: h3 k/ k# h4 r% q9 m, R7 h
                     FALSE, ! |" W9 k2 v+ A- E( q* v: E
                     TRUE,
( K3 o8 g8 y% m' k7 d! _1 W                     &hInterface);( n9 ]$ N0 r0 Z0 N. @

- n' u  {7 L# o! _- z6 e4 _    // 绑定需要网络包过滤的IP地址- f# v( Q: \3 ~2 n) p; B
    BYTE localIp[] = {192,168,0,2};0 G9 r$ I9 j' a  Q/ O; `
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
% m0 u5 v* M& y, M" Q0 C' v7 @    // 现在我们开始过滤HTTP协议的的接口$ \+ d3 T7 t' l) W
    FILTER_HANDLE fHandle;
( j6 K: I, B* d; |8 a. |    // 填充过滤包的规则结构! I: r1 e$ L# n+ t' H( y
    PF_FILTER_DESCRIPTOR inFilter;3 w/ }  W% j  E3 G& ~3 k2 t
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值5 a, a1 }$ x3 q: L: x; A' l* x# ~
    inFilter.dwRule = 0; //一直添这个值
/ z. g# ^+ ?) y* N: E; m1 r    inFilter.pfatType = PF_IPV4; //用 ipV4 地址4 X6 f' @3 x2 \0 {0 ]( G& ^! a
    inFilter.SrcAddr = localIp; //设置本地IP地址
6 A' X7 j% w( r. o! B    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码+ a$ u. a4 f5 s6 c: m6 b% n
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
: K5 V2 y. r1 j$ l! ?, Q    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
4 g& X' t* w' }* M    inFilter.DstAddr = 0; //任意目标地址
7 n: b9 k% I8 |, c2 Y8 l    inFilter.DstMask = 0;
# L: X% J' ^& E4 R' i* Y    inFilter.wDstPort = 80; //目标端口 80(http 服务)
* ]1 B1 I% [$ P, Y  H) e2 [  k+ T9 ]    inFilter.wDstPortHighRange = 80;+ S! l2 P8 _  i# J! }
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
0 l. O3 T/ y9 l+ K; Q    // 加入一个过滤接口
. g  E5 M7 ~8 l0 D. Z    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
7 B5 J/ e1 W# G/ `1 _3 g8 I    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
1 ]2 Y) ]0 \8 F; U/ K    // 移除过滤接口
$ L$ z3 i$ `0 m) f* \    PfRemoveFilterHandles(hInterface, 1, &fHandle);
! ~7 {; n. S+ E2 Z. R, C" w    PfUnBindInterface(hInterface);! n. X0 Z( _& P! ^3 w8 ]/ i& ~1 D
    PfDeleteInterface(hInterface);
8 U! @, k  E/ i9 |5 ^" X& _6 J$ M  Z4 n    return 0;
, p3 B% K, g9 V# a6 a}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-6-18 09:19 , Processed in 0.017226 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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