【问题标题】:Attempted to set a negative index while reading PCAP files在读取 PCAP 文件时尝试设置负索引
【发布时间】:2014-06-12 13:17:48
【问题描述】:

我在一组 PCAP 文件上有一个随机出现的问题。我正在尝试使用 SharpPcap 和 PacketDotNet 解析记录的 PCAP 文件中的所有数据包。这些错误似乎是随机发生的。

我没有做任何花哨的事情。以下是我从 PCAP 文件加载的代码:

ICaptureDevice device;
try
{
    device = new CaptureFileReaderDevice(pcapFiles[i].FullName);
    device.Open();
}
catch (Exception ex)
{
    Console.WriteLine("Error opening PCAP file " + ex.ToString());
}
RawCapture packet;
while ((packet = device.GetNextPacket()) != null)
    ProcessPacket(packet);
device.Close();

ProcessPacket 方法中,我得到了

尝试设置负索引

执行以下行时:

var packet = PacketDotNet.Packet.ParsePacket(Packet.LinkLayerType, Packet.Data);

我正在使用这两个库的最新版本,但我尝试使用旧版本实现并遇到同样的问题。

PCAP 文件是由 Suricata IDS 生成的,如果这意味着什么的话。

编辑

我用下面的代码做了一个简单的测试:

    class Program
    {
        static void Main(string[] args)
        {
            FileInfo[] allFiles = new DirectoryInfo(@"D:\PCAP").GetFiles();
            FileInfo[] pcapFiles = allFiles.Where(x => x.Name.Contains("pcap") && x.Length > 0).ToArray();
            for (int i = 0; i < pcapFiles.Length; ++i)
            {
                ICaptureDevice device;
                try
                {
                    device = new CaptureFileReaderDevice(pcapFiles[i].FullName);
                    device.Open();
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Error opening PCAP file " + ex.ToString());
                    return;
                }
                RawCapture packet;
                while ((packet = device.GetNextPacket()) != null)
                {
                    try
                    {
                        ProcessPacket(packet);
                    }
                    catch
                    {
                        Console.WriteLine(pcapFiles[i]);
                        break;
                    }
                }
                device.Close();
            }
            Console.WriteLine("Done.");
            Console.ReadLine();
        }

        public static void ProcessPacket(RawCapture Packet)
        {
            if (Packet.LinkLayerType == PacketDotNet.LinkLayers.Ethernet)
            {
                var packet = PacketDotNet.Packet.ParsePacket(Packet.LinkLayerType, Packet.Data);
                var ethernetPacket = (PacketDotNet.EthernetPacket)packet;
            }
        }
    }

有趣的是,发生错误的文件数量因运行而异。但是,它似乎随着每次运行而增加。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# pcap packet-capture sharppcap packetdotnet


    【解决方案1】:

    我已经通过更改我正在使用的库解决了这个问题。我没有使用 SharpPcap,而是使用了 EasyPcap 库。它完成了它的工作并且使用起来非常简单。

    【讨论】:

    • 这是一个不错的库。已经试过了。但是,我不确定它是否支持 Mono。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 2014-02-04
    • 2017-08-15
    • 1970-01-01
    相关资源
    最近更新 更多