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