6

我一直在遵循http://www.codeproject.com/KB/IP/sharppcap.aspx上的指南来实现一个简单的数据包嗅探器来为我自动进行身份验证,我已经设法进入过滤部分,并且到目前为止,必须对教程代码进行一些调整才能使其正常工作,但我现在很难过。

我收到的错误是;

'PacketDotNet.TcpPacket.GetEncapsulated(PacketDotNet.Packet)' 的最佳重载方法匹配有一些无效参数

参数 1:无法从 'SharpPcap.RawCapture' 转换为 'PacketDotNet.Packet'

但是我还没有对我自己的 PacketDotNet 进行任何引用(到目前为止,一切都是 SharpPcap)。

我到目前为止的整个代码都包括在内,问题出在 device_OnPacketArrival() 函数中。

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using PacketDotNet;
 using SharpPcap;

 namespace ConsoleApplication1
 {
     class Program
     {
         static void Main(string[] args)
         {
             string ver = SharpPcap.Version.VersionString;
             Console.WriteLine("SharpPcap {0}, Example1.IfList.cs", ver);

             // Retrieve the device list
             CaptureDeviceList devices = CaptureDeviceList.Instance;

             // If no devices were found print an error
             if (devices.Count < 1)
             {
                 Console.WriteLine("No devices were found on this machine");
                 return;
             }

             // Extract a device from the list
             ICaptureDevice device = devices[0];

             // Register our handler function to the
             // 'packet arrival' event
             device.OnPacketArrival +=
                 new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival);

             // Open the device for capturing
             int readTimeoutMilliseconds = 1000;
             device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

             // tcpdump filter to capture only TCP/IP packets
             string filter = "ip and tcp";
             device.Filter = filter;

             Console.WriteLine();
             Console.WriteLine("-- The following tcpdump filter will be applied: \"{0}\"",
                 filter);
             Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
                 device.Description);

             // Start capturing packets indefinitely
             device.Capture();

             // Close the pcap device
             // (Note: this line will never be called since
             // we're capturing indefinitely
             device.Close();
         }
         private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
         {
             var tcp = TcpPacket.GetEncapsulated(e.Packet);
         }
     }
 }
4

3 回答 3

6

SharpPcap.RawPacket 用于保存通过网络适配器捕获的原始数据,但 PacketDotNet 需要在 GetEncapsulated() 方法起作用之前解析数据包。您需要的步骤如下所示:

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

然后你可以通过传递它TcpPacket的方法提取封装的内容。GetEncapsulated()packet

https://sourceforge.net/projects/sharppcap/ SharpPcap 源下载中的示例 12显示了语法以及如何修改数据包。

请记住,这PacketType.GetEncapsulated()是返回对数据包该部分的引用,因此修改它会改变原始数据包。

于 2011-09-11T17:21:48.267 回答
1

作为 Chris Morgan 答案的更新(因为我发现自己今天正在这样做),getEncapsulated()现在已经过时了,您应该使用它packet.Extract()来提取封装的数据包。

于 2016-03-09T23:18:51.807 回答
0

或者,您可以使用Pcap.Net,它只有一个 Packet 类,您可以动态解析以获取它可能包含的任何内容,而无需进行任何数据包转换。

您只需获取一个 Packet 对象并执行(例如):

uint sequenceNumber = packet.Ethernet.IpV4.Tcp.SequenceNumber;

无需强制转换或预先知道它是什么类型的数据包,所有解析都是动态完成的。

于 2011-10-08T10:54:58.697 回答