Сниффер локального SMTP сервера по порту TCP - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени! Есть локальный SMTP сервер который расположен на 25-ом порту TCP и несколько клиентов-"роботов", подключённых к этому серверу. Клиенты между собой общаются через сервер, однако логи не ведутся. Возможно ли перехватить сообщения? Ищу ответ уже несколько дней, но ничего не выходит..

Решение задачи: «Сниффер локального SMTP сервера по порту TCP»

textual
Листинг программы
  1. using System;
  2. using System.Linq;
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6.  
  7. namespace ConsoleApplication219
  8. {
  9.     static class Program
  10.     {
  11.         static void Main()
  12.         {
  13.             // we are only listening to IPv4 interfaces
  14.             var IPv4Addresses = Dns.GetHostEntry(Dns.GetHostName())
  15.                 .AddressList.Where(al => al.AddressFamily == AddressFamily.InterNetwork)
  16.                 .ToList();
  17.  
  18.             Console.WriteLine("Protocol\tSourceIP:Port\t===>\tDestinationIP:Port");
  19.  
  20.             // start a sniffer for each interface
  21.             foreach (IPAddress ip in IPv4Addresses)
  22.                 Sniff(ip, 21);
  23.  
  24.             // wait until a key is pressed
  25.             Console.Read();
  26.         }
  27.  
  28.         static void Sniff(IPAddress ip, int port, int startDataPos = 40)
  29.         {
  30.             var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
  31.             socket.Bind(new IPEndPoint(ip, 0));
  32.             socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
  33.             socket.IOControl(IOControlCode.ReceiveAll, new byte[4] {1, 0, 0, 0}, null);
  34.  
  35.             byte[] buffer = new byte[65548];
  36.  
  37.             //data recieving and processing
  38.             Action<IAsyncResult> OnReceive = null;
  39.             OnReceive = (ar) =>
  40.             {
  41.                 var count = socket.EndReceive(ar);
  42.                 var protocol = ToProtocolString(buffer[9]);
  43.                 var fromIP = new IPAddress(BitConverter.ToUInt32(buffer, 12));
  44.                 var toIP = new IPAddress(BitConverter.ToUInt32(buffer, 16));
  45.                 var fromPort = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 20));
  46.                 var toPort = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 22));
  47.                 var totalLength = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 2));
  48.  
  49.                 if (toPort == port || fromPort == port)
  50.                 {
  51.                     Console.ForegroundColor = ConsoleColor.Gray;
  52.                     Console.WriteLine("{0}\t{1}:{2}\t===>\t{3}:{4}", protocol, fromIP, fromPort, toIP, toPort);
  53.                     if (totalLength > startDataPos)
  54.                     {
  55.                         var strBytes = buffer.Skip(startDataPos).Take(totalLength - startDataPos).Select(b => (byte) (b < 32 ? 32 : b)).ToArray();
  56.                         var str = Encoding.UTF8.GetString(strBytes);
  57.                         Console.ForegroundColor = ConsoleColor.Yellow;
  58.                         Console.WriteLine(str);
  59.                     }
  60.                 }
  61.                 //clean out our buffer
  62.                 Array.Clear(buffer, 0, buffer.Length);
  63.                 //continue receiving
  64.                 socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
  65.             };
  66.  
  67.             //begin listening to the socket
  68.             socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
  69.         }
  70.  
  71.         public static string ToProtocolString(byte b)
  72.         {
  73.             switch (b)
  74.             {
  75.                 case 1: return "ICMP";
  76.                 case 2: return "IGMP";
  77.                 case 6: return "TCP";
  78.                 case 17: return "UDP";
  79.                 case 41: return "ENCAP";
  80.                 case 89: return "OSPF";
  81.                 case 132: return "SCTP";
  82.                 default: return "#" + b.ToString();
  83.             }
  84.         }
  85.     }
  86. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут