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

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

[复制链接]
发表于 2004-2-15 13:24:35 | 显示全部楼层 |阅读模式
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
% n6 r- ]. ^, A6 J' s  N欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5936 w  }) U+ v- [( h. s1 M/ i
/*& i1 w8 x5 l! [
利用操作系统提供的API编写防火墙.& w5 a4 E) g# U
该程序涉及到的API说明请访问微软的MSDN Library0 A  q- o# G: y
代码在C++ Builder 5编译通过+ r" N* s; X, Z# L. Y
如果您想和我交流请email:zzwinner@163.com6 B1 o" S) c! O* j( F$ Q
*/
- I" r' ?1 I6 l  A#pragma hdrstop7 a2 y- M) ]- u! @, S, d
#include "windows.h"$ S# P4 p! k2 f/ l5 p
#include "Fltdefs.h"9 i! G  ?% a# e; X" q
// 需要加载"iphlpapi.lib"0 e; ]& I) @6 u$ y# _; T
//---------------------------------------------------------------------------
  s: _3 ]% D8 Y. _. _) Y5 P% h/ h( `
$ q0 V7 }- r. C& s#pragma argsused( \. v$ [% e' b& Y# r' F
int main(int argc, char* argv[])
) s7 U: ^& I" r4 N' g. G{, x/ m( o, ?1 O# \( b8 Q* e4 d
    // 一个创建网络包过滤接口
+ `$ B+ H. p! a% ~: v9 \    INTERFACE_HANDLE hInterface;( B; H0 x* i6 d/ I1 H( x' B9 _' J
    PfCreateInterface(0, + b& H2 h$ Z4 F! A% E# q0 m% P
                     PF_ACTION_DROP,//PF_ACTION_FORWARD,$ j9 \7 G) a- z( B2 t# Y3 e
                     PF_ACTION_DROP,//PF_ACTION_FORWARD, 0 R. J6 W5 {4 _5 s1 r
                     FALSE,
3 |8 {+ D0 @' |! N7 R                     TRUE, 0 g( f0 J. i7 }) N2 V/ X3 F! K
                     &hInterface);+ F! o3 W+ F9 }
4 Z, B  v/ i. L! w3 m9 j
    // 绑定需要网络包过滤的IP地址3 \7 U" a' C) U' Q' l# e8 ~% |& S
    BYTE localIp[] = {192,168,0,2};0 ^; d' Q3 O+ [  z
    PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
+ j. p2 f  @0 D0 c) n    // 现在我们开始过滤HTTP协议的的接口
4 j$ g$ ]2 l6 f: [- I6 V% f( x    FILTER_HANDLE fHandle;
5 n3 q, o5 @4 r: t6 j    // 填充过滤包的规则结构
9 M! S  c" K4 d) s: f  g: E3 N    PF_FILTER_DESCRIPTOR inFilter;$ ~5 y; X" I" F* Z- S
    inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
$ r6 V5 |3 E9 m% Z; {& f    inFilter.dwRule = 0; //一直添这个值
, m* s: D0 z! Y( [' q    inFilter.pfatType = PF_IPV4; //用 ipV4 地址8 i& X7 ]# M& A8 t3 r
    inFilter.SrcAddr = localIp; //设置本地IP地址
; i" G9 c6 r1 _0 z& @6 X: b/ h    inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码# t* h. o  V8 s. l$ n( L0 O/ c
    inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
8 T' r" J0 f/ G$ ]- u( Y- p6 f    inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;6 ]5 p/ {. e( h2 S
    inFilter.DstAddr = 0; //任意目标地址
4 f2 z% f2 U  N; z4 m    inFilter.DstMask = 0;
5 r% l2 n% H  U- X( [/ n    inFilter.wDstPort = 80; //目标端口 80(http 服务)  y1 j6 A+ D) B
    inFilter.wDstPortHighRange = 80;; x$ y1 G6 K$ X( w1 f
    inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
0 O7 y& T( `4 W0 A3 u5 s% K. t0 ~    // 加入一个过滤接口
/ t2 l3 [) R/ G7 n+ J3 K' c* V    PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
6 D- U; ^& D6 X1 f+ }, c    // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
1 t7 Y/ w+ c+ f    // 移除过滤接口8 [6 J, K( H1 g/ \
    PfRemoveFilterHandles(hInterface, 1, &fHandle);6 u9 v6 n' S# ~' [' w, k; b
    PfUnBindInterface(hInterface);
, d  U9 r9 ]; Y' E9 R    PfDeleteInterface(hInterface);
( E) [6 L1 c" Z7 p! p9 t2 u    return 0;$ t9 M2 z$ B- `9 j
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 21:30 , Processed in 0.035775 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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