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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。% Q, {2 R3 [9 z! i+ t, _) F
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
3 F% o& T) b7 F0 {. s- c  c4 r( C: s5 D/*
" m. X+ J! g, a7 j1 r1 w3 o- L利用操作系统提供的API编写防火墙.
; i! s& D6 @1 {# h该程序涉及到的API说明请访问微软的MSDN Library. K0 f  f! a2 r
代码在C++ Builder 5编译通过, [$ J* E+ }& W$ f" E  Y; G
如果您想和我交流请email:zzwinner@163.com; M* M/ T+ v% K( j9 E9 W- l: v8 c
*/5 [2 W/ f' Z6 Y' o, D2 r: b/ g
#pragma hdrstop
7 B! C1 Z0 n" o5 ^% V: Q#include "windows.h"9 r# A& i: o# I8 v6 m! X% g
#include "Fltdefs.h"1 U+ e& N1 _- ^7 b% ?
// 需要加载"iphlpapi.lib"
+ ~7 t' n/ M: t6 U& \/ h//---------------------------------------------------------------------------- I3 b6 h. }' Q% v; H

# u) P; s$ Q! X" y#pragma argsused! t) K- v* E$ ?% P2 H9 ~$ |  t  c
int main(int argc, char* argv[])8 O9 e, q; W  b/ R1 O3 r5 F
{  s8 j" c% W, N" k
    // 一个创建网络包过滤接口
' ?% z* E( N5 `4 b. [. w- ]    INTERFACE_HANDLE hInterface;3 v9 l+ ?) ~: P  L- N% f
    PfCreateInterface(0,
: L  S2 D( K9 m9 X* f3 W. P; y                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
6 O/ K# P' M. B# c                     PF_ACTION_DROP,//PF_ACTION_FORWARD, : o2 V) u2 S( ~0 L
                     FALSE,
0 y& J% c: u3 K0 |                     TRUE, " V+ V# V. `. e; L' X! z1 Q
                     &hInterface);
6 p9 J2 t+ v2 P. s/ {" K) {6 i% ]2 [( g
/ j7 [4 R0 l2 C+ O    // 绑定需要网络包过滤的IP地址
4 U6 Y1 K1 y# b! ~    BYTE localIp[] = {192,168,0,2};
) \8 b" N7 G4 R! \7 U    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
. A4 q; o4 v( s) G    // 现在我们开始过滤HTTP协议的的接口
9 {4 k, N* Z2 Z' g    FILTER_HANDLE fHandle;. x- v* q% s6 W. K- Z5 W  E
    // 填充过滤包的规则结构
: A) q2 ^% [' }, f5 D* z9 H    PF_FILTER_DESCRIPTOR inFilter;+ w4 h; q% Z* ?
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值- c9 m7 |0 {$ b, b$ P/ N8 z
    inFilter.dwRule = 0; //一直添这个值: O0 ?; u* Z: \0 j; n
    inFilter.pfatType = PF_IPV4; //用 ipV4 地址
9 |+ |) T8 f9 S$ ?5 o; N5 q3 x: Z    inFilter.SrcAddr = localIp; //设置本地IP地址1 |2 Q9 H6 r1 C5 H- y& r- \% E
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
& J( ?; ^  x! Z2 _* {    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口8 T$ Q, l1 e8 ~3 B; {# k* L# k
    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
) o2 k) Z0 ]! T+ X" j    inFilter.DstAddr = 0; //任意目标地址& C0 j0 y$ J3 A8 y4 a- ?
    inFilter.DstMask = 0;8 h- N7 V, g1 S, C- a
    inFilter.wDstPort = 80; //目标端口 80(http 服务)
. m: Y$ a7 R1 d& P  v% G* f0 c* Z    inFilter.wDstPortHighRange = 80;; S9 B9 h( q1 d( e! _
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
9 G  E7 L( j  ^- _    // 加入一个过滤接口* X, U% I" _5 G
    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);6 s, O& k! \4 A- T  r, a
    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)( M5 n0 G+ ~& l" m; l; l4 s/ K
    // 移除过滤接口
  y2 M% d2 o6 B; {. e" P    PfRemoveFilterHandles(hInterface, 1, &fHandle);
. x% [" `+ H* u7 N" E    PfUnBindInterface(hInterface);
/ O+ b1 q4 ^6 ]- S! j    PfDeleteInterface(hInterface);) J! o) x& j; O
    return 0;9 y# k- o0 @" G$ w
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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