PcapDotNet 和数据链路类型

PcapDotNet and Datalink type

我正在尝试使用 Pcap.net 操纵一些网络捕获(pcap 格式)。 我正在打开 pcap 文件并创建转储程序:

OfflinePacketDevice selectedDevice = new OfflinePacketDevice(pcapInFile);
using (PacketCommunicator PcapReader = selectedDevice.Open(655360, PacketDeviceOpenAttributes.Promiscuous, 1000))
{
    PacketDumpFile PcapWriter = PcapReader.OpenDump(pcapOutFile);
    PcapReader.ReceivePackets(count, PacketDispatcher);
}

而 PacketDispatcher 将类似于:

private void PacketDispatcher(Packet packet)
{
    // Manipulate the packet
    PcapWriter.Dump(packet);
}

只要 pcapInFile 数据链路是以太网类型,一切正常。但是我有几个没有以太网层(rawip)的捕获,我必须构建一个新的以太网层。在这种上限中,数据链路类型与 pcapInFile(原始 ip)相同,我想将其更改为以太网...

如果我将所有被操纵的数据包存储在一个 ienumerable 中并转储它们:

PacketDumpFile.Dump(pcapOutFile, new PcapDataLink(1), Packets.Count(), Packets);

它工作正常...但是,如果您正在处理几千兆的文件,这不是很有用...

有什么想法吗? 谢谢!

假设问题是所有数据包都在 RAM 中,您可以使用 yield.

创建一个不包含 RAM 中所有内容的 IEnumerable

这样当 Dumper 转储数据包时,它会调用您的方法来使用 yield 填充下一个项目。

好吧,尽管这不是答案,而是一种解决方法,而且由于没有人编写出更好的解决方案,因此这就是修复它的方法:

使用 SharPcap 而不是 PcapDotNet,那么你可以这样声明一个 reader 和一个 writer:

public CaptureFileReaderDevice PcapReader;
public CaptureFileWriterDevice PcapWriter;

PcapReader = new CaptureFileReaderDevice(fileIn);
PcapReader.OnPacketArrival += packetDispatcher;
PcapReader.Capture();

在 packetDispatcher 函数中:

RawCapture raw = new RawCapture(LinkLayers.Ethernet, e.Packet.Timeval,RebuildNullLinkLayer(e, offset));
CaptureHandler.PcapWriter.Write(raw);

并且在 RebuildNullLinkLayer 函数中你可以添加以太网层,修改任何你想要的等等...

请注意,当您调用 RawCapture 构造函数时,您可以选择 Link 层(mi original issue with Pcap.Net...),因此如果您正在解析 RawIp 捕获,您可以转换数据包到以太网。