通过本地主机连接到我的世界服务器

问题描述 投票:0回答:3

我尝试为您连接的 Minecraft 服务器创建一个代理服务器,这样您就可以修改 Minecraft 协议和/或其他内容。

我尝试做一个像这样的 TCP 代理服务器,它将套接字重定向到给定的地址:

var net = require("net");

process.on("uncaughtException", function(error) {
  console.error(error);
});

if (process.argv.length != 5) {
  console.log("usage: %s <localport> <remotehost> <remoteport>", process.argv[1]);
  process.exit();
}

var localport = process.argv[2];
var remotehost = process.argv[3];
var remoteport = process.argv[4];

var server = net.createServer(function (localsocket) {
  var remotesocket = new net.Socket();

  remotesocket.connect(remoteport, remotehost);

  localsocket.on('connect', function (data) {
    console.log(">>> connection #%d from %s:%d",
      server.connections,
      localsocket.remoteAddress,
      localsocket.remotePort
    );
  });

  localsocket.on('data', function (data) {
    console.log("%s:%d - writing data to remote",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    var flushed = remotesocket.write(data);
    if (!flushed) {
      console.log("  remote not flushed; pausing local");
      localsocket.pause();
    }
  });

  remotesocket.on('data', function(data) {
    console.log("%s:%d - writing data to local",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    var flushed = localsocket.write(data);
    if (!flushed) {
      console.log("  local not flushed; pausing remote");
      remotesocket.pause();
    }
  });

  localsocket.on('drain', function() {
    console.log("%s:%d - resuming remote",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    remotesocket.resume();
  });

  remotesocket.on('drain', function() {
    console.log("%s:%d - resuming local",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    localsocket.resume();
  });

  localsocket.on('close', function(had_error) {
    console.log("%s:%d - closing remote",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    remotesocket.end();
  });

  remotesocket.on('close', function(had_error) {
    console.log("%s:%d - closing local",
      localsocket.remoteAddress,
      localsocket.remotePort
    );
    localsocket.end();
  });

});

server.listen(localport);

console.log("redirecting connections from 127.0.0.1:%d to %s:%d", localport, remotehost, remoteport);

不幸的是,这是重定向到错误的地址?然而,这种方法似乎在一些破解的《我的世界》服务器上运行良好,但在 hypixel 上则不然。

这些是我尝试输入 127.0.0.1:25565 (localhost:25565) 时收到的日志

redirecting connections from 127.0.0.1:25565 to mc.hypixel.net:25565
::ffff:127.0.0.1:50233 - writing data to remote
::ffff:127.0.0.1:50233 - writing data to local
::ffff:127.0.0.1:50233 - writing data to remote
::ffff:127.0.0.1:50233 - writing data to local
::ffff:127.0.0.1:50233 - closing local
::ffff:127.0.0.1:50233 - closing remote

此外,我尝试使用https://github.com/darcros/node-minecraft-proxy,但我没有收到任何错误,只是在尝试连接时超时。

我认为我的客户端正在尝试连接到该 IP,并将握手和端口放入其中。服务器接收数据包并将其解包。由于来源是 localhost,而不是服务器的原始服务器 IP 和端口,因此我收到安全错误。

此外,我还尝试使用mineflayer机器人连接到服务器,这最终导致我的客户端在能够执行任何操作之前再次超时。

const mineflayer = require('mineflayer');
const net = require('net');

const server = net.createServer((socket) => {
  console.log('New connection from local server');
  const bot = mineflayer.createBot({
    host: 'mc.hypixel.net',
    port: 25565,
  });

  // Handle incoming packets from the local server
  socket.on('data', (packet) => {
    console.log('Received packet from local server');
    bot._client.write(packet);
  });

  // Handle incoming packets from the target server
  bot.on('packet', (packet) => {
    console.log('Received packet from target server');
    server.send(packet, 0, packet.length, 25565, 'localhost');
  });
});
server.listen(25565);

发送本地服务器收到的数据包并将其重定向到目标服务器时可能出现问题,因为当我尝试记录所有数据包时,

bot
没有收到数据包,但是本地服务器确实收到了一个以
0f 00 2f

我不是这意味着什么的专家,但这可能是一个验证包吗?

javascript node.js tcp proxy minecraft
3个回答
6
投票

这不是代码的问题,而是防止中间人攻击的安全功能。您的 Minecraft 客户端正在与服务器握手,在此过程中,客户端会发送一个握手数据包。该数据包包含信息,包括服务器地址。 Hypixel 读取数据包并假设您的连接已受到损害。

如果您想欺骗 Minecraft 客户端发送正确的主机名, 您可以编辑您的主机文件将 mc.hypixel.net 重定向到本地主机:

127.0.0.1 mc.hypixel.net

然后,在端口 25565 上运行代理并连接到 mc.hypixel.net, 您的操作系统会自动将其路由到您的代理。

也有一些被黑的客户端具有此功能,但我不建议使用它们,因为它们很粗略。


0
投票

我认为你不能简单地重定向数据包来完成工作,感谢@Samarth Pradeep,我们知道为什么。 在这种情况下,你实际上有两种方法:

  1. 因为你知道如何与远程服务器交互,所以你可以修补数据中的字节来更改目标ip(理解和找到方法非常复杂,但更优雅)
  2. 让您的代理模拟其客户端的服务器端和远程服务器的客户端。

对于第一种方法,您可以查看 Minecraft wiki,对于第二种方法 - 使用像 mcproto

这样的库

0
投票

你能告诉我你是怎么做到的吗?我想这样做,但重定向到另一台服务器。可以的话可以发一下代码吗?

© www.soinside.com 2019 - 2024. All rights reserved.