检测当前网卡是否处于混杂模式 - Flier????s Sky - 博客园
来源:互联网 发布:邓超孙俪换脸哪个软件 编辑:程序博客网 时间:2024/04/29 12:18
http://www.blogcn.com/user8/flier_lu/index.html?id=1245590&run=.0C9B086
今天比较巧,刚刚把重起网卡的文章贴上来,就有同事要我写个检测网卡混杂模式的小工具。本以为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 0x0001
#define NDIS_PACKET_TYPE_MULTICAST 0x0002
#define NDIS_PACKET_TYPE_ALL_MULTICAST 0x0004
#define NDIS_PACKET_TYPE_BROADCAST 0x0008
#define NDIS_PACKET_TYPE_SOURCE_ROUTING 0x0010
#define NDIS_PACKET_TYPE_PROMISCUOUS 0x0020
#define NDIS_PACKET_TYPE_SMT 0x0040
#define NDIS_PACKET_TYPE_ALL_LOCAL 0x0080
#define NDIS_PACKET_TYPE_MAC_FRAME 0x8000
#define NDIS_PACKET_TYPE_FUNCTIONAL 0x4000
#define NDIS_PACKET_TYPE_ALL_FUNCTIONAL 0x2000
#define NDIS_PACKET_TYPE_GROUP 0x1000
有兴趣仔细看看的朋友可以参考这个讨论Detecting if Adapter is in Promiscuous mode。有一个小工具也完成了类似的功能PromiscDetect,可惜不开源,不然我也不用折腾了,呵呵
此外PCAUSA提供的两个小工具和例子也很不错,对了解NDIS很有帮助
PCAUSA NDIS Developer Tools
MACADDR II IOCTL_NDIS_QUERY_GLOBAL_STATS Sample Application
本文转自
http://www.cnblogs.com/flier/archive/2004/07/08/22301.html
- 检测当前网卡是否处于混杂模式 - Flier????s Sky - 博客园
- 检测当前网卡是否处于混杂模式
- win检测当前网卡是否处于混杂模式
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 网卡混杂模式的检测
- 使用ARP分组检测处于混杂模式的网络节点
- 有关网卡混杂模式
- 网卡混杂模式探测
- 网卡的混杂模式
- 设置网卡混杂模式
- 网卡的混杂模式
- 网卡混杂模式
- 设置网卡混杂模式
- 网卡的混杂模式
- 设置网卡混杂模式
- 在Windows Vista+IIS7中使用vs2005 调试.net2.0项目
- 中国惠普前总裁孙振耀谈工作与生活
- SGS 客户端协议解析
- spring 与 hibernate 及事务的配置
- ThreadLocal使用
- 检测当前网卡是否处于混杂模式 - Flier????s Sky - 博客园
- 在eclipse中安装jbpm插件进行可视化编辑及生成数据库脚本
- js 变更表结构
- 抛弃Acdsee,评论几款看图软件;呼唤能自动翻转照片的功能
- 中国政策的新自由主义特征
- XFire客户端的实现
- 雅虎本周将推全新网络开发者平台 提高流量
- 【程序员必备】史上最全的的源码控件下载
- 一道年薪80万的面试智力测试题: