W celu mojego mini projektu potrzebuję serwera proxy między moim klientem a niektóre serwer. Ten kod działa jeszcze nie działa. Zaczyna się łączyć, jedzie logowanie i zatrzymuje się w szyfrowaniu, a potem po chwili czasie i nie mogę zrozumieć dlaczego. Odczytałem Protokół Minecraft (https://wiki.vg/protocol#handshake) i Uścisk dłoni, ale nadal nie mogę dowiedzieć się, dlaczego nie działa. Console.log () są do debugowania, a od niej odliczałem to z jakiegokolwiek powodu, dla którego serwer nigdy wysyła zestaw zestawów SET Compression / Login Success.

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);
0
markisha64 22 listopad 2020, 22:15

1 odpowiedź

Najlepsza odpowiedź

Dużym problemem jest to, że ponowne połączenie się z Hypissel za każdym razem, gdy klient wysyła dane! Musisz zmienić to, aby raz połączyć się z serwerem, gdy klient się z tobą łączy.

    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");
        });
    });

Staje się tym:

    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");
    });

Należy pamiętać, że teraz nie kończymy połączenia z Hypisslem, trzymamy go otwarte & amp; Wysyłaj dane klientów. (Powinieneś obsługiwać zamykanie połączenia, gdy klient rozłącza się w socket.on('close', (hadError)=>{...}) Handler)

Dzięki tej zmianie proxy zaczyna działać, ale Hypissel niezwłocznie kopie cię za nie podłączenie za pomocą prawidłowego adresu. W pakiecie uścisku dłoni, łączący klient Minecraft ustawia adres do adresu serwera serwera proxy, ponieważ tak się łączy, jeśli chodzi o to, co dotyczy. Hypiksel widzi, że nie jest to "mc.hypixel.net" i kopie klienta.

Nawet jeśli tak nie było, gdy połączenie osiągnie stan gry, nie będziesz mógł zobaczyć żadnych znaczących danych (jak podejrzewam, że chcesz), ponieważ wszystko jest zaszyfrowane przez strumień strumienia AES CFB-8, Kluczem do którego jest przekazywany z klienta MC do serwera za pomocą RSA (nie możesz go zabrać).

Nie pozwól, aby to zniechęce się, możliwe jest MITM połączenie Minecraft C <-> S. Jest to tylko wiele bardziej zaangażowanych: P Jeśli chcesz porozmawiać na ten temat, możesz dodać mnie do niezgody (Azurethi # 0789).

0
Azurethi 27 listopad 2020, 17:14