发新话题
打印

[讨论]有关windows下包过滤编程实现

[讨论]有关windows下包过滤编程实现

议题提交: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;
}
源静则流清 本正则丰茂 内修则外理 形端则影直

TOP

不知道你的问题是什么,代码也没时间调试了,就你的这段话给点意见.

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这里是设置本地IP,下面一个是设置本地掩码,src......你这个地方有设置,而你给的源代码这里却是0..
inFilter.SrcMask      = "\xff\xff\xff\xff";  //mask for local ip//注意:掩码始终是这个吗? 我想你的掩码是什么这里就是什么,你下面源代码这里应该写"localMask",是你自己定义的掩码,这里的xff其实就是255.
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 了这里和上面一个是设置远程(DST)IP和掩码的,设置0,表示接受远程所有的机器的数据
inFilter.wDstPort      = 80;  //destination port 80(http service)
inFilter.wDstPortHighRange  = 80;
inFilter.dwProtocol     = FILTER_PROTO_TCP;  // Tcp protocol
流氓会武术,谁都挡不住. http://hi.baidu.com/zvrop

TOP

感谢楼上的仔细阅读问题,是这样的:

inFilter.SrcAddr     = localIp;  //set local ip这里是设置本地IP,下面一个是设置本地掩码,src......你这个地方有设置,而你给的源代码这里却是0..
-----事实上,我试过用自己的本地ip赋过,问题是拦截所有包

inFilter.SrcMask     = "\xff\xff\xff\xff";  //mask for local ip//注意:掩码始终是这个吗? 我想你的掩码是什么这里就是什么,你下面源代码这里应该写"localMask",是你自己定义的掩码,这里的xff其实就是255.
-----这里我试过正确的掩码,如果全部为255是否也行呢?我试过好象也不行,问题都是什么包都拦截

inFilter.wSrcPort     = FILTER_TCPUDP_PORT_ANY; //any source port//注意:在过滤icmp包的 时候这里会是另外的参数,以及这里是否可以定义非本机的ip,即过滤进入本机的数据呢?这个地方是设置端口的.......-_-..
-----是的,可是设置了一个断口,其他端口都会拦截


刚开始偶也以为按照参数的定义来设置就可以进行正确的拦截,但是后来发现会拦截所有的包,而不管你怎么定义拦截的规则,所以楼上你能不能调试一下呢,,小弟我也是实在没办法了...
源静则流清 本正则丰茂 内修则外理 形端则影直

TOP

接口以:PfCreateInterface PF_ACTION_FORWARD 开始
论坛地址: http://www.ssk2.cn & www.iisuser.com

TOP

引用:
inFilter.SrcAddr = 0; //设置本地IP地址
  inFilter.SrcMask = 0; //设置本地子网掩码
inFilter.wSrcPort = FILTER_ICMP_TYPE_ANY ; //任意来源端口
这里本地ip和掩码好象还没填入呢。
引用:
  inFilter.wDstPort = FILTER_ICMP_CODE_ANY; //目标端口 80(http 服务)
  inFilter.wDstPortHighRange = 0;
这里感觉有问题。


不太清楚原代码的目的是监听本机端口发送到目标80的数据呢还是过滤(阻止)本地发送到目标80端口的数据。
引用:
inFilter.wSrcPort      = FILTER_TCPUDP_PORT_ANY; //any source port//注意:在过滤icmp包的 时候这里会是另外的参数,以及这里是否可以定义非本机的ip,即过滤进入本机的数据呢?
这里把源和目标的相关地址调换应该可以实现你的想法。

TOP

还有,看到楼主前面的内容令我立刻想起ACL的默认deny all规则以及这里的掩码到底是正常掩码还是使用反掩码?

TOP

发新话题