Сниффер С# (outwar)

С этим кодом я не могу нюхать только локальный трафик (входящий), как я могу нюхать весь трафик (исходящий)

Socket _socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
_socket.Bind(new IPEndPoint(bindTo, 0));
_socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);                           //option to true


byte[] byTrue = new byte[4] { 1, 0, 0, 0 };
byte[] byOut = new byte[4];

_socket.IOControl(IOControlCode.ReceiveAll, byTrue, byOut);

person Fernando Diaz Toledano    schedule 30.12.2015    source источник


Ответы (2)


Не уверен, что вас интересуют сторонние библиотеки, но вы можете использовать SharpPCap, который охватывает вызовы WinPCap. Я бы посоветовал прочитать статью, чтобы понять, что он может сделать.

http://www.codeproject.com/Articles/12458/SharpPcap-A-Packet-Capture-Framework-for-NET

Пример из статьи (упрощенно):

// Extract a device from the list
ICaptureDevice device = devices[i];

// Open the device for capturing
int readTimeoutMilliseconds = 1000;
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);

Console.WriteLine();
Console.WriteLine("-- Listening on {0}...",
    device.Description);

Packet packet = null;

// Keep capture packets using GetNextPacket()
while((packet=device.GetNextPacket()) != null )
{
    // Prints the time and length of each received packet
    DateTime time = packet.PcapHeader.Date;
    int len = packet.PcapHeader.PacketLength;
    Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
        time.Hour, time.Minute, time.Second,
        time.Millisecond, len);
}

// Close the pcap device
device.Close();
Console.WriteLine(" -- Capture stopped, device closed.");

Обратите внимание, что полученный пакет здесь означает пакет, полученный WinPCap. Он не указывает направление, в котором идет пакет. Сюда входит входящий и исходящий трафик, который можно различить по исходному и целевому IP-адресу.

Для этого потребуется, чтобы на любой машине, на которой вы работаете, был установлен WinPCap. WinPCap — это то, что Wireshark использует для захвата пакетов.

Изменить: если вы хотите использовать сырые сокеты, попробуйте следующее:

        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);

        if (_localIp != null)
            _socket.Bind(new IPEndPoint(_localIp, 0));
        _socket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
        var receiveAllOn = BitConverter.GetBytes(1);
        _socket.IOControl(IOControlCode.ReceiveAll, receiveAllOn, null);

        _socket.ReceiveBufferSize = (1 << 16);
        Read();

Я не работал над этим кодом напрямую, но он определенно используется и, кажется, работает: https://github.com/lunyx/CasualMeter/blob/master/NetworkSniffer/IpSnifferRawSocketSingleInterface.cs

Также необходимо запустить от имени администратора с выключенным брандмауэром Windows: https://github.com/lunyx/CasualMeter/pull/47

person Lunyx    schedule 30.12.2015
comment
мне интересно сделать свой собственный сниффер... но я не понимаю, почему он не работает... в ссылке msdn.microsoft.com/en-us/library/windows/desktop/ RCVALL_ON Включите этот параметр, чтобы сокет получал все пакеты IPv4 или IPv6 на сеть. Эта опция включает неразборчивый режим в сети.. и включена... :( - person Fernando Diaz Toledano; 30.12.2015
comment
@FernandoDiazToledano Обновил мой пост. - person Lunyx; 30.12.2015

Эффект брандмауэра Windows ... весь код в порядке!

Установить локальную сеть

Установить этот параметр

person Fernando Diaz Toledano    schedule 30.12.2015