|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。5 x# C, u2 s4 O" K% R) @
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5934 Z3 Q3 V7 o6 E* a
/*% Z, R: A" i$ ~- e! M6 _/ n' R
利用操作系统提供的API编写防火墙.: Z: Y0 U0 M) E/ @% @
该程序涉及到的API说明请访问微软的MSDN Library* E# x" `% l% A& F. p+ i
代码在C++ Builder 5编译通过
* g* x: b4 U0 L( O如果您想和我交流请email:zzwinner@163.com. o! `) u+ {; p" J
*/
# ?* C- Y5 W3 S! o& G1 u#pragma hdrstop* H7 W' @- X: ^# E$ x
#include "windows.h"7 Q0 _9 _7 S% L' f/ B) L
#include "Fltdefs.h"- J/ v9 d3 R) |8 E
// 需要加载"iphlpapi.lib"
" x/ T4 I- q0 H' G, ^7 Q# H( ?//---------------------------------------------------------------------------; ]7 f9 c$ W% i; N1 E+ b
- _1 t' ^6 L+ L
#pragma argsused
+ ?" m7 ^; a& [0 iint main(int argc, char* argv[])/ O" J0 X2 ^& H, G
{
1 \$ X+ |$ c: G$ |$ `5 t // 一个创建网络包过滤接口5 R% ^8 T. v A9 e2 e! \& D o+ z8 N! s
INTERFACE_HANDLE hInterface;
! z" l$ M" C* w) a( g PfCreateInterface(0,
1 M* a! F. S& u. |: H PF_ACTION_DROP,//PF_ACTION_FORWARD,
* A0 @+ \/ v+ n% Y PF_ACTION_DROP,//PF_ACTION_FORWARD,
" {7 d5 Q* W6 g9 x1 \/ U4 N z! w FALSE,
# l) d8 h2 s8 H- J TRUE,
* M& x* `+ { z) ]/ E* s &hInterface);2 k' q* T6 n3 u: k1 Y
" y! P+ i, q- r' {; s // 绑定需要网络包过滤的IP地址- Y8 N5 o ?1 I3 J/ d3 ?: g
BYTE localIp[] = {192,168,0,2};' o+ T: z1 j, f- B2 Y7 D$ p8 L
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
& n" {$ q% D1 k# ~" y9 O" Q // 现在我们开始过滤HTTP协议的的接口0 o% M5 N2 O/ K/ M4 J3 I$ F H' _1 L
FILTER_HANDLE fHandle;0 d S8 d. u8 |
// 填充过滤包的规则结构
; K; U! N" ] }. } h$ o PF_FILTER_DESCRIPTOR inFilter;
" W2 z& P# z0 u inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
0 v' o# ~# Q+ f( K inFilter.dwRule = 0; //一直添这个值# I: N; b& E/ H. M. ]
inFilter.pfatType = PF_IPV4; //用 ipV4 地址/ ?* g8 l# n G. C8 J) U
inFilter.SrcAddr = localIp; //设置本地IP地址
6 D9 T& G v; Q6 O; p( F$ g7 w inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
) v1 n9 V- q- W O6 q0 Y inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口% g8 M' V5 D% x( t
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
0 }- g* t# G: u- p inFilter.DstAddr = 0; //任意目标地址5 L. Q' x/ d5 ^. Z
inFilter.DstMask = 0;# L p! b! y: c) S2 V) m
inFilter.wDstPort = 80; //目标端口 80(http 服务)! t! p1 {* { |6 E
inFilter.wDstPortHighRange = 80;
/ a+ }, @9 S) z" l) M4 d k inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
2 ]: a- j1 h' F // 加入一个过滤接口% D( ], q* ^3 e- u3 u
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
/ w* r" z- L/ u& Y // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)
^# V% o0 B6 p- } // 移除过滤接口) |! I% h0 |* E0 t2 o/ B+ i$ c
PfRemoveFilterHandles(hInterface, 1, &fHandle);9 r7 ~2 q& w M; j6 C/ U" N9 t$ w
PfUnBindInterface(hInterface);% d' V( h0 ?( m" p5 S7 X; s
PfDeleteInterface(hInterface);
7 v6 [. M- g' V J( h( } s return 0;
6 ^8 c: e- Q u% q} |
|