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を使用することもできます。このPcap.Netには、パケットキャストを行わずに動的に解析して含まれている可能性のあるものを取得できるPacketクラスが1つだけあります。

Packetオブジェクトを取得して、次のことを実行します(たとえば)。

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

キャストしたり、パケットの種類を事前に知ったりする必要はありません。すべての解析は動的に行われます。

于 2011-10-08T10:54:58.697 に答える