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 捕获,您可以转换数据包到以太网。
我正在尝试使用 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 捕获,您可以转换数据包到以太网。