|
|
作者: 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
} |
|