免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2165 | 回复: 0
打印 上一主题 下一主题

设置网卡混杂模式实现方法的整理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-04 16:47 |只看该作者 |倒序浏览
好的东西一定要转载:
关于设置网卡的混杂模式的实现方法,很多地方都有提及,现在也能搜集到很多具体的实现方法的代码,在此
只是搜集整理,有的是从文章中摘录,有的就直接从其他代码中抽取,希望对大家的能有所帮助。
一、在普通程序中设置网卡混杂模式。
    在普通程序中普遍用ioctl函数来设置,该函数很值得大家好好的了解,因为它的使用非常的广泛。下面
给出设置网卡混杂模式的实现代码:
      #include
      #include
      #include
      #include
      int set_all_promisc()
      {
            struct ifreq ifaces[16];
            struct ifconf param;
            int sock, i;
            param.ifc_len = sizeof(ifaces);
            param.ifc_req = ifaces;
            sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
            if (sock flags;
                old_gflags  = sniffer_dev->gflags;
                /*
                 * 参看net/core/dev.c里的dev_change_flags()
                 * ->gflags的作用是避免多次重复设置混杂模式,没有其他特别含义
                 */
                /* 设置混杂模式 */
                sniffer_dev->flags  |= IFF_PROMISC;
                sniffer_dev->gflags |= IFF_PROMISC;
                start_bh_atomic();
                /* 注意,这个回调函数还是会报告 eth0: Setting promiscuous mode. */
                sniffer_dev->set_multicast_list( sniffer_dev );
                end_bh_atomic();
            }
            ......
            return 0;
      }
      void cleanup_module(void)
      {
            ......
            if (sniffer_dev != NULL)
            {
                  /* 恢复原有模式 */
                  sniffer_dev>flags  = old_flags;
                  sniffer_dev>gflags = old_gflags;
                  start_bh_atomic();
                  sniffer_dev>set_multicast_list( sniffer_dev );
                  end_bh_atomic();
            }
            ......
      }
    2.在kernel-2.4.x 中
          在2.4中有了许多变化,首先struct device结构改为struct net_device, 再者dev_get
      功能改为测试网络设备是否存在,真正的设置网络混杂模式的函数改为
            void dev_set_promiscuity(struct net_device *dev, int inc);
      其中根据inc的值来设置混杂模式还是恢复原来设置模式,通过计数来恢复原来模式,这样的好处就是
      不会和其他的程序冲突,不在像上述两种实现方式中恢复原来模式就全恢复了,不管还有没有其他的程
      序是否也设置了混杂模式。现在就通过计数来恢复原来的模式,只要当计数相加为零才设置成普通模式。
      linux源代码的注释如下:
      /**
      *      dev_set_promiscuity      - update promiscuity count on a device
      *      @dev: device
      *      @inc: modifier
      *
      *      Add or remove promsicuity from a device. While the count in the device
      *      remains above zero the interface remains promiscuous. Once it hits zero
      *      the device reverts back to normal filtering operation. A negative inc
      *      value is used to drop promiscuity on the device.
      */
      设置网卡混杂模式的实现代码如下:
        struct net_device *sniffer_dev = NULL;
      int dev_flags = 0;
      int init_module ( void )  /* 模块初始化 */
      {
            ......
            sniffer_dev = dev_get_by_name("eth0");
            if (sniffer_dev != NULL)
            {
                  dev_flags = 1;
                  dev_set_promiscuity(sniffer_dev, 1);
                  dev_put(sniffer_dev);
                  sniffer_dev = NULL;
            }
            ......
            return 0;
      }
      void cleanup_module(void)
      {
            ......
            if (dev_flags)
            {
                  sniffer_dev = dev_get_by_name("eth0");
                  if (sniffer_dev != NULL)
                  {
                        dev_flags = 0;
                        dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/
                        dev_put(sniffer_dev);
                        sniffer_dev = NULL;
                  }
            }
            ......
      }
三、参考资料
      1.利用LLKM处理网络通信----对抗IDS、Firewall(修订)  小四
      2.libnids 源代码
      3.linux 源代码


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/1574/showart_39170.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP