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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。' `. f  L% c  a! j' M  d( g
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
. }$ ?1 u0 Z& I  w% t5 j/*
" F" @4 c6 p# K7 B3 q利用操作系统提供的API编写防火墙.
. A; W, s: U# Q2 y该程序涉及到的API说明请访问微软的MSDN Library! O. i+ z7 Z. P
代码在C++ Builder 5编译通过
% @# D: M; n$ [' @. W如果您想和我交流请email:zzwinner@163.com
$ K4 R8 |. ^6 [0 h) @*/. l, M0 ~$ g6 a# Z
#pragma hdrstop
6 C* R/ y* C2 m( R2 m#include "windows.h"/ J1 q, F1 ]* M6 X
#include "Fltdefs.h"
" q5 s7 j3 K; z4 l- X1 o// 需要加载"iphlpapi.lib"4 n7 ~7 H' E) o7 J0 S& l
//---------------------------------------------------------------------------/ F1 z/ {% g" w8 u

1 ]1 ~* H7 `8 Z8 \' R#pragma argsused
- C$ R8 W; Y, c0 |int main(int argc, char* argv[])
* P9 d3 ]- k1 m% c0 R$ B; f5 |{
; r0 Q3 e- k( R- B1 m" b& O! p    // 一个创建网络包过滤接口' W' Y& X/ d5 s
    INTERFACE_HANDLE hInterface;
/ R( F5 t$ _+ u( J$ I) n* [0 }- E    PfCreateInterface(0, " ]; v  y8 ~# U5 Q
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,: [  _0 u, J$ c  U* F3 U: A
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
$ B+ K) P) f. I8 P( N  y2 C                     FALSE,
) O# U* I( n; K0 K- k                     TRUE,
: v: H4 t" X+ I/ r% v4 b                     &hInterface);+ k3 m* R& r% a: @1 k' @" N" Z2 o. R
* A2 Q( R' D& U/ H
    // 绑定需要网络包过滤的IP地址6 l- g& F7 g) O: h& Q" y
    BYTE localIp[] = {192,168,0,2};/ ]2 F( C( h8 |# O3 P
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
' I8 y( E' G0 z; d1 j( L& ?# `6 y    // 现在我们开始过滤HTTP协议的的接口7 |9 Y/ E. ^- r! B9 E* M0 j+ ?
    FILTER_HANDLE fHandle;
+ C1 c9 t: l: s* ]9 V0 W; X    // 填充过滤包的规则结构
2 r1 |! V) P, n; F* c! d3 J    PF_FILTER_DESCRIPTOR inFilter;
9 O8 E6 C9 v  s8 w2 z    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
+ f0 `+ H" t5 \    inFilter.dwRule = 0; //一直添这个值! v% H5 R7 o; ^% ^4 `
    inFilter.pfatType = PF_IPV4; //用 ipV4 地址0 ?) g1 E( H0 ]6 O
    inFilter.SrcAddr = localIp; //设置本地IP地址! T. A. X$ j9 [1 }# y, X
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
. e+ J% _$ H3 z7 l    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
1 t5 k: ]: q. N    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
- ^+ ?9 ~3 ^7 r/ w) n9 q    inFilter.DstAddr = 0; //任意目标地址3 _% v7 i5 m6 b2 E. w8 Z% U" ^
    inFilter.DstMask = 0;- D8 n( R$ j% X" A8 U' I
    inFilter.wDstPort = 80; //目标端口 80(http 服务)* `' Q* C$ o( N5 r5 n
    inFilter.wDstPortHighRange = 80;
0 {. U1 l  N- @" e    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
6 r- Z" {& p4 h/ A1 x5 k' @# n! @& @    // 加入一个过滤接口* q3 b9 c  a" K; K# B, b" ~
    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);3 s$ p' _5 P$ q* L" k7 K
    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
+ {2 H7 Q/ @6 L7 R6 h; r0 a    // 移除过滤接口* n* S/ Y! B3 s4 j  p, K! m
    PfRemoveFilterHandles(hInterface, 1, &fHandle);
% S, E: p' y2 ?6 H    PfUnBindInterface(hInterface);. L& Z( I2 w6 _/ s9 O$ ^' X- A
    PfDeleteInterface(hInterface);
7 h3 n. Y+ t5 m( _9 r+ U7 e0 y    return 0;  H. F7 n( S: A" Q4 a% t6 F
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 11:20 , Processed in 0.016100 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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