لا يمكن التحويل من SharpPcap.RawCapture إلى PacketDotNet.Packet

StackOverflow https://stackoverflow.com/questions/7379516

  •  28-10-2019
  •  | 
  •  

سؤال

لقد كنت أتبع الدليل في 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);
         }
     }
 }
هل كانت مفيدة؟

المحلول

يتم استخدام SharpPcap.RawPacket للاحتفاظ بالبيانات الأولية التي تم التقاطها عبر محول الشبكة ولكن PacketDotNet يحتاج إلى تحليل الحزمة قبل أن تعمل أساليب GetEncapsulated().ستبدو الخطوة التي تحتاجها كما يلي:

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

ثم يمكنك استخراج المغلفة TcpPacket عبر GetEncapsulated() الطريقة عن طريق تمريرها packet.

المثال 12 في تنزيل مصدر SharpPcap على https://sourceforge.net/projects/sharppcap/ يوضح بناء الجملة وكيف يمكن تعديل الحزم.

لا تنسى PacketType.GetEncapsulated() يقوم بإرجاع مرجع إلى ذلك الجزء من الحزمة، لذا فإن تعديله سيؤدي إلى تغيير الحزمة الأصلية.

نصائح أخرى

بدلاً من ذلك ، يمكنك استخدام Pcap.Net ، والتي تحتوي على فئة حزم واحدة فقط يمكنك تحليلها ديناميكيًا للحصول على أي شيءقد تحتوي دون القيام بأي حزمة.

تحصل فقط على كائن Packet وتقوم بما يلي (على سبيل المثال): Genacodicetagpre

لا داعي لإرسالها أو معرفة نوع الحزمة مسبقًا ، فكل عمليات التحليل تتم بشكل ديناميكي.

كتحديث لإجابة كريس مورجان (لأنني أجد نفسي أفعل ذلك اليوم) ، أصبح رمز الترميز العام الآن قديمًا ، وبدلاً من ذلك يجب عليك استخدام رمز الترقيم العام لاستخراج الحزمة المغلفة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top