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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。5 D2 V% @# b  I; @3 p0 Z
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5938 p" h& l4 J% j8 i- @! w  n  K4 }
/*6 D8 d5 G% A3 @/ k! b" p
利用操作系统提供的API编写防火墙.) M2 c& h. R' ]
该程序涉及到的API说明请访问微软的MSDN Library
; \8 [, @  s' \, g代码在C++ Builder 5编译通过1 r$ @9 r1 `* b0 {) a( E% s
如果您想和我交流请email:zzwinner@163.com
+ B( n. g2 @1 a5 N# m1 G5 R. g*/& M. X% p! P7 C
#pragma hdrstop) y  _- `; @2 O( b# j
#include "windows.h"
. R; r/ F3 G4 {4 V. e#include "Fltdefs.h"$ G; y# P8 |6 ?+ O
// 需要加载"iphlpapi.lib"
5 @) T" z9 H3 U$ m; p/ ?//---------------------------------------------------------------------------( w0 V1 r$ Q, `2 K* [( {! ~* J

) t# n: }/ J3 L, P- q7 {( ~#pragma argsused- I0 I! e0 z! l* B% e% S2 a9 A
int main(int argc, char* argv[]); r0 `2 H& t7 Q5 U* E. f8 x
{
" M2 J. O/ m( e' S  Q* N# d' R    // 一个创建网络包过滤接口
# O  `7 T& L; \    INTERFACE_HANDLE hInterface;
/ C0 E6 P" r! t% y( c    PfCreateInterface(0, 6 ~8 a! @0 U8 @
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,3 d6 E3 u/ C9 P- _; i
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
6 x0 q7 O# o/ E3 T8 P6 j                     FALSE,
" N- n! P" G- C& Z                     TRUE,
. V5 k7 ]1 b/ ]$ A$ x                     &hInterface);5 L$ Z! y0 f1 f) {' {
* _) X7 g! m: W8 W5 F
    // 绑定需要网络包过滤的IP地址( R3 ~9 V$ O+ s* m) `8 y
    BYTE localIp[] = {192,168,0,2};- T0 P# Z: }! }. f2 u8 A  A) u
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
, v! Z4 Z1 \# w    // 现在我们开始过滤HTTP协议的的接口0 b; ^6 v9 A' |+ q! s$ M
    FILTER_HANDLE fHandle;
5 |9 J. s7 K5 Q5 N3 e# n( p    // 填充过滤包的规则结构" s% f2 z6 s' p- p
    PF_FILTER_DESCRIPTOR inFilter;: L- a+ I6 l, `% _4 }# }) E- ?- S+ E
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值  ^$ C; m% J. c$ x; C
    inFilter.dwRule = 0; //一直添这个值
9 D/ y( y+ S3 {+ n2 y6 S    inFilter.pfatType = PF_IPV4; //用 ipV4 地址
6 m. W7 t# ?8 f6 B+ L/ v  I3 f    inFilter.SrcAddr = localIp; //设置本地IP地址( N4 ]8 N. [1 @
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码7 e6 @+ Y2 r, g) ^8 H. \7 s
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
5 t6 x+ k# G  Z, G$ R8 e    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
* w/ B  ?6 ^0 {    inFilter.DstAddr = 0; //任意目标地址3 z3 v2 Z1 I7 b/ f
    inFilter.DstMask = 0;; T; B, a/ {' E4 g( i
    inFilter.wDstPort = 80; //目标端口 80(http 服务)9 C& f& b7 }! o. ]5 V  D" x
    inFilter.wDstPortHighRange = 80;$ t# ~# T- k7 ]
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议. D) @# Z, Q6 n9 o
    // 加入一个过滤接口
0 _! E: A* b$ Z7 D+ I- F% Z    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);+ V0 B: N, w+ }  {0 H: d, w
    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
7 L; G, Q' k. c* C- |  q    // 移除过滤接口3 a. u2 W$ _4 v( c" ]
    PfRemoveFilterHandles(hInterface, 1, &fHandle);
- k1 A! m8 g9 T# M! {6 v2 F2 z    PfUnBindInterface(hInterface);$ t* _  G1 x8 C% i) q0 ~! W
    PfDeleteInterface(hInterface);5 K4 p# }# j; q  N- K6 i- S
    return 0;
1 y# n8 Y* H: u# y! h* t( h}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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