您的位置:首页 > 其它

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

2013-11-14 10:35 477 查看

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


    今天比较巧,刚刚把重起网卡的文章贴上来,就有同事要我写个检测网卡混杂模式的小工具。本以为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.


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: