我在 FWPM_LAYER_OUTBOUND_IPPACKET_V4 注册了一个内核 WFP 过滤器,在其中我将每个 IPv4 NET_BUFFER_LIST 复制到一个缓冲区,并从工作线程中重新注入它而不进行修改。我使用 FWPM_SUBLAYER_UNIVERSAL 作为子层。基本上:
mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)
从 sendComplete 回调返回 0 以及 NET_BUFFER_LIST_STATUS()。
这适用于 UDP 和 ICMP(我得到回复),但不适用于 TCP 数据包。我可以从我正在测试的虚拟机中看到 SYN 在 NetMon 中发出,但 NetMon 没有看到外部数据包(在主机中)。当然,远程主机也没有回复。
我尝试更新IP校验和(我在classifyFn中得到0)并且它没有改变任何东西。当我的classifyFn 收到TCP 校验和时(据NetMon 所知),TCP 校验和已经正确。我查看了原始的 nbl、我的平面缓冲区和 WinDBG 中新创建的 nbl,它们都包含 IP 数据包(以 0x45 等开头)。
我必须为过滤器创建一个新的子层吗?是否因为我从与系统进程关联的工作线程调用 sendAsync 而丢弃了数据包?