تفسیر پاکت ها
حال که قادر به ضبط و فیلتر کردن ترافیک هستیم ، می خواهیم دانش خود را برای کار بر روی یک برنامه دنیای واقعی به کار ببندیم.
در این بخش از بخشی از کد های درس های قبل برای ساخت برنامه بسیار کاربردی تر بهره خواهیم گرفت ، هدف اصلی برنامه جاری نشان دادن تجزیه سرآیند پاکت دریافت شده و تفسیر آن است. برنامه خروجی 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