Filter 的使用参考
http://blog.csdn.net/amh/archive/2004/11/09/173560.aspx
经过实践发现,其文中,功能看似达到了,但有一部分是不正确的.
DWORD err = NO_ERROR;
// 一个创建网络包过滤接口
INTERFACE_HANDLE hInterface;
PfCreateInterface(0,
PF_ACTION_FORWARD,//PF_ACTION_DROP,原文中使用了屏蔽所有包
PF_ACTION_FORWARD,//PF_ACTION_DROP,原文中使用了屏蔽所有包
//如果屏蔽所有,那么看似屏蔽成功了,但程序运行之后,后面的过滤规则的设定也就没有任何意义了;
FALSE,
TRUE,
&hInterface);
// 绑定需要网络包过滤的IP地址
BYTE localIp[] = {xx,xx,xx,xx};
BYTE DestIp[] = {xx,xx,xx,xx};
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
// 现在我们开始过滤HTTP协议的的接口
FILTER_HANDLE fHandle;
// 填充过滤包的规则结构
PF_FILTER_DESCRIPTOR inFilter;
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //一直添这个值
inFilter.dwRule = 0; //一直添这个值
inFilter.pfatType = PF_IPV4; //用 ipV4 地址
inFilter.SrcAddr = localIp; //设置本地IP地址
inFilter.SrcMask = (PBYTE)"/xff/xff/xff/xff"; //设置本地子网掩码
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //任意来源端口
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
inFilter.DstAddr = DestIp;
inFilter.DstMask = (PBYTE)"/xff/xff/xff/xff";
inFilter.wDstPort = 80;
inFilter.wDstPortHighRange = 80;
inFilter.fLateBound = LB_SRC_ADDR_USE_DSTADDR_FLAG|LB_DST_ADDR_USE_DSTADDR_FLAG;
inFilter.dwProtocol = FILTER_PROTO_ANY;
// 加入一个过滤接口,加在包过滤的出口上面,在原文中加到了入口上,所以是不会有效果的
// OutFilter才是关于本机的包过滤规则的正确放置位置
PfAddFiltersToInterface(hInterface, 0, NULL,1, &inFilter, &fHandle);
if(err != NO_ERROR)
{
TRACE("PfAddFiltersToInterface is Wrong/n");
return ;
}
//在这个地方弹出对话框中断程序,测试是否运行成功
MessageBox("Filter Enabled!");
// 移除过滤接口
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
希望对大家能够有所帮助!