Что может блокировать поддельные UDP-пакеты на компьютере с Windows? - PullRequest
0 голосов
/ 31 мая 2018

Я попытался создать простую программу подмены IP-адресов.Цель состоит в том, чтобы убедить компьютерную игру в локальной сети подключиться к интернет-серверу.Игра обнаруживает серверы только через широковещательную рассылку UDP и не принимает IP-адрес сервера.

Поэтому вместо этого я хочу заставить игру думать, что она получила информацию об ответе от интернет-сервера, создав поддельный пакет UDP.

Я успешно использовал raw-socket для генерации пакета IPV4 с полезной нагрузкой UDP.Пока я устанавливаю правильный IP-адрес, он отправляется.

Однако, если я добавлю поддельный IP-адрес в пакет, он не выйдет из машины.Я не вижу его в Wireshark на моей машине.Я также заметил, что что-то исправляет контрольные суммы IPV4 в моем пакете.Я всегда отправляю контрольную сумму 0xFFFF, но Wireshark видит это:

enter image description here

Как отправить ее, используя raw-socket:

const raw = require("raw-socket");
const UDPPacket = require("../generic/UDPPacket");
const IPV4Packet = require("../generic/IPV4Packet");

var socket = raw.createSocket({ protocol: raw.Protocol.UDP });

socket.on("message", function (buffer, source) {
    console.log("received " + buffer.length + " bytes from " + source);
});
// UDPPacket and IPV4 packet are classes that I wrote in order to 
// generate the UDP and IPV4 byte data
const packet = new UDPPacket();
packet.srcPort = 27888;
packet.dstPort = 1234;
packet.data = responseBuffer;
const buf = packet.fullBuffer;
const ipv4packet = new IPV4Packet();
ipv4packet.payloadBuffer = buf;

// I send the message form several IPs, but only mine works
const iprand = "192.168.110.";
let ipincrement = 75 * 2;
// my actual IP right now
ipv4packet.srcAddr = "192.168.110.79";
ipv4packet.dstAddr = "192.168.110.1";


setInterval(() => {
    // Try to send it from another IP
    ipv4packet.srcAddr = iprand + Math.round((++ipincrement)/2);
    const ipv4buf = ipv4packet.fullBuffer;
    socket.send(ipv4buf, 0, ipv4buf.length, ipv4packet.dstAddr, function (error, bytes) {
        // I'm not sure what does this exactly do,
        // I found it on the internet ¯\_(ツ)_/¯
        // But without it, I cannot send the IPV4 headers
        socket.setOption(
            raw.SocketLevel.IPPROTO_IP,
            raw.SocketOption.IP_HDRINCL,
            new Buffer([0x01, 0x00, 0x00, 0x00]),
            4
        );
    },
    function (error, bytes) {
        // always prints that bytes were sent
        if (error)
            console.log(error.toString());
        else
            console.log(bytes, " bytes sent!");
    }
    );
}, 700)

Кто блокирует и изменяет мои пакеты?Я попытался отключить брандмауэр, но это не помогло.

Обратите внимание, что сообщения теряются ДАЖЕ, ЕСЛИ ЦЕЛЬ - ЛОКАЛЬНАЯ МАШИНА.

1 Ответ

0 голосов
/ 31 мая 2018

См. https://msdn.microsoft.com/en-us/library/windows/desktop/ms740548(v=vs.85).aspx:

В Windows 7, Windows Vista, Windows XP с пакетом обновления 2 (SP2) и Windows XP с пакетом обновления 3 (SP3) возможность отправки трафика через необработанные сокеты имеетбыли ограничены несколькими способами:

дейтаграммы UDP с неверным адресом источника не могут быть отправлены через необработанные сокеты.IP-адрес источника для любой исходящей дейтаграммы UDP должен существовать в сетевом интерфейсе, иначе датаграмма будет отброшена.Это изменение было сделано, чтобы ограничить способность вредоносного кода создавать распределенные атаки типа «отказ в обслуживании» и ограничивать возможность отправки поддельных пакетов (пакетов TCP / IP с поддельным IP-адресом источника).

...