议题提交:kiki
信息来源:邪恶八进制安全小组技术论坛
这是一段利用windows api实现的包过滤口,
现在就几个问题讨论一下:
1:PF_FILTER_DESCRIPTOR 结构中的各个成员该如何初始化?原文是这样的:
inFilter.dwFilterFlags = FD_FLAGS_NOSYN; //always this value
inFilter.dwRule = 0; //always this value
inFilter.pfatType = PF_IPV4; //using ipV4 addresses
inFilter.SrcAddr = localIp; //set local ip
inFilter.SrcMask = "\xff\xff\xff\xff"; //mask for local ip//注意:掩码始终是这个吗?
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY; //any source port//注意:在过滤icmp包的 时候这里会是另外的参数,以及这里是否可以定义非本机的ip,即过滤进入本机的数据呢?
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;//
inFilter.DstAddr = 0; //any destination
inFilter.DstMask = 0; //注意:掩码又变成0 了
inFilter.wDstPort = 80; //destination port 80(http service)
inFilter.wDstPortHighRange = 80;
inFilter.dwProtocol = FILTER_PROTO_TCP; // Tcp protocol
事实上在我自己机器上实验的时候,不论定义的哪个端口或者ip,,程序几乎会拦截几乎所有的数据包...而不是根据我所定义的规则来进行拦截.不知道问题出在哪里...
比如下面是拦截所有icmp包的程序,结果会拦截所有数据包.我试着换过适当的掩码以及其他一些值,结果都是一样的.请高手解答:)
#include "stdio.h"
#include "windows.h"
#include "Fltdefs.h"
#pragma comment(lib,"iphlpapi.lib")
//---------------------------------------------------------------------------
//#pragma argsused
int main(int argc, char* argv[])
{
// 一个创建网络包过滤接口
INTERFACE_HANDLE hInterface;
PfCreateInterface(0,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
PF_ACTION_DROP,//PF_ACTION_FORWARD,
FALSE,
TRUE,
&hInterface);
// 绑定需要网络包过滤的IP地址
BYTE localIp[] = {10,0,0,8};//本机ip
BYTE localMask[] = { 255,0,0,0};
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 = 0; //设置本地IP地址
inFilter.SrcMask = 0; //设置本地子网掩码
inFilter.wSrcPort = FILTER_ICMP_TYPE_ANY ; //任意来源端口
inFilter.wSrcPortHighRange = 0;
inFilter.DstAddr = 0; //任意目标地址
inFilter.DstMask = 0;
inFilter.wDstPort = FILTER_ICMP_CODE_ANY; //目标端口 80(http 服务)
inFilter.wDstPortHighRange = 0;
inFilter.dwProtocol = FILTER_PROTO_ICMP; // 过滤的协议
// 加入一个过滤接口
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
getchar();
// 移除过滤接口
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
return 0;
}