たとえば、宛先アドレスなどのパケットのプロパティを変更するために使用される WinDivert の例とサンプル コードを見てきました。
しかし、私は非常に一生懸命検索しようとしましたが、再注入する前にパケットの実際のペイロードを変更するドキュメントやサンプルを見つけることができません.
これが私がこれまでに持っているコードです:
HANDLE handle; // WinDivert handle
WINDIVERT_ADDRESS addr; // Packet address
char packet[MAXBUF]; // Packet buffer
UINT packetLen;
handle = WinDivertOpen("...", 0, 0, 0); // Open some filter
if (handle == INVALID_HANDLE_VALUE)
{
// Handle error
exit(1);
}
// Main capture-modify-inject loop:
while (TRUE)
{
if (!WinDivertRecv(handle, packet, sizeof(packet), &addr, &packetLen))
{
// Handle recv error
continue;
}
// Modify packet.
if (!WinDivertSend(handle, packet, packetLen, &addr, NULL))
{
// Handle send error
continue;
}
}
//Modify パケットで。ステップ ペイロードの変更を実行する必要があります。具体的には、データを新しい文字列に置き換えるか、完全に上書きしようとしています。
WinDivert のドキュメントで、パケット データを処理する唯一の方法は、パケットを解析する次の方法でした。
BOOL WinDivertHelperParsePacket(
__in PVOID pPacket,
__in UINT packetLen,
__out_opt PWINDIVERT_IPHDR *ppIpHdr,
__out_opt PWINDIVERT_IPV6HDR *ppIpv6Hdr,
__out_opt PWINDIVERT_ICMPHDR *ppIcmpHdr,
__out_opt PWINDIVERT_ICMPV6HDR *ppIcmpv6Hdr,
__out_opt PWINDIVERT_TCPHDR *ppTcpHdr,
__out_opt PWINDIVERT_UDPHDR *ppUdpHdr,
__out_opt PVOID *ppData,
__out_opt UINT *pDataLen
);
ppData: パケットのデータ/ペイロードへの出力ポインター。
ただし、これでデータを変更できるかどうかはわかりません (おそらく変更できますか?)。これは、出力用のパケット データのみを取得できるように思われるためです。
では、ペイロードを編集するにはどうすればよいでしょうか。