Сниффер локального 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(); } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д