یک برنامه نویس مبتدی

یادداشت های بک برنامه نویس

یک برنامه نویس مبتدی

یادداشت های بک برنامه نویس

آشنایی با کتابخانه قدرتمند PCap.Net - بخش ششم

تفسیر پاکت ها

حال که قادر به ضبط و فیلتر کردن ترافیک هستیم ، می خواهیم دانش خود را برای کار بر روی یک برنامه دنیای واقعی به کار ببندیم.

در این بخش از بخشی از کد های درس های قبل برای ساخت برنامه بسیار کاربردی تر بهره خواهیم گرفت ، هدف اصلی برنامه جاری نشان دادن تجزیه سرآیند پاکت دریافت شده و تفسیر آن است. برنامه خروجی UDPDump نامیده می شود و خلاصه ترافیک UDP شبکه را چاپ می کند.

ما پروتکل UDP را برای تجزیه و نمایش انتخاب کرده ایم زیرا قابل دستیابی تر از سایر پروتکل ها مانند TCP است و برای مثال اول بسیار مناسب است.بیایید نگاهی به کد بیاندازیم:

 

using System;

using System.Collections.Generic;

using PcapDotNet.Core;

using PcapDotNet.Packets;

using PcapDotNet.Packets.IpV4;

using PcapDotNet.Packets.Transport;

 

namespace InterpretingThePackets

{

    class Program

    {

        static void Main(string[] args)

        {

            // Retrieve the device list from the local machine

            IList<LivePacketDevice> allDevices = LivePacketDevice.AllLocalMachine;

 

            if (allDevices.Count == 0)

            {

                Console.WriteLine("No interfaces found! Make sure WinPcap is installed.");

                return;

            }

 

            // Print the list

            for (int i = 0; i != allDevices.Count; ++i)

            {

                LivePacketDevice device = allDevices[i];

                Console.Write((i + 1) + ". " + device.Name);

                if (device.Description != null)

                    Console.WriteLine(" (" + device.Description + ")");

                else

                    Console.WriteLine(" (No description available)");

            }

 

            int deviceIndex = 0;

            do

            {

                Console.WriteLine("Enter the interface number (1-" + allDevices.Count + "):");

                string deviceIndexString = Console.ReadLine();

                if (!int.TryParse(deviceIndexString, out deviceIndex) ||

                    deviceIndex < 1 || deviceIndex > allDevices.Count)

                {

                    deviceIndex = 0;

                }

            } while (deviceIndex == 0);

 

            // Take the selected adapter

            PacketDevice selectedDevice = allDevices[deviceIndex - 1];

 

            // Open the device

            using (PacketCommunicator communicator =

                selectedDevice.Open(65536,                                  // portion of the packet to capture

                                                                            // 65536 guarantees that the whole packet will be captured on all the link layers

                                    PacketDeviceOpenAttributes.Promiscuous, // promiscuous mode

                                    1000))                                  // read timeout

            {

                // Check the link layer. We support only Ethernet for simplicity.

                if (communicator.DataLink.Kind != DataLinkKind.Ethernet)

                {

                    Console.WriteLine("This program works only on Ethernet networks.");

                    return;

                }

 

                // Compile the filter

                using (BerkeleyPacketFilter filter = communicator.CreateFilter("ip and udp"))

                {

                    // Set the filter

                    communicator.SetFilter(filter);

                }

 

                Console.WriteLine("Listening on " + selectedDevice.Description + "...");

 

                // start the capture

                communicator.ReceivePackets(0, PacketHandler);

            }

        }

 

        // Callback function invoked by libpcap for every incoming packet

        private static void PacketHandler(Packet packet)

        {

            // print timestamp and length of the packet

            Console.WriteLine(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") + " length:" + packet.Length);

 

            IpV4Datagram ip = packet.Ethernet.IpV4;

            UdpDatagram udp = ip.Udp;

           

            // print ip addresses and udp ports

            Console.WriteLine(ip.Source + ":" + udp.SourcePort+ " -> " + ip.Destination + ":" + udp.DestinationPort);

        }

    }

}


قبل از هرچیز، ما فیلتر "ip and udp" را ست کردیم. با این روش ما مطمئن هستیم که PacketHandler() تنها پاکت های UPD تحت پروتکل IPv4 را دریافت خواهد کرد.این کار ، کار تجزیه را ساده تر کرده و کارایی آن را افزایش می دهد.

PacketHandler() ، همچنین به یک تشریح کننده پروتکل  (UDP on IPv4) محدود شده است سادگی دیکود کردن ترافیک شبکه توسط Pcap.Net را نشان می دهد.ما مایل به استفاده از سرآیند MAC نیسیتم ، مستقیما داده گرام IP را دریافت می کنیم. برای سادگی و پیش از شروع ضبط، ما لایه MAC را با مشخصه DataLink بررسی می کنیم تا مطمئن شویم با شبکه اترنت سروکار داریم.

داده گرام IP بعد از سرآیند MAC قرار گرفته است.ما IP مبدا و مقصد را از سرآیند استخراج خواهیم کرد.

داده گرام IP رسیده با فراخوانی ساده مشخصه UDP ساخته شده است (حتی پیاده سازی این مشخصه نیز کمی پیچیده است زیرا سرآیند IP طرول ثابتی ندارد).زمانی که ما داده گرام UDP را در اختیار داشتیم، پورت های مبدا و مقصد را استخراج کردیم، مقادیر استخراج شده در صفحه نمایش چاپ شدند.

مقادیراستخراج شده و در صفحه نمایش چاپ شدند ، خروجی چیزی شبیه لیست زیر بود:

2009-09-12 11:25:51.117 length:84

10.0.0.8:49003 -> 208.67.222.222:53

2009-09-12 11:25:51.212 length:125

208.67.222.222:53 -> 10.0.0.8:49003

2009-09-12 11:25:54.323 length:80

10.0.0.8:39209 -> 208.67.222.222:53

2009-09-12 11:25:54.426 length:75

10.0.0.8:47869 -> 208.67.222.222:53

2009-09-12 11:25:54.517 length:236

208.67.222.222:53 -> 10.0.0.8:39209

2009-09-12 11:25:54.621 length:91

208.67.222.222:53 -> 10.0.0.8:47869


نظرات 0 + ارسال نظر
برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد