win检测当前网卡是否处于混杂模式



检测当前网卡是否处于混杂模式

    今天比较巧,刚刚把重起网卡的文章贴上来,就有同事要我写个检测网卡混杂模式的小工具。本以为WinPCap会提供此功能,但翻了一遍Packet32.c和其驱动代码后,发现居然没有提供接口。只好下班、跑步、吃饭,然后老老实实google找解决方法,呵呵
     实际上方法很简单,打开一个网卡设备,查询其全局统计信息(IOCTL_NDIS_QUERY_GLOBAL_STATS),然后判断相应的标志位(NDIS_PACKET_TYPE_PROMISCUOUS)是否设置,即可判断此网卡是否进入混杂模式。
     首先还是枚举网卡ID,我这儿偷懒直接用WinPCap提供的PacketGetAdapterNames函数,获取网卡列表。WinPCap 3.x返回的适配器设备名是类似DeviceNPF_{4BA2EE23-C4FE-488E-98CD-FE129206458A}这种格式的,因此要字符串操作去掉DeviceNPF_前缀,组装成\.{4BA2EE23-C4FE-488E-98CD-FE129206458A}这种形式的设备名,用CreateFile打开。
 

以下为引用:
 string::size_type idx = name.find_last_of(‘{‘);

 if(idx == string::npos)
   return;

 string strDev = ”\\\\.\\” + name.substr(idx);

 HANDLE hNic = CreateFile(strDev.c_str(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, INVALID_HANDLE_VALUE);
 

     如果打开设备成功,则可以使用DeviceIoControl函数向其发送获取全局统计信息的请求,其实这儿叫网卡设备配置信息更合适 :)
 

以下为引用:
 DWORD dwInBuf = OID_GEN_CURRENT_PACKET_FILTER, dwOutBuf = 0, dwByteReturn = 0;

 if(DeviceIoControl(hNic, IOCTL_NDIS_QUERY_GLOBAL_STATS, 
   &dwInBuf, sizeof(dwInBuf), &dwOutBuf, sizeof(dwOutBuf), &dwByteReturn, NULL))
 {
   cout << endl << ” mode=”;
   
   static const char *NdisFilterTypes[] = 
   {
     ”Directed”, ”Multicast”, ”All Multicast”, ”Broadcast”, 
       ”Source Routing”, ”Promiscuous”, ”SMT”, ”All Local”,
       ”Group”, ”All Functional”, ”Functional”, ”MAC Frame”
   };
   
   for(int i=0; i<(sizeof(NdisFilterTypes) / sizeof(NdisFilterTypes[0])); i++)
   {
     if((dwOutBuf & (1 << i)) != 0)
     {
       cout << NdisFilterTypes[i] << ” ”;
     }
   }        
 }
 

     网卡当前模式有多个标志位,由DDK的ntddndis.h文件指定标志位意义
 

以下为引用:
 //
 // Ndis Packet Filter Bits (OID_GEN_CURRENT_PACKET_FILTER).
 //
 #define NDIS_PACKET_TYPE_DIRECTED      0×0001
 #define NDIS_PACKET_TYPE_MULTICAST    0×0002
 #define NDIS_PACKET_TYPE_ALL_MULTICAST  0×0004
 #define NDIS_PACKET_TYPE_BROADCAST    0×0008
 #define NDIS_PACKET_TYPE_SOURCE_ROUTING  0×0010
 #define NDIS_PACKET_TYPE_PROMISCUOUS   0×0020
 #define NDIS_PACKET_TYPE_SMT         0×0040
 #define NDIS_PACKET_TYPE_ALL_LOCAL    0×0080
 #define NDIS_PACKET_TYPE_MAC_FRAME    0×8000
 #define NDIS_PACKET_TYPE_FUNCTIONAL    0×4000
 #define NDIS_PACKET_TYPE_ALL_FUNCTIONAL  0×2000
 #define NDIS_PACKET_TYPE_GROUP       0×1000
 

     
     有兴趣仔细看看的朋友可以参考这个讨论Detecting if Adapter is in Promiscuous mode。有一个小工具也完成了类似的功能PromiscDetect,可惜不开源,不然我也不用折腾了,呵呵
     此外PCAUSA提供的两个小工具和例子也很不错,对了解NDIS很有帮助

     PCAUSA NDIS Developer Tools
     MACADDR II IOCTL_NDIS_QUERY_GLOBAL_STATS Sample Application


相关内容:

PWCHAR     getAdaptersList  (VOID   )  

Returns the list of the MACs available on the system.

Returns:
A string containing a list of network adapters.
The list of adapters is retrieved from the SYSTEM\CurrentControlSet\Control\Class\{4D36E972-E325-11CE-BFC1-08002BE10318} registry key. NPF tries to create its bindings from this list. In this way it is possible to be loaded and unloaded dynamically without passing from the control panel.



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值