3

特定の文字列のすべての受信 TCP パケット (指定された IP アドレスから) のペイロードを解析できるようにするために、「検査」WFP の例 (WinDDK にバンドルされている) を変更しています。(TCP パケットのみがフィルターによってキャッチされるように、既に「検査」を変更しました)

これまでのところ、以下に示すように、'TLInspectTransportClassify' classifyFn に変更を加えています。私の目的は、キャッチされた各 TCP パケットのペイロードにアクセスできるようにすることです。

FWPS_STREAM_CALLOUT_IO_PACKET* ioPacket = (FWPS_STREAM_CALLOUT_IO_PACKET*)layerData;
FWPS_STREAM_DATA* streamData;
SIZE_T streamLength;
BYTE* stream = NULL;
SIZE_T bytesCopied = 0;

[...]

if(ioPacket == NULL) {
   DbgPrint("ioPacket == NULL\n");
   return STATUS_INSUFFICIENT_RESOURCES;
}
streamData = ioPacket->streamData;

if(!streamData) {     // why is this always NULL?  shouldn't our payload be here?
   DbgPrint("streamData == NULL: no data\n");   
   classifyOut->actionType = FWP_ACTION_PERMIT;
     classifyOut->rights &= ~FWPS_RIGHT_ACTION_WRITE;
     goto Exit;
}

DbgPrint("tcp packet has some data\n");

streamLength = streamData->dataLength;

stream =  ExAllocatePoolWithTag(NonPagedPool,
                               streamLength,
                               'yftN');

if (!stream)
  return STATUS_INSUFFICIENT_RESOURCES;

RtlZeroMemory(stream,streamLength);
FwpsCopyStreamDataToBuffer0(
  streamData,
  stream,
  streamLength,
  &bytesCopied);

// should now have our tcp payload in 'stream' buffer(?)

DbgPrint("reached parsing code\n");

[...]

私の理解では、上記のように ioPacket を宣言した後、ioPacket->streamData にはパケットのペイロードが含まれている必要があります。ただし、ioPacket->streamData は常に NULL です。パケットのペイロードを取得するにはどうすればよいですか? 私は何か間違ったことをしていますか?

前もって感謝します。

4

1 に答える 1

3

TLInspectTransportClassify」は、 layerData を NET_BUFFER_LISTキャストする必要があるTRANSPORT_LAYERにあります。

FWPS_STREAM_CALLOUT_IO_PACKETは FWPM_LAYER_STREAM_V4/FWPM_LAYER_STREAM_V6 用です。

MSDN classifyFn0 を参照してください。 http://msdn.microsoft.com/en-us/library/ff544890(VS.85).aspx

管理フィルタリング層識別子 http://msdn.microsoft.com/en-us/library/ff557101(VS.85).aspx

于 2011-04-29T11:47:50.670 に答える