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