用于 Windows 的 802.11 数据包注入






4.83/5 (12投票s)
在 802.11 帧中插入自定义数据包
引言
此项目适用于 Windows 无线网络开发人员,并假定读者熟悉数据包注入、802.11 帧和 IP 协议的概念。 此软件包中的网络驱动程序为开发人员提供了一种在*用户空间*中创建 802.11 数据包并在 802.11 层上发送它们的方法。 该软件包包含一个网络驱动程序和一个开源命令行应用程序。 命令行应用程序演示了如何通过 DeviceIoControl
使用 Packet11
服务。
背景
通常,数据包注入用于测试无线安全性或使用“软件控制数据包”破解 WEP 密钥(airplay)。 尽管软件控制的数据包可能被恶意使用,但它们也可以提供更好的用户体验。 网状网络和虚拟接入点是管理无线数据包的两个潜在且有益的应用程序。 Packet11 是为无线测试和路由提供软件控制数据包的第一步。
据我所知,如果没有特殊适配器 (AirPCap),就没有其他用于 Windows 的 802.11 数据包注入器。 在 802.11 层中构造的数据包是无线微型端口固有的。 Linux 已经能够修改本机 WiFi 数据包多年,并扩展了 WiFi 技术,例如 MadWiFi。 更好地控制本机 WiFi 数据包也将扩展 Windows 中的 WiFi 功能。 自 Windows Vista 以来,网络驱动程序接口规范 (NDIS) 6 为第三方 Windows 开发人员提供了更好的机会来管理和扩展 WiFi 适配器功能。 但是,在 Windows 中创建和修改 802.11 层中的数据包没有文档记录。
要求
- Windows Vista 或更高版本
- 无线适配器*
*我在 Atheros USB WiFi、Intel PCI WiFi 和 Rosewill 适配器上测试了 Packet11。 所有这些都能够发送我的自定义数据包。 我建议使用第二个处于监视模式的无线适配器来查看数据包在空中发送时的情况。
Using the Code
自从发表这篇文章以来,我实现了一种新技术,该技术允许过滤器驱动程序发起 802.11 数据包,而无需修改操作系统生成的数据包。 现在,应用程序可以使用 DeviceIoControl
创建和发送 802.11 数据包。 显然,为了使用此函数,必须在使用此函数之前安装 Packet11 驱动程序。 我提供了安装和卸载驱动程序的命令。 自述文件提供了更多详细信息。 安装驱动程序后,我们可以创建并测试自定义 802.11 数据包。
为了演示,我使用了一个探测请求类型来说明一种可能性。
// Initialize the 802.11 packet. In this case, a probe request.
void * CreatePacket(
DOT11_MGMT_SUBTYPE subtype,
PUCHAR Source,
PUCHAR Dest,
PUCHAR Bssid,
ULONG packetsize
)
{
PDOT11_MGMT_HEADER pMgmtHeader = NULL;
PDOT11_PROBE_REQUEST pProbeRequest = NULL;
PDOT11_INFO_ELEMENT pInfoElement = NULL;
PDOT11_BASIC_RATE pBasicRate = NULL;
PDOT11_EXT_RATE pExtRate = NULL;
PVOID DataBuffer = NULL;
if(Source == NULL || Dest == NULL || Bssid == NULL){
printf("CreatePacket ==> null mac address \n");
return DataBuffer;
}
DataBuffer = malloc(packetsize);
pMgmtHeader = (PDOT11_MGMT_HEADER)(PUCHAR)DataBuffer;
pMgmtHeader->FrameControl.Version = 0;
pMgmtHeader->FrameControl.Type = DOT11_FRAME_TYPE_MANAGEMENT;
pMgmtHeader->FrameControl.Subtype = subtype;
//firmware can handle rest of framecontrol
pMgmtHeader->FrameControl.ToDS = 0;
pMgmtHeader->FrameControl.FromDS = 0;
pMgmtHeader->FrameControl.MoreFrag = 0;
pMgmtHeader->FrameControl.Retry = 0;
pMgmtHeader->FrameControl.PwrMgt = 0;
pMgmtHeader->FrameControl.MoreData = 0;
pMgmtHeader->FrameControl.WEP = 0;
pMgmtHeader->FrameControl.Order = 0;
//no specific duration was required to send
pMgmtHeader->DurationID = 314;
memcpy(pMgmtHeader->DA, Dest, MAC_ADDR_LEN);
memcpy(pMgmtHeader->SA, Source, MAC_ADDR_LEN);
memcpy(pMgmtHeader->BSSID, Bssid, MAC_ADDR_LEN);
pMgmtHeader->SequenceControl.FragmentNumber = 0;
pMgmtHeader->SequenceControl.SequenceNumber = 0;
switch (subtype)
{
case DOT11_MGMT_SUBTYPE_PROBE_REQUEST: //0
packetsize = sizeof(DOT11_MGMT_HEADER ) +
sizeof(DOT11_MGMT_SUBTYPE_PROBE_REQUEST) + 1;
pProbeRequest = (PDOT11_PROBE_REQUEST)
((PUCHAR)pMgmtHeader + sizeof(DOT11_MGMT_HEADER ));
pProbeRequest->ssid.ElementID = 0; //ssid frame
pProbeRequest->ssid.Length = 0;
//the number of rates is up to the user
pProbeRequest->rateframe.ieheader.ElementID = 1;//rate frame
pProbeRequest->rateframe.ieheader.Length = 1; //1 rate object
pProbeRequest->rateframe.rate[0] =
(USHORT)0x82;//mandatory, // 1mbps
break;
default:
break;
}
return pMgmtHeader;
}
探测请求数据包通过 DeviceIoControl
发送。
DeviceHandle = OpenHandle(pPacketuioDevice);
IORequest(DeviceHandle , IOCTL_PACKET11_GET_MAC, NULL, 0, Source, MAC_ADDR_LEN);
PacketLength = sizeof(DOT11_MGMT_HEADER ) + sizeof(DOT11_PROBE_REQUEST) + 1;
pMgmtFrame = CreatePacket(DOT11_MGMT_SUBTYPE_PROBE_REQUEST,Source,
BroadCast,BroadCast, PacketLength);
IORequest(DeviceHandle , IOCTL_PACKET11_INSERT_PACKET,
(PUCHAR)pMgmtFrame, PacketLength, NULL, 0);
CloseHandle(DeviceHandle);
当驱动程序收到请求时,它会检查帧类型、源 MAC 地址和发送的数据包数。 目前,帧类型必须是管理帧。 以后的版本将支持数据帧。 源地址必须与适配器的 MAC 地址匹配,以防止 MAC 欺骗。 最终控制确保在一秒间隔内发送的数据包不超过两个。 如果用户数据包通过这些检查,则会创建该数据包并将其发送到微型端口以进行进一步处理。 某些适配器在设置通道后,即使未关联也会发送数据包。 某些芯片组仅在关联时才会发送用户数据包。 我假设制造商在初始化或操作模式下设置的规则决定了是否发送数据包。
旁注:Network Monitor 3.2 是 NDIS 6 技术的一个例子。 它可以捕获适配器范围内空中的 802.11 数据包。
上面突出显示的数据包表明,探测请求与 packettest 中定义的请求匹配。
相关链接
人员
感谢 Thomas Divine 指出了正确的方向。
历史
- 版本 1.5 - Beta 版本 - 2009 年 2 月 12 日
- 版本 1.0 - 初始版本 - 2008 年 8 月 20 日
这是一个正在进行的项目。 未来将会有更多更新。