0

我在 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 而丢弃了数据包?

4

1 回答 1

1

回答我自己的问题:显然在重新注入数据包之前更新所有校验和(包括 tcp/udp)可以解决问题。

于 2014-05-06T12:42:43.140 回答