Я попытался создать простую программу подмены IP-адресов.Цель состоит в том, чтобы убедить компьютерную игру в локальной сети подключиться к интернет-серверу.Игра обнаруживает серверы только через широковещательную рассылку UDP и не принимает IP-адрес сервера.
Поэтому вместо этого я хочу заставить игру думать, что она получила информацию об ответе от интернет-сервера, создав поддельный пакет UDP.
Я успешно использовал raw-socket
для генерации пакета IPV4 с полезной нагрузкой UDP.Пока я устанавливаю правильный IP-адрес, он отправляется.
Однако, если я добавлю поддельный IP-адрес в пакет, он не выйдет из машины.Я не вижу его в Wireshark на моей машине.Я также заметил, что что-то исправляет контрольные суммы IPV4 в моем пакете.Я всегда отправляю контрольную сумму 0xFFFF
, но Wireshark видит это:
![enter image description here](https://i.stack.imgur.com/W6P84.png)
Как отправить ее, используя 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)
Кто блокирует и изменяет мои пакеты?Я попытался отключить брандмауэр, но это не помогло.
Обратите внимание, что сообщения теряются ДАЖЕ, ЕСЛИ ЦЕЛЬ - ЛОКАЛЬНАЯ МАШИНА.