【问题标题】:.NET writing PCAP files.NET 编写 PCAP 文件
【发布时间】:2012-06-23 12:20:04
【问题描述】:

全部,

我花了相当一部分时间研究各种 PCAP 库,在我承诺编写 PCAP 编写器之前,我想描述一下我的场景并征求意见。

我有一个客户要求我提供读取 pcap 文件并将数据包写入他们选择的数据库的服务。然后客户端可以查询数据库(日期时间范围),结果最终应该是一个 pcap 文件,其中包含与该范围条件匹配的数据包。

到目前为止,我在库中发现的是 pcap 的“转储”(即写入)似乎仅在与特定捕获设备相关联时才可用。我的场景不是这种情况。

我正在使用 PCAP.NET 读取原始 pcap 文件并提取数据包。我将数据包存储到数据库中,然后我可以从数据库中读取数据并重新创建数据包,但我没有找到将查询结果写入 pcap 文件的方法。

最简单的情况,考虑一个 Packet 类型的 List 数据结构(对于实际写入堆栈溢出非常陌生,以至于我不知道如何编写未过滤尖括号的 T 列表)- 执行以下任何操作可用的库是否支持将该结构写入 pcap?

鉴于这似乎不是一个常见的场景,我想知道整个场景的有效性。我还应该指出,我总共有两天时间处理 PCAP 数据,这应该是概念应用的证明,因此我完全有可能错过了使这变得微不足道的知识。

感谢您的宝贵时间和考虑,如果我在 Google 上的尝试以及更多时间在 Stack Overflow 搜索上忽略了显而易见的事情,请提前道歉。

克里斯

【问题讨论】:

    标签: c# .net winpcap pcap.net


    【解决方案1】:

    我相信 Pcap.Net 的静态方法 PacketDumpFile.Dump() 可以满足您的需求。

    【讨论】:

    • 我完全错过了那个方法...谢谢!我一直在 PacketDumpFile 类上寻找实例构造函数,然后允许自己使用转储设备对样本进行隧道视觉。再次感谢您的回复,您在回答我的问题方面提供了很大帮助。
    【解决方案2】:

    这是我用 C# 编写的用于将 ETL 转换为 PCAP 文件的简单工具,这是一个如何编写 PCAP 文件的示例。这将使用以太网的链路层标头类型写入文件。其他类型请参考http://www.tcpdump.org/linktypes.html

    Visual Studio 解决方案在这里https://github.com/chentiangemalc/EtlToCap

    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;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-24
      • 2011-07-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2020-02-27
      • 2016-02-04
      • 2013-04-15
      • 1970-01-01
      相关资源
      最近更新 更多