لا يمكن التحويل من SharpPcap.RawCapture إلى PacketDotNet.Packet
سؤال
لقد كنت أتبع الدليل في 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
لا داعي لإرسالها أو معرفة نوع الحزمة مسبقًا ، فكل عمليات التحليل تتم بشكل ديناميكي.
كتحديث لإجابة كريس مورجان (لأنني أجد نفسي أفعل ذلك اليوم) ، أصبح رمز الترميز العام الآن قديمًا ، وبدلاً من ذلك يجب عليك استخدام رمز الترقيم العام لاستخراج الحزمة المغلفة.