|
|
作者: zzwinner ,如转载请保证本文档的完整性,并注明出处。
7 g. P+ ^6 B' w; N' J欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=593; z. W }# p6 ?) u8 V
/*5 f' X7 q+ B- G7 O( E, m% E
利用操作系统提供的API编写防火墙.! S) T$ Q' F' ~
该程序涉及到的API说明请访问微软的MSDN Library
& E4 M* T- O2 l0 `6 u1 B! l代码在C++ Builder 5编译通过% W0 j6 G, ~- A
如果您想和我交流请email:zzwinner@163.com
6 z# U! n$ H1 E/ R! \ V*/
5 l+ L* M% Q2 r7 t+ R0 t#pragma hdrstop
) ]0 y; ~2 U- P. a#include "windows.h"
, l9 o% z+ N( R( d/ E4 |4 g9 X! x$ h#include "Fltdefs.h": c# C/ R+ I5 S- j# e, Z7 o
// 需要加载"iphlpapi.lib"
R& D6 X1 N/ c. z//---------------------------------------------------------------------------
, [9 ?$ ?) D' h' _ g5 Y& G/ p$ ^) g0 A0 y
#pragma argsused2 f) r$ T' E |" L
int main(int argc, char* argv[])- `; _: i3 G0 L6 K8 A% G* ?
{5 r/ ~( |! F1 R9 X
// 一个创建网络包过滤接口
E+ v* w" F; m _7 u z3 ` INTERFACE_HANDLE hInterface;& _) a2 U; J0 }' u* o
PfCreateInterface(0, 4 A) v4 X8 b G6 ]4 f, g
PF_ACTION_DROP,//PF_ACTION_FORWARD,
6 @) ^. N( `! Z7 w PF_ACTION_DROP,//PF_ACTION_FORWARD,
8 G' U/ l, ] R# U) L. i7 \8 I) o FALSE,
" s q2 P6 }3 ]/ R: \ TRUE,
4 x+ m" S4 P* g0 I6 _* o4 G2 q &hInterface);
/ _0 W& x/ m/ V. _- {
# v- b/ e4 M [- ]2 F0 t // 绑定需要网络包过滤的IP地址# }6 R( W: u" ~# Q
BYTE localIp[] = {192,168,0,2};3 _* W) d2 a& r+ z
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
8 O0 d8 ] F9 l2 v // 现在我们开始过滤HTTP协议的的接口: f1 ^+ H* z/ l9 m
FILTER_HANDLE fHandle;
1 h1 L) V! |) o // 填充过滤包的规则结构$ k7 ?' j9 Z/ K3 R0 t
PF_FILTER_DESCRIPTOR inFilter;
: }8 s: U a6 z8 p3 f6 j, {$ M inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
4 R9 M7 k+ m7 O' _$ s! V inFilter.dwRule = 0; //一直添这个值3 B# m" D8 E, l5 B( c; ^1 P
inFilter.pfatType = PF_IPV4; //用 ipV4 地址. o* {& h! w9 f8 X
inFilter.SrcAddr = localIp; //设置本地IP地址
3 \& V1 a# L+ k1 _8 z0 x inFilter.SrcMask = "\xff\xff\xff\xff"; //设置本地子网掩码
4 Y$ Y9 @6 X# F9 g" t inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口5 a9 F+ \- F/ o
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
: v# @, j9 K3 |. o inFilter.DstAddr = 0; //任意目标地址
/ o3 [4 A9 a3 w/ y inFilter.DstMask = 0;5 m- `/ G+ |) n
inFilter.wDstPort = 80; //目标端口 80(http 服务) B- d1 x2 e4 f# Y" ]( U) ?% M
inFilter.wDstPortHighRange = 80;
7 z% j6 q. Y0 q: P inFilter.dwProtocol = FILTER_PROTO_TCP; // 过滤的协议0 j6 P, ?' p/ B* b( a" [- D
// 加入一个过滤接口
) Y! B/ N+ ~ ?( J9 a. k PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
' `3 y+ l* T7 ?, @2 D // 请在这设置一个调试断点,然后看看你的IE是否不能访问WEB页. :)" Y; P: j; H" D1 M7 z8 Q6 j0 n9 J
// 移除过滤接口- T' Q: \2 q9 L) n ]
PfRemoveFilterHandles(hInterface, 1, &fHandle);: p9 z4 U* t5 f4 b3 J, g
PfUnBindInterface(hInterface);# t* ?/ F$ n g- [* g: m3 b' p
PfDeleteInterface(hInterface);9 A, a- H# I+ F3 [9 @/ ?
return 0;, |, o7 O: C% Y
} |
|