Сниффер локального SMTP сервера по порту TCP - C#
Формулировка задачи:
Доброго времени!
Есть локальный SMTP сервер который расположен на 25-ом порту TCP
и несколько клиентов-"роботов", подключённых к этому серверу.
Клиенты между собой общаются через сервер, однако логи не ведутся.
Возможно ли перехватить сообщения?
Ищу ответ уже несколько дней, но ничего не выходит..
Решение задачи: «Сниффер локального SMTP сервера по порту TCP»
textual
Листинг программы
- using System;
- using System.Linq;
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- namespace ConsoleApplication219
- {
- static class Program
- {
- static void Main()
- {
- // we are only listening to IPv4 interfaces
- var IPv4Addresses = Dns.GetHostEntry(Dns.GetHostName())
- .AddressList.Where(al => al.AddressFamily == AddressFamily.InterNetwork)
- .ToList();
- Console.WriteLine("Protocol\tSourceIP:Port\t===>\tDestinationIP:Port");
- // start a sniffer for each interface
- foreach (IPAddress ip in IPv4Addresses)
- Sniff(ip, 21);
- // wait until a key is pressed
- Console.Read();
- }
- static void Sniff(IPAddress ip, int port, int startDataPos = 40)
- {
- var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
- socket.Bind(new IPEndPoint(ip, 0));
- socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
- socket.IOControl(IOControlCode.ReceiveAll, new byte[4] {1, 0, 0, 0}, null);
- byte[] buffer = new byte[65548];
- //data recieving and processing
- Action<IAsyncResult> OnReceive = null;
- OnReceive = (ar) =>
- {
- var count = socket.EndReceive(ar);
- var protocol = ToProtocolString(buffer[9]);
- var fromIP = new IPAddress(BitConverter.ToUInt32(buffer, 12));
- var toIP = new IPAddress(BitConverter.ToUInt32(buffer, 16));
- var fromPort = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 20));
- var toPort = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 22));
- var totalLength = (ushort) IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 2));
- if (toPort == port || fromPort == port)
- {
- Console.ForegroundColor = ConsoleColor.Gray;
- Console.WriteLine("{0}\t{1}:{2}\t===>\t{3}:{4}", protocol, fromIP, fromPort, toIP, toPort);
- if (totalLength > startDataPos)
- {
- var strBytes = buffer.Skip(startDataPos).Take(totalLength - startDataPos).Select(b => (byte) (b < 32 ? 32 : b)).ToArray();
- var str = Encoding.UTF8.GetString(strBytes);
- Console.ForegroundColor = ConsoleColor.Yellow;
- Console.WriteLine(str);
- }
- }
- //clean out our buffer
- Array.Clear(buffer, 0, buffer.Length);
- //continue receiving
- socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
- };
- //begin listening to the socket
- socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
- }
- public static string ToProtocolString(byte b)
- {
- switch (b)
- {
- case 1: return "ICMP";
- case 2: return "IGMP";
- case 6: return "TCP";
- case 17: return "UDP";
- case 41: return "ENCAP";
- case 89: return "OSPF";
- case 132: return "SCTP";
- default: return "#" + b.ToString();
- }
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д