特定の文字列のすべての受信 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 です。パケットのペイロードを取得するにはどうすればよいですか? 私は何か間違ったことをしていますか?
前もって感謝します。