0

カーネル WFP フィルターを FWPM_LAYER_OUTBOUND_IPPACKET_V4 に登録しました。ここで、各 IPv4 NET_BUFFER_LIST をバッファーにコピーし、変更せずにワーカー スレッドから再注入しました。サブレイヤーとして FWPM_SUBLAYER_UNIVERSAL を使用しています。基本的:

mdl = IoAllocateMdl(buffer, ...)
MmBuildMdlForNonPagedPool(mdl);
FwpsAllocateNetBufferAndNetBufferList0(..., mdl, ..., &nbl)
FwpsInjectNetworkSendAsync0(..., nbl, ...)

sendComplete コールバックから NET_BUFFER_LIST_STATUS() と同様に 0 を返します。

これは UDP と ICMP (応答が返ってきます) では機能しますが、TCP パケットでは機能しません。テストしている仮想マシンから NetMon で SYN が送信されていることを確認できますが、NetMon は外部 (ホスト マシン内) でパケットが送信されていることを認識しません。もちろん、リモートホストからの応答はありません。

IP チェックサム (classifyFn で 0 として取得) を更新しようとしましたが、何も変わりません。TCP チェックサムは、classifyFn が受信した時点で既に正しいものです (NetMon が判断できる限り)。元の nbl、フラット バッファー、および WinDBG で新しく作成された nbl を調べたところ、それらにはすべて IP パケット (0x45 などで始まる) が含まれています。

フィルター用に新しいサブレイヤーを作成する必要がありますか? システム プロセスに関連付けられたワーカー スレッドから sendAsync を呼び出しているため、パケットは破棄されますか?

4

1 に答える 1

1

私自身の質問への回答: 明らかに、パケットを再注入する前にすべてのチェックサム (tcp/udp を含む) を更新すると、問題が解決します。

于 2014-05-06T12:42:43.140 に答える