Отправка пакета с поддельным IP-адресом на тот же компьютер с помощью SharpPcap - PullRequest
0 голосов
/ 12 декабря 2018

Как я могу отправить пакет с поддельным IP-адресом (или даже IP и MAC) на один и тот же компьютер, используя SharpPcap?Подумайте о двух частях программного обеспечения, одно отправляющее и одно получающее, на одной коробке.

Я могу уже подделка IP и / или MAC с использованием SharpPcap, когда я отправляю на другую машину .Но это не работает отправка / получение на том же компьютере.На самом деле, я ничего не получаю даже с не подделанными значениями.

Я настраиваю эмуляцию для тестирования здесь на работе, и использование двух машин не является хорошим вариантом.Мне нужны поддельные IP-адреса, потому что принимающий код (который я унаследовал) использует отправителя для интерпретации данных.

Исходя из того, что я прочитал в Интернете, отправка в режиме само-себе обходит сетевое оборудование.Чтобы принудительно включить его, я могу настроить что-то в таблице маршрутизации Windows, возможно, с использованием обратной связи по умолчанию или пользовательской (!).Я пробовал это, и это трудно и пока ненадежно.И я не знаю, означает ли это, что сам NIC пропущен.

Хотя UdpClient позволяет легко отправлять самостоятельно, я не вижу способа подделать его, поэтому я не могу использовать его вместо этого.

Я также пытался просто отправить IP-пакет, исходя из теории, что ни одна сеть не означает Ethernet, но это тоже не сработало.Может быть, я как-то обманываю.

Итак, таблица маршрутизации - мой единственный ответ?В моем случае полностью обойдена сетевая карта?Короче говоря, как мне заставить это работать?

Вот мой код, который работает между двумя компьютерами и дает сбой всем на одной.Большинство вещей находится в конструкторе, но конечный метод EnsureUsableMacAddress() может быть уместным.Свойства, такие как .ReceivingPort, являются реальными.StartCard() и StopCard() просто оберните основы SharpPcap ("карта" == сетевой адаптер), и они, как известно, работают.

    public SpoofPacket(string mac, string ip, string port, byte[] content) {
        ushort inPort = ushort.Parse(ReceivingPort);
        PhysicalAddress inMac = PhysicalAddress.Parse(ReceivingMac.ToUpper());
        IPAddress inIp = IPAddress.Parse(ReceivingIp);

        ushort outPort = ushort.Parse(port);
        PhysicalAddress outMac = PhysicalAddress.Parse(mac.ToUpper());
        IPAddress outIp = IPAddress.Parse(ip);

        EthernetPacket ethernetBlob
            = new EthernetPacket(outMac, inMac, EthernetPacketType.None);


        IpPacket ipBlob = new IPv4Packet(outIp, inIp);
        UdpPacket udpBlob = new UdpPacket(outPort, inPort);

        // Constructing whole packet outward.
        udpBlob.PayloadData = content;
        ipBlob.PayloadPacket = udpBlob;
        ethernetBlob.PayloadPacket = ipBlob;

        WholePacket = ethernetBlob;
    }

    public void Send() {
        StartCard();  // Wraps some SharpPcap stuff.

        // Actually sending.
        _card.SendPacket(WholePacket);

        StopCard();  // Wraps some SharpPcap stuff.
    }

    private static void EnsureUsableMacAddress() {
        PhysicalAddress mac = null;

        for (int at = 0; at < _card.Addresses.Count; at++) {
            mac = _card.Addresses[at].Addr.hardwareAddress;
            if ((mac?.GetAddressBytes().Length ?? 0) == 6) {
                break;
            }
        }

        ReceivingMac = mac.ToString();
    }
...