我在FWPM_LAYER_OUTBOUND_IPPACKET_V4注册了一个内核世界粮食计划署过滤器,在那里我将每个IPv4 NET_BUFFER_LIST复制到一个缓冲区,并从工作线程重新注入它,而不做任何修改。我使用FWPM_SUBLAYER_UNIVERSAL作为子层。基本上:
mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)它返回0,以及来自sendComplete回调的NET_BUFFER_LIST_STATUS()。
这适用于UDP和ICMP (我得到回复),但不适用于TCP数据包。我可以看到SYN从我正在测试的虚拟机的NetMon中传出,但是NetMon没有看到来自外部(在主机中)的数据包。当然也没有来自远程主机的回复。
我尝试更新IP校验和(在classifyFn中为0),但没有任何变化。当我的classifyFn接收到TCP校验和时,它已经是正确的(据NetMon所知)。我查看了原始的nbl、我的平面缓冲区和WinDBG中新创建的nbl,它们都包含IP数据包(从0x45开始,等等)。
我必须为过滤器创建一个新的子层吗?数据包是否因为我从与系统进程关联的工作线程调用sendAsync而被丢弃?
发布于 2014-05-06 20:42:43
回答我自己的问题:显然,在重新注入数据包之前更新所有校验和(包括tcp/udp)解决了这个问题。
https://stackoverflow.com/questions/23460642
复制相似问题