minecraft实际上是如何连接到服务器的



为了我的迷你项目,我需要在我的客户端和一些服务器之间有一个代理服务器。这段代码有效,但它不起作用。它开始连接,通过登录,停止加密,过了一段时间就超时了,我不知道为什么。我一直在重读minecraft协议(https://wiki.vg/Protocol#Handshake)和握手,但我仍然不明白为什么它不起作用。console.log((用于调试,我从中推断出,无论出于何种原因,服务器都不会发送设置的压缩/登录成功数据包。

var net = require('net');
var mcip = "mc.hypixel.net";
var mcport = 25565;
var server = net.createServer((socket) =>{
var remoteAddress = socket.remoteAddress + ':' + socket.remotePort;
console.log('new client connection from %s' + remoteAddress);
socket.on('data', (d)=>{
var client = net.connect(mcport,mcip, ()=>{
console.log("connected to server");
client.on("data", (data)=>{
socket.write(data);
console.log(data);
console.log("S -> C");
client.end();
});
client.write(d);
console.log(d);
console.log("C -> S");
});
});
});
server.listen(25565);

这里的一个大问题是,每次客户端发送数据时,您都会重新连接到Hypixel!当你的客户端连接到你时,你需要重新安排,只连接到服务器一次。

socket.on('data', (d)=>{
var client = net.connect(mcport,mcip, ()=>{
console.log("connected to server");
client.on("data", (data)=>{
socket.write(data);
console.log(data);
console.log("S -> C");
client.end();
});
client.write(d);
console.log(d);
console.log("C -> S");
});
});

变成这样:

var client = net.connect(mcport,mcip, ()=>{
console.log("connected to server");
client.on("data", (data)=>{
socket.write(data);
console.log(data);
console.log("S -> C");
});
});
socket.on('data', (d)=>{
client.write(d);
console.log(d);
console.log("C -> S");
});

请注意,现在我们并没有结束与Hypixel的连接,我们保持它的打开&继续向客户端发送数据。(您应该在客户端断开连接时,在socket.on('close', (hadError)=>{...})处理程序中处理关闭连接(

有了这个变化,代理开始工作,但Hypixel会立即踢你没有通过正确的地址连接。在握手数据包中,连接的minecraft客户端会将服务器地址设置为代理服务器的地址,因为就其而言,这就是它要连接的地址。Hypixel发现这不是";mc.hypixel.net"&踢客户。

即使不是这样,一旦连接达到播放状态,您将无法看到任何有意义的数据(我怀疑您希望看到(,因为这些数据都是由aes CFB-8流密码加密的,密钥是使用RSA从MC客户端传递到服务器的(您无法获得它(。

不要让这让你气馁,尽管,它是可能mitm一个minecraft c&lt->s连接。它只是涉及更多:p如果你想进一步讨论这个话题,请随时添加我的意见(Azurethi#0789(。

最新更新