Всем привет, у меня такая проблемка, нужен анализатор и классификатор трафика, что-то по типу Charles, но хочу сделать сам. Как можно получать трафик компа? Сделал некоторую часть кода, но выходит вот такой результат: из этого мне нужно как-то понять, какой сервис отправляет или принимает эти пакеты. Вот код(подскажите, действую в правильном направлении или нужно сделать что-то другое?): using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using PacketDotNet; using SharpPcap; using SharpPcap.WinPcap; namespace ConsoleTraf { internal class Program { CaptureDeviceList dList; ICaptureDevice device; Thread thread; static ICaptureDevice captureDevice; static int i = 0; static string s = ""; static void Main(string[] args) { capture(); } static void capture() { int x = 0; while (x != 9) { try { CaptureDeviceList deviceList = CaptureDeviceList.Instance; // выбираем первое устройство в спсике (для примера) int z = 0; double maxByteSum = 0; PerformanceCounterCategory performanceCounterCategory = new PerformanceCounterCategory("Network Interface"); string instance = performanceCounterCategory.GetInstanceNames()[0]; // 1st NIC ! PerformanceCounter performanceCounterSent = new PerformanceCounter("Network Interface", "Bytes Sent/sec", instance); PerformanceCounter performanceCounterReceived = new PerformanceCounter("Network Interface", "Bytes Received/sec", instance); for (int i = 0; i < 1000; i++) { //Console.WriteLine("bytes sent: {0}\tbytes received: {1}", performanceCounterSent.NextValue(), performanceCounterReceived.NextValue()); if ((double)performanceCounterReceived.NextValue() > maxByteSum) { maxByteSum = (double)performanceCounterReceived.NextValue(); } Thread.Sleep(10); } if (maxByteSum > 7000) { Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); } for (int i = 0; i < 9; i++) { Console.Write(i + "\n"); Console.WriteLine(deviceList[i]); } //foreach (var dev in deviceList) //{ // Console.WriteLine(Convert.ToString(z), dev); // z++; // //richTextBox1.AppendText(dev.Name); // //MessageBox.Show(dev.Name); //} //for (int i = 0; i < deviceList.Count; i++) //{ captureDevice = deviceList[4]; // регистрируем событие, которое срабатывает, когда пришел новый пакет captureDevice.OnPacketArrival += new PacketArrivalEventHandler(Program_OnPacketArrival); // открываем в режиме promiscuous, поддерживается также нормальный режим captureDevice.Open(DeviceMode.Promiscuous, 1000); // начинаем захват пакетов captureDevice.StartCapture(); //} x++; } catch (ThreadAbortException) { Thread.ResetAbort(); captureDevice.Close(); captureDevice.OnPacketArrival -= new PacketArrivalEventHandler(Program_OnPacketArrival); return; } } } static void Program_OnPacketArrival(object sender, CaptureEventArgs e) { // парсинг всего пакета Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var ip = packet.Extract<PacketDotNet.IPPacket>(); string ipInfoTo = Convert.ToString(ip); if (ip != null) { Console.WriteLine("Original IP packet: " + ip.ToString() + "\n"); } var tcp = packet.Extract<PacketDotNet.TcpPacket>(); string tcpInfo = Convert.ToString(tcp); if (tcp != null) { Console.WriteLine("Original TCP packet: " + tcp.ToString() + "\n"); } var udp = packet.Extract<PacketDotNet.UdpPacket>(); string udpInfo = Convert.ToString(udp); if (udp != null) { Console.WriteLine("Orig Upd packet: " + udp.ToString() + "\n"); } if (ipInfoTo.Contains("IPv6Packet") && udpInfo != null || udpInfo != "" /*&& ipInfoTo.Contains("TimeToLive=128"*/) { Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); } if (ipInfoTo.Contains("IPv4Packet") && udpInfo == null || udpInfo == "" && tcpInfo.Contains("SourcePort=443") && ipInfoTo.Contains("SourcePort=443")) { Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); } Console.WriteLine("------------------------------"); } } } C# using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using PacketDotNet; using SharpPcap; using SharpPcap.WinPcap; namespace ConsoleTraf { internal class Program { CaptureDeviceList dList; ICaptureDevice device; Thread thread; static ICaptureDevice captureDevice; static int i = 0; static string s = ""; static void Main(string[] args) { capture(); } static void capture() { int x = 0; while (x != 9) { try { CaptureDeviceList deviceList = CaptureDeviceList.Instance; // выбираем первое устройство в спсике (для примера) int z = 0; double maxByteSum = 0; PerformanceCounterCategory performanceCounterCategory = new PerformanceCounterCategory("Network Interface"); string instance = performanceCounterCategory.GetInstanceNames()[0]; // 1st NIC ! PerformanceCounter performanceCounterSent = new PerformanceCounter("Network Interface", "Bytes Sent/sec", instance); PerformanceCounter performanceCounterReceived = new PerformanceCounter("Network Interface", "Bytes Received/sec", instance); for (int i = 0; i < 1000; i++) { //Console.WriteLine("bytes sent: {0}\tbytes received: {1}", performanceCounterSent.NextValue(), performanceCounterReceived.NextValue()); if ((double)performanceCounterReceived.NextValue() > maxByteSum) { maxByteSum = (double)performanceCounterReceived.NextValue(); } Thread.Sleep(10); } if (maxByteSum > 7000) { Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); Console.WriteLine("Используется видео-хостинг!"); } for (int i = 0; i < 9; i++) { Console.Write(i + "\n"); Console.WriteLine(deviceList[i]); } //foreach (var dev in deviceList) //{ // Console.WriteLine(Convert.ToString(z), dev); // z++; // //richTextBox1.AppendText(dev.Name); // //MessageBox.Show(dev.Name); //} //for (int i = 0; i < deviceList.Count; i++) //{ captureDevice = deviceList[4]; // регистрируем событие, которое срабатывает, когда пришел новый пакет captureDevice.OnPacketArrival += new PacketArrivalEventHandler(Program_OnPacketArrival); // открываем в режиме promiscuous, поддерживается также нормальный режим captureDevice.Open(DeviceMode.Promiscuous, 1000); // начинаем захват пакетов captureDevice.StartCapture(); //} x++; } catch (ThreadAbortException) { Thread.ResetAbort(); captureDevice.Close(); captureDevice.OnPacketArrival -= new PacketArrivalEventHandler(Program_OnPacketArrival); return; } } } static void Program_OnPacketArrival(object sender, CaptureEventArgs e) { // парсинг всего пакета Packet packet = Packet.ParsePacket(e.Packet.LinkLayerType, e.Packet.Data); var ip = packet.Extract<PacketDotNet.IPPacket>(); string ipInfoTo = Convert.ToString(ip); if (ip != null) { Console.WriteLine("Original IP packet: " + ip.ToString() + "\n"); } var tcp = packet.Extract<PacketDotNet.TcpPacket>(); string tcpInfo = Convert.ToString(tcp); if (tcp != null) { Console.WriteLine("Original TCP packet: " + tcp.ToString() + "\n"); } var udp = packet.Extract<PacketDotNet.UdpPacket>(); string udpInfo = Convert.ToString(udp); if (udp != null) { Console.WriteLine("Orig Upd packet: " + udp.ToString() + "\n"); } if (ipInfoTo.Contains("IPv6Packet") && udpInfo != null || udpInfo != "" /*&& ipInfoTo.Contains("TimeToLive=128"*/) { Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); Console.WriteLine("Это ТЕЛЕГРАМ!!!"); } if (ipInfoTo.Contains("IPv4Packet") && udpInfo == null || udpInfo == "" && tcpInfo.Contains("SourcePort=443") && ipInfoTo.Contains("SourcePort=443")) { Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); Console.WriteLine("Это браузер!!!"); } Console.WriteLine("------------------------------"); } } }
А какая вообще цель этой программы? Почему нельзя определить Telegram по открытым процессам? Зачем через пакеты?