Сниффер локального 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();
            }
        }
    }
}

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


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

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

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