|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。% Q, {2 R3 [9 z! i+ t, _) F
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593
3 F% o& T) b7 F0 {. s- c c4 r( C: s5 D/*
" m. X+ J! g, a7 j1 r1 w3 o- L利用操作系统提供的API编写防火墙.
; i! s& D6 @1 {# h该程序涉及到的API说明请访问微软的MSDN Library. K0 f f! a2 r
代码在C++ Builder 5编译通过, [$ J* E+ }& W$ f" E Y; G
如果您想和我交流请email:zzwinner@163.com; M* M/ T+ v% K( j9 E9 W- l: v8 c
*/5 [2 W/ f' Z6 Y' o, D2 r: b/ g
#pragma hdrstop
7 B! C1 Z0 n" o5 ^% V: Q#include "windows.h"9 r# A& i: o# I8 v6 m! X% g
#include "Fltdefs.h"1 U+ e& N1 _- ^7 b% ?
// 需要加载"iphlpapi.lib"
+ ~7 t' n/ M: t6 U& \/ h//---------------------------------------------------------------------------- I3 b6 h. }' Q% v; H
# u) P; s$ Q! X" y#pragma argsused! t) K- v* E$ ?% P2 H9 ~$ | t c
int main(int argc, char* argv[])8 O9 e, q; W b/ R1 O3 r5 F
{ s8 j" c% W, N" k
// 一个创建网络包过滤接口
' ?% z* E( N5 `4 b. [. w- ] INTERFACE_HANDLE hInterface;3 v9 l+ ?) ~: P L- N% f
PfCreateInterface(0,
: L S2 D( K9 m9 X* f3 W. P; y PF_ACTION_DROP,//PF_ACTION_FORWARD,
6 O/ K# P' M. B# c PF_ACTION_DROP,//PF_ACTION_FORWARD, : o2 V) u2 S( ~0 L
FALSE,
0 y& J% c: u3 K0 | TRUE, " V+ V# V. `. e; L' X! z1 Q
&hInterface);
6 p9 J2 t+ v2 P. s/ {" K) {6 i% ]2 [( g
/ j7 [4 R0 l2 C+ O // 绑定需要网络包过滤的IP地址
4 U6 Y1 K1 y# b! ~ BYTE localIp[] = {192,168,0,2};
) \8 b" N7 G4 R! \7 U PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
. A4 q; o4 v( s) G // 现在我们开始过滤HTTP协议的的接口
9 {4 k, N* Z2 Z' g FILTER_HANDLE fHandle;. x- v* q% s6 W. K- Z5 W E
// 填充过滤包的规则结构
: A) q2 ^% [' }, f5 D* z9 H PF_FILTER_DESCRIPTOR inFilter;+ w4 h; q% Z* ?
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值- c9 m7 |0 {$ b, b$ P/ N8 z
inFilter.dwRule = 0; //一直添这个值: O0 ?; u* Z: \0 j; n
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
9 |+ |) T8 f9 S$ ?5 o; N5 q3 x: Z inFilter.SrcAddr = localIp; //设置本地IP地址1 |2 Q9 H6 r1 C5 H- y& r- \% E
inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
& J( ?; ^ x! Z2 _* { inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口8 T$ Q, l1 e8 ~3 B; {# k* L# k
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
) o2 k) Z0 ]! T+ X" j inFilter.DstAddr = 0; //任意目标地址& C0 j0 y$ J3 A8 y4 a- ?
inFilter.DstMask = 0;8 h- N7 V, g1 S, C- a
inFilter.wDstPort = 80; //目标端口 80(http 服务)
. m: Y$ a7 R1 d& P v% G* f0 c* Z inFilter.wDstPortHighRange = 80;; S9 B9 h( q1 d( e! _
inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议
9 G E7 L( j ^- _ // 加入一个过滤接口* X, U% I" _5 G
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);6 s, O& k! \4 A- T r, a
// 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)( M5 n0 G+ ~& l" m; l; l4 s/ K
// 移除过滤接口
y2 M% d2 o6 B; {. e" P PfRemoveFilterHandles(hInterface, 1, &fHandle);
. x% [" `+ H* u7 N" E PfUnBindInterface(hInterface);
/ O+ b1 q4 ^6 ]- S! j PfDeleteInterface(hInterface);) J! o) x& j; O
return 0;9 y# k- o0 @" G$ w
} |
|