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.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值