通过 localhost 连接到 Minecraft 服务器

Nur*_*007 4 javascript proxy tcp node.js minecraft

我尝试为您连接的 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);
Run Code Online (Sandbox Code Playgroud)

不幸的是,这是重定向到错误的地址?然而,这种方法似乎在一些破解的《我的世界》服务器上运行良好,但在 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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);
Run Code Online (Sandbox Code Playgroud)

发送本地服务器收到的数据包并将其重定向到目标服务器时可能出现问题,因为当我尝试记录所有数据包时,它bot没有收到数据包,但是本地服务器确实收到了以0f 00 2f.

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

小智 6

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

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

127.0.0.1 mc.hypixel.net
Run Code Online (Sandbox Code Playgroud)

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

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