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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。+ r/ @0 m7 s2 C8 K7 Y3 r+ A6 B
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
  h( k+ L6 }9 t! l6 p/*/ Z! \) t% {+ `( ]# q) |& @0 Z
利用操作系统提供的API编写防火墙.
, \3 I, d$ `8 L8 g& c该程序涉及到的API说明请访问微软的MSDN Library. H2 W) D1 ]6 g$ f( ?) H+ K
代码在C++ Builder 5编译通过* P5 k: D$ M9 j2 Z, ?; V/ T) H! `
如果您想和我交流请email:zzwinner@163.com& z/ E  ]+ o* n: S
*/2 u7 k! H% N. ^2 \& r# ~: y
#pragma hdrstop
& d/ b* M- ?: m3 ]  c#include "windows.h"
: \+ Y" |- c+ M5 M4 J4 t#include "Fltdefs.h"( m: f% D) e0 E0 e. D
// 需要加载"iphlpapi.lib"
# o$ M1 s! k5 Z/ ^& h4 @8 d: g//---------------------------------------------------------------------------7 g( j3 z, t$ F5 [2 \' t

1 d( a) l- \, q9 y. A0 z* V0 E#pragma argsused8 J0 t- {, p) ~" U& x/ L
int main(int argc, char* argv[])  c- X% m# ?5 j
{
% N7 ?9 f& H+ E. u5 B    // 一个创建网络包过滤接口
1 F$ T; z) o( P) a) N    INTERFACE_HANDLE hInterface;
! |& ~6 K  X& C: o3 ^% w! d1 l    PfCreateInterface(0,
' e/ n! l) w1 b9 N/ [  f                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
% u* d8 r, S1 A' C                     PF_ACTION_DROP,//PF_ACTION_FORWARD,
. j: y* M- Z$ A, |4 W8 e/ l. F1 X, D                     FALSE, ; Y6 S& n, X3 z2 \4 v* L1 h" N
                     TRUE,
" B) K, h/ W  }; @) x                     &hInterface);2 g: K# v' I& X. Z3 e
8 m6 Y( @0 u6 o3 X
    // 绑定需要网络包过滤的IP地址$ n8 _1 z" Y& C) p4 n# E& d
    BYTE localIp[] = {192,168,0,2};
7 c' O8 j( y* }' k) C# f! e& ~    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
7 L# x/ Y7 G, ?: W/ _( Z9 F    // 现在我们开始过滤HTTP协议的的接口" F$ q/ I/ O0 `2 C; l
    FILTER_HANDLE fHandle;! y5 \9 ?; k) M* S+ G
    // 填充过滤包的规则结构
9 V. c( _9 G9 @$ M    PF_FILTER_DESCRIPTOR inFilter;  d/ \4 q7 b" z  Y
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值4 \1 S& j9 N5 H, w; i
    inFilter.dwRule = 0; //一直添这个值$ L) D  o. U5 u' s, b# O
    inFilter.pfatType = PF_IPV4; //用 ipV4 地址9 B5 a' G4 T. g: A& f
    inFilter.SrcAddr = localIp; //设置本地IP地址: F  Z: G) V# b+ ~9 j0 {# ^( @
    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码: W. X' M. ?5 x( f4 D0 [, n
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
  A" ]) c  W, d    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
, k2 ?0 B, K( J1 T: Q9 `, r3 B    inFilter.DstAddr = 0; //任意目标地址0 x& W# Z' J" ]3 r1 m% g- W
    inFilter.DstMask = 0;
1 p$ J2 ^9 k# k" j* |- g    inFilter.wDstPort = 80; //目标端口 80(http 服务)
' `# }9 Z$ U) {. e2 t6 a, e    inFilter.wDstPortHighRange = 80;( G8 r  {0 G5 T+ `$ \
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议  F0 x3 c- t' n& ]7 l" f
    // 加入一个过滤接口0 U+ q: d, U4 B
    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
+ i* _- b1 `& b; m9 w( m; S    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
5 H( L9 J' m, W( c3 ?8 |4 M* Y    // 移除过滤接口' u! q, r# G  t+ l9 Y
    PfRemoveFilterHandles(hInterface, 1, &fHandle);
" S5 \) _& S; v; H# F    PfUnBindInterface(hInterface);
: w" x4 |- B! G4 S5 Q) X+ v    PfDeleteInterface(hInterface);
' [) F! Y6 p. H* h    return 0;* q! z* C1 z0 @& N+ d) h
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-15 15:11 , Processed in 0.017328 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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