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打开。
如果打开设备成功,则可以使用DeviceIoControl函数向其发送获取全局统计信息的请求,其实这儿叫网卡设备配置信息更合适 :)
网卡当前模式有多个标志位,由DDK的ntddndis.h文件指定标志位意义
有兴趣仔细看看的朋友可以参考这个讨论Detecting if Adapter is in Promiscuous mode。有一个小工具也完成了类似的功能PromiscDetect,可惜不开源,不然我也不用折腾了,呵呵
此外PCAUSA提供的两个小工具和例子也很不错,对了解NDIS很有帮助
PCAUSA NDIS Developer Tools
MACADDR II IOCTL_NDIS_QUERY_GLOBAL_STATS Sample Application
相关内容:
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.
检测当前网卡是否处于混杂模式
今天比较巧,刚刚把重起网卡的文章贴上来,就有同事要我写个检测网卡混杂模式的小工具。本以为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); |
以下为引用: 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] << ” ”; } } } |
以下为引用: // // 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: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.
相关文章推荐
- 检测当前网卡是否处于混杂模式 - Flier????s Sky - 博客园
- 检测当前网卡是否处于混杂模式
- 检测当前网卡是否处于混杂模式
- 网卡混杂模式的检测
- linux下查看网卡是否是混杂模式及ifconfig命令
- 判断当前系统是否处于全屏独占的模式
- ARP防火墙:网卡处于混杂模式什么原因,怎么办?
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 使用ARP分组检测处于混杂模式的网络节点
- 使用ARP分组检测处于混杂模式的网络节点
- 网卡混杂模式的检测
- linux 下怎样查看网卡是否支持混杂(promisc)模式
- 检测当前是否联网
- 安装bootcamp时提示“找不到$winpedriver$文件夹,请验证该文件夹是否和bootcamp处于同一文件夹内?”
- android检测当前网络是否可用
- Windows Phone 8 中检测推送通知是否会因为节电模式而被禁用
- 检测Activity是否在当前Task的栈顶