C# .NET写入PCAP文件
全部, 我花了相当一部分时间研究了各种PCAP库,在我开始编写PCAP编写器之前,我想描述一下我的场景并征求意见 我有一个客户要求我提供一个服务,读取pcap文件并将数据包写入他们选择的数据库。然后,客户机可以查询数据库(datetime范围),最终结果应该是一个pcap文件,其中包含符合该范围标准的数据包 到目前为止,我在这些库中发现,pcap的“转储”(即写入)似乎只有在与特定捕获设备关联时才可用。我的情况并非如此 我正在使用PCAP.NET读取原始PCAP文件并提取数据包。我将数据包存储到数据库中,然后从数据库中读取数据并重新创建数据包,但我没有找到将查询结果写入pcap文件的方法C# .NET写入PCAP文件,c#,.net,winpcap,pcap.net,C#,.net,Winpcap,Pcap.net,全部, 我花了相当一部分时间研究了各种PCAP库,在我开始编写PCAP编写器之前,我想描述一下我的场景并征求意见 我有一个客户要求我提供一个服务,读取pcap文件并将数据包写入他们选择的数据库。然后,客户机可以查询数据库(datetime范围),最终结果应该是一个pcap文件,其中包含符合该范围标准的数据包 到目前为止,我在这些库中发现,pcap的“转储”(即写入)似乎只有在与特定捕获设备关联时才可用。我的情况并非如此 我正在使用PCAP.NET读取原始PCAP文件并提取数据包。我将数据包存储到
最简单的情况下,考虑一个类型包的数据结构(新到实际写入堆栈溢出,我不知道如何用T括号列表T,而不被过滤)-任何可用的库都支持将该结构写入pCAP?
鉴于这似乎不是一个常见的场景,我想知道整个场景的有效性。我还应该指出,我总共有两天的时间处理PCAP数据,这应该是一个概念验证应用程序,因此我完全有可能缺少一点知识,这使得这件事变得微不足道 感谢您宝贵的时间和考虑,如果我与谷歌的尝试,甚至更多的时间与堆栈溢出搜索忽略了显而易见的,提前道歉Chris我相信Pcap.Net的静态方法PacketDumpFile.Dump()可以满足您的需要。这里有一个简单的C语言工具,我编写了这个工具来将ETL转换为Pcap文件,这是一个如何编写Pcap文件的示例。这将使用以太网的链路层头类型写入文件。有关其他类型的信息,请参阅 这里是VisualStudio解决方案
我完全错过了那种方法。。。非常感谢。我一直在PacketDumpFile类上寻找实例构造函数,然后允许自己使用转储设备获得示例的隧道视觉。再次感谢您的回应,您在回答我的问题时帮了大忙。
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace chentiangemalc
{
public static class NetworkRoutines
{
public static long ConvertEtlToPcap(string source, string destination, UInt32 maxPacketSize)
{
int result = 0;
using (BinaryWriter writer = new BinaryWriter(File.Open(destination, FileMode.Create)))
{
UInt32 magic_number = 0xa1b2c3d4;
UInt16 version_major = 2;
UInt16 version_minor = 4;
Int32 thiszone = 0;
UInt32 sigfigs = 0;
UInt32 snaplen = maxPacketSize;
UInt32 network = 1; // LINKTYPE_ETHERNET
writer.Write(magic_number);
writer.Write(version_major);
writer.Write(version_minor);
writer.Write(thiszone);
writer.Write(sigfigs);
writer.Write(snaplen);
writer.Write(network);
long c = 0;
long t = 0;
using (var reader = new EventLogReader(source, PathType.FilePath))
{
EventRecord record;
while ((record = reader.ReadEvent()) != null)
{
c++;
t++;
if (c == 100000)
{
Console.WriteLine(String.Format("Processed {0} events",t));
c = 0;
}
using (record)
{
if (record.Id == 1001 && record.ProviderName == "Microsoft-Windows-NDIS-PacketCapture")
{
result++;
DateTime timeCreated = (DateTime)record.TimeCreated;
UInt32 ts_sec = (UInt32)((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalSeconds);
UInt32 ts_usec = (UInt32)(((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalMilliseconds) - ((UInt32)((timeCreated.Subtract(new DateTime(1970, 1, 1))).TotalSeconds * 1000))) * 1000;
UInt32 incl_len = (UInt32)record.Properties[2].Value;
if (incl_len > maxPacketSize)
{
Console.WriteLine(String.Format("Packet size of {0} exceeded max packet size {1}, packet ignored",incl_len,maxPacketSize));
}
UInt32 orig_len = incl_len;
writer.Write(ts_sec);
writer.Write(ts_usec);
writer.Write(incl_len);
writer.Write(orig_len);
writer.Write((byte[])record.Properties[3].Value);
}
}
}
}
}
return result;
}
}
}