如何更改 PCap.Net 数据包数据?

Posted

技术标签:

【中文标题】如何更改 PCap.Net 数据包数据?【英文标题】:How do I change PCap.Net packet data? 【发布时间】:2018-05-19 15:33:55 【问题描述】:

我有一个(生产)WireShark 捕获文件,我需要通过我的(调试)网络“重播”。我可以读取和解释数据包,但在发送数据包之前我需要调整一些细节,例如源 IP 地址和端口。

然而,问题在于 PcapDotNet.Packets.Packet 中的所有数据都是只读的。它只有二传手。 因此,例如设置 Ethernet.IpV4.Source 将不起作用。

IpV4Address.TryParse("192.168.1.10", out var newAddress); // for demo sake.
packet.Ethernet.IpV4.Source = newAddress; // Won't work

是否有一种简单的方法可以避免从头开始构建新数据包,或者这是创建略有不同的数据包的唯一方法?

【问题讨论】:

也许你可以通过反射来做到,但这取决于它是如何存储的。 【参考方案1】:

您应该只在旧数据包的基础上创建一个新数据包,而不是就地更改数据包。

您可以在要保留旧数据包的每一层上使用ExtractLayer(),然后在必要时更改层属性。

在这种情况下,你可以这样做:

IpV4Layer ipV4Layer = packet.Ethernet.IpV4.ExtractLayer();
ipV4Layer.Source = newAddress;

Packet newPacket = PacketBuild.Build(DateTime.Now, packet.Ethernet.ExtractLayer(), ipV4Layer, packet.Ethernet.IpV4.Payload.ExtractLayer());

您可能还想重置 IPv4 校验和,因此您应该这样做:

ipV4Layer.HeaderChecksum = null;

如果你有它们,你可能需要类似于 IPv4 层之上的 UDP 或 TCP 层。

【讨论】:

以上是关于如何更改 PCap.Net 数据包数据?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 PCap.NET 发送的数据包没有填写 TCP 选项?

.net 数据包捕获:pcap.net 与 Sharppcap

我需要能够使用 Pcap.Net 填充 tcp 数据包的以太网层

使用 Pcap.Net 对 Ipv6 数据包进行分段

pcap.net ReceivePacket 无法正常工作

使用 pcap.net 在同一网络中捕获不同 PC 的网络数据包