检测当前网卡是否处于混杂模式
2012-10-17 16:54
393 查看
实际上方法很简单,打开一个网卡设备,查询其全局统计信息(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
首先还是枚举网卡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 |
此外PCAUSA提供的两个小工具和例子也很不错,对了解NDIS很有帮助
PCAUSA NDIS Developer Tools
MACADDR II IOCTL_NDIS_QUERY_GLOBAL_STATS Sample Application
相关文章推荐
- win检测当前网卡是否处于混杂模式
- 检测当前网卡是否处于混杂模式
- 检测当前网卡是否处于混杂模式 - Flier????s Sky - 博客园
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- linux下查看网卡是否是混杂模式及ifconfig命令
- linux 下怎样查看网卡是否支持混杂(promisc)模式
- 网卡混杂模式的检测
- 使用ARP分组检测处于混杂模式的网络节点
- 网卡混杂模式的检测
- 判断当前系统是否处于全屏独占的模式
- ARP防火墙:网卡处于混杂模式什么原因,怎么办?
- 使用ARP分组检测处于混杂模式的网络节点
- 网卡混杂模式的检测
- C#检测当前用户网络是否连接
- 网卡混杂模式Promiscuous与linux上混杂模式的设置
- 设置网卡混杂模式
- 在ASP中用组件检测当前网卡地址
- android检测当前网络是否可用