1.如何在windows中将网卡设置为混杂模式
网卡混杂模式(Promiscuous Model) 工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。
一般的网络分析工具,都是通过把网卡设置为混杂模式来获取底层数据流。网卡设置为混杂模式1.网上流传的设置调整网卡属性,是全双工和半双工设置。
2.网卡设置为混杂模式是比较麻烦的,需要通过编程底层来修改。3.常见的抓包工具如 Sniffer ,WinPcap都自动调整网卡混杂模式功能,开启抓包自动调整为混杂模式,关闭停止抓包程序。
恢复正常模式。
2.如何控制混杂模式
一、在普通程序中设置网卡混杂模式。
在普通程序中普遍用ioctl函数来设置,该函数很值得大家好好的了解,因为它的使用非常的广泛。下面 给出设置网卡混杂模式的实现代码: #include #include #include #include int set_all_promisc() { struct ifreq ifaces[16]; struct ifconf param; int sock, i; param.ifc_len = sizeof(ifaces); param.ifc_req = ifaces; sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock <= 0) return 0; if (ioctl(sock, SIOCGIFCONF, ¶m)) return 0; for (i = 0; i < param.ifc_len / sizeof(struct ifreq); i++) { if (ioctl(sock, SIOCGIFFLAGS, ifaces + i)) return 0; ifaces[i].ifr_flags |= IFF_PROMISC; /*如果恢复网卡模式,把|= 改成 &=~ */ if (ioctl(sock, SIOCSIFFLAGS, ifaces + i)) return 0; } return 1; } 二、在核心空间中设置混杂模式1.在kernel-2.2.x 中 static struct device *sniffer_dev = NULL; static unsigned short old_flags, old_gflags;int init_module ( void ) /* 模块初始化 */ { 。
sniffer_dev = dev_get("eth0"); if ( sniffer_dev != NULL ) { /* thanks for difeijing of whnet's Security */ old_flags = sniffer_dev->flags; old_gflags = sniffer_dev->gflags; /* * 参看net/core/dev.c里的dev_change_flags() * ->gflags的作用是避免多次重复设置混杂模式,没有其他特别含义 */ /* 设置混杂模式 */ sniffer_dev->flags |= IFF_PROMISC; sniffer_dev->gflags |= IFF_PROMISC; start_bh_atomic(); /* 注意,这个回调函数还是会报告 eth0: Setting promiscuous mode. */ sniffer_dev->set_multicast_list( sniffer_dev ); end_bh_atomic(); }。
return 0; } void cleanup_module(void) { 。
if (sniffer_dev != NULL) { /* 恢复原有模式 */ sniffer_dev>flags = old_flags; sniffer_dev>gflags = old_gflags; start_bh_atomic(); sniffer_dev>set_multicast_list( sniffer_dev ); end_bh_atomic(); }。
} 2.在kernel-2.4.x 中在2.4中有了许多变化,首先struct device结构改为struct net_device, 再者dev_get功能改为测试网络设备是否存在,真正的设置网络混杂模式的函数改为 void dev_set_promiscuity(struct net_device *dev, int inc); 其中根据inc的值来设置混杂模式还是恢复原来设置模式,通过计数来恢复原来模式,这样的好处就是:不会和其他的程序冲突,不在像上述两种实现方式中恢复原来模式就全恢复了,不管还有没有其他的程序是否也设置了混杂模式。
现在就通过计数来恢复原来的模式,只要当计数相加为零才设置成普通模式。linux源代码的注释如下: /** * dev_set_promiscuity - update promiscuity count on a device * @dev: device * @inc: modifier * * Add or remove promsicuity from a device. While the count in the device * remains above zero the interface remains promiscuous. Once it hits zero * the device reverts back to normal filtering operation. A negative inc * value is used to drop promiscuity on the device. */设置网卡混杂模式的实现代码如下:struct net_device *sniffer_dev = NULL; int dev_flags = 0;int init_module ( void ) /* 模块初始化 */ { 。
sniffer_dev = dev_get_by_name("eth0"); if (sniffer_dev != NULL) { dev_flags = 1; dev_set_promiscuity(sniffer_dev, 1); dev_put(sniffer_dev); sniffer_dev = NULL; }。
return 0; }void cleanup_module(void) { 。
if (dev_flags) { sniffer_dev = dev_get_by_name("eth0"); if (sniffer_dev != NULL) { dev_flags = 0; dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/ dev_put(sniffer_dev); sniffer_dev = NULL; } }。
}。
3.windows怎么设置网卡的网卡的混杂模式
网卡混杂模式(Promiscuous Model)
工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。一般的网络分析工具,都是通过把网卡设置为混杂模式来获取底层数据流。
网卡设置为混杂模式
1、网上流传的设置调整网卡属性,是全双工和半双工设置。
2、网卡设置为混杂模式是比较麻烦的,需要通过编程底层来修改。
3、常见的抓包工具如 Sniffer ,WinPcap都自动调整网卡混杂模式功能,开启抓包自动调整为混杂模式,关闭停止抓包程序。恢复正常模式
4.如何控制混杂模式
一、在普通程序中设置网卡混杂模式。
在普通程序中普遍用ioctl函数来设置,该函数很值得大家好好的了解,因为它的使用非常的广泛。下面 给出设置网卡混杂模式的实现代码: #include #include #include #include int set_all_promisc() { struct ifreq ifaces[16]; struct ifconf param; int sock, i; param.ifc_len = sizeof(ifaces); param.ifc_req = ifaces; sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); if (sock <= 0) return 0; if (ioctl(sock, SIOCGIFCONF, ¶m)) return 0; for (i = 0; i < param.ifc_len / sizeof(struct ifreq); i++) { if (ioctl(sock, SIOCGIFFLAGS, ifaces + i)) return 0; ifaces[i].ifr_flags |= IFF_PROMISC; /*如果恢复网卡模式,把|= 改成 &=~ */ if (ioctl(sock, SIOCSIFFLAGS, ifaces + i)) return 0; } return 1; } 二、在核心空间中设置混杂模式 1.在kernel-2.2.x 中 static struct device *sniffer_dev = NULL; static unsigned short old_flags, old_gflags; int init_module ( void ) /* 模块初始化 */ { 。
sniffer_dev = dev_get("eth0"); if ( sniffer_dev != NULL ) { /* thanks for difeijing of whnet's Security */ old_flags = sniffer_dev->flags; old_gflags = sniffer_dev->gflags; /* * 参看net/core/dev.c里的dev_change_flags() * ->gflags的作用是避免多次重复设置混杂模式,没有其他特别含义 */ /* 设置混杂模式 */ sniffer_dev->flags |= IFF_PROMISC; sniffer_dev->gflags |= IFF_PROMISC; start_bh_atomic(); /* 注意,这个回调函数还是会报告 eth0: Setting promiscuous mode. */ sniffer_dev->set_multicast_list( sniffer_dev ); end_bh_atomic(); } 。
return 0; } void cleanup_module(void) { 。
if (sniffer_dev != NULL) { /* 恢复原有模式 */ sniffer_dev>flags = old_flags; sniffer_dev>gflags = old_gflags; start_bh_atomic(); sniffer_dev>set_multicast_list( sniffer_dev ); end_bh_atomic(); } 。
} 2.在kernel-2.4.x 中 在2.4中有了许多变化,首先struct device结构改为struct net_device, 再者dev_get 功能改为测试网络设备是否存在,真正的设置网络混杂模式的函数改为 void dev_set_promiscuity(struct net_device *dev, int inc); 其中根据inc的值来设置混杂模式还是恢复原来设置模式,通过计数来恢复原来模式,这样的好处就是:不会和其他的程序冲突,不在像上述两种实现方式中恢复原来模式就全恢复了,不管还有没有其他的程序是否也设置了混杂模式。
现在就通过计数来恢复原来的模式,只要当计数相加为零才设置成普通模式。 linux源代码的注释如下: /** * dev_set_promiscuity - update promiscuity count on a device * @dev: device * @inc: modifier * * Add or remove promsicuity from a device. While the count in the device * remains above zero the interface remains promiscuous. Once it hits zero * the device reverts back to normal filtering operation. A negative inc * value is used to drop promiscuity on the device. */ 设置网卡混杂模式的实现代码如下: struct net_device *sniffer_dev = NULL; int dev_flags = 0; int init_module ( void ) /* 模块初始化 */ { 。
sniffer_dev = dev_get_by_name("eth0"); if (sniffer_dev != NULL) { dev_flags = 1; dev_set_promiscuity(sniffer_dev, 1); dev_put(sniffer_dev); sniffer_dev = NULL; } 。
return 0; } void cleanup_module(void) { 。
if (dev_flags) { sniffer_dev = dev_get_by_name("eth0"); if (sniffer_dev != NULL) { dev_flags = 0; dev_set_promiscuity(sniffer_dev, -1); /*注意此处的第二个参数*/ dev_put(sniffer_dev); sniffer_dev = NULL; } } 。
}。
5.请教各位高手如何将网卡设置为混杂模式
RtlZeroMemory(&pAdapt->Request, sizeof(NDIS_REQUEST));
ulFilter = NDIS_PACKET_TYPE_PROMISCUOUS ;
pAdapt->Request.RequestType = ;
pAdapt->Request.DATA.SET_INFORMATION.Oid = OID_GEN_CURRENT_PACKET_FILTER;
pAdapt->Request.DATA.SET_INFORMATION.InformationBuffer = &ulFilter;
pAdapt->Request.DATA.SET_INFORMATION. = sizeof(ulFilter);
NdisRequest(Status, pAdapt->BindingHandle, &pAdapt->Request);
或 NdisRequest OID_GEN_CURRENT_PACKET_FILTER ,增加NDIS_PACKET_TYPE_PROMISCUOUS 标志
或 Const
NDIS_PACKET_TYPE_DIRECTED =$0001;
NDIS_PACKET_TYPE_MULTICAST =$0002;
NDIS_PACKET_TYPE_ALL_MULTICAST =$0004;
NDIS_PACKET_TYPE_BROADCAST =$0008;
NDIS_PACKET_TYPE_SOURCE_ROUTING =$0010;
NDIS_PACKET_TYPE_PROMISCUOUS =$0020;
NDIS_PACKET_TYPE_SMT =$0040;
NDIS_PACKET_TYPE_MAC_FRAME =$8000;
NDIS_PACKET_TYPE_FUNCTIONAL =$4000;
NDIS_PACKET_TYPE_ALL_FUNCTIONAL =$2000;
NDIS_PACKET_TYPE_GROUP =$1000;
function SetOid(hVxD:THandle; ulOid,ulLength,data:ULong):PBYTE;
var
cbin,cbRet,a:DWord;
ioctl:ULong;
pOidData:PPACKET_OID_DATA;
begin
cbIn := sizeof(PACKET_OID_DATA) + ulLength;
pOidData:= PPACKET_OID_DATA(@InBuff);
if (ulOid = OID_GEN_CURRENT_PACKET_FILTER) then
ioctl := ULONG (IOCTL_PROTOCOL_SET_OID);
fillchar(InBuff, 0, cbIn+1);
pOidData.Oid := ulOid;
pOidData.Length := ulLength;
pOidData.Data[0] := UCHAR(data);
cbRet := QueryPacket( hVxD, ioctl, @InBuff, cbIn, @InBuff, cbIn );
result:=0;
end;
SetOid(hVxD, OID_GEN_CURRENT_PACKET_FILTER, 4, NDIS_PACKET_TYPE_PROMISCUOUS);
转载请注明出处windows之家 » win10设置混杂模式