我的世界玩家的会话是否可以作为原始玩家使用,如何检查建立连接的时间?

时间:2020-09-26 14:27:16

标签: java minecraft

我挑战自己创建一个我的世界服务器,但前提是我将使用的大多数插件都是我的。从商店到各种迷你游戏,我已经制作了许多不同的插件。现在,我决定编写自己的登录注册插件。基本上所有功能都已就绪并可以使用,但是我想在此添加一项功能。此功能是当玩家连接到服务器(warez)时,我的插件会检查玩家的会话以查看其是否为原始(我的意思是玩家已购买了游戏,并且他通过有效的mojang会话通过原始mojang启动器登录玩家应该以warez模式连接服务器(未登录,未使用官方启动器)我的意思不是这里提到的名字,而是他的mojang会话。简而言之,是否通过原始启动器使用电子邮件和密码登录。

我绝对不知道验证玩家原创性的工作原理,我知道mojang具有API,但我不知道它是否提供这种可能性。我还想知道客户端是否正在从UUID或sessionID向服务器发送哈希,可以与mojang API进行比较,或者我不知道。

更新:

我找到了这两篇文章:

1) https://wiki.vg/Protocol#Login

2) https://wiki.vg/Protocol_Encryption#Authentication

从本文中,我大致了解到,在客户端连接期间,我将与服务器一起发送服务器ID和密码,然后他们将同意的后续哈希将通过POST将客户端发送到mojang服务器和我的然后,服务器应从mojang询问客户端是否已在我的服务器上登录。

UPDATE2

我想到了以下内容:

  1. 如果我编写了自己的代理服务器,以解决玩家连接到的现象,并且该代理服务器会将所有内容复制到服务器。因此,我可以让我想去的人进入,也可以通过带有服务器ID和哈希值的mojang页面进行交叉检查。但这将是3方软件,而不是插件。
  2. 修改插头本身,我的意思是在SSLServerSocket级别的某处进行上述操作,其中插头服务器从中接收所有套接字和数据。在那里,如果我编写了数据通过的桥梁,那么我也可以同意客户端的SERVER ID,计算哈希值并从mojang服务器进行验证。但是它仍然不在插件中,而在服务器中。
  3. 从插件覆盖上述服务器的某些深层部分。加载后,该插件将替换服务器的某些部分。

现在我的问题是,如何从插件替换服务器中提到的某些部分?尝试使用反射(我是菜鸟,有反射)并用我的函数替换一些函数,这会回调出低级代码是个好主意吗?

非常感谢您的任何建议。 祝你有美好的一天。

PS:对不起,我的英语不好。

1 个答案:

答案 0 :(得分:0)

public boolean isCracked(ProxiedPlayer player) {
   
    String name = player.getName();
    UUID actualUUID = player.getUniqueId();
    String actualUUIDStr = uuid.toString();
    String offlineUUIDStr = getMd5("OfflinePlayer:"+name);
   
    if(offlineUUIDStr.equals(actualUUIDStr)) {
        return true;
    }
    return false;

}

// Taken from https://www.geeksforgeeks.org/md5-hash-in-java/
public static String getMd5(String input)
    {
        try {
 
            // Static getInstance method is called with hashing MD5
            MessageDigest md = MessageDigest.getInstance("MD5");
 
            // digest() method is called to calculate message digest
            //  of an input digest() return array of byte
            byte[] messageDigest = md.digest(input.getBytes());
 
            // Convert byte array into signum representation
            BigInteger no = new BigInteger(1, messageDigest);
 
            // Convert message digest into hex value
            String hashtext = no.toString(16);
            while (hashtext.length() < 32) {
                hashtext = "0" + hashtext;
            }
            return hashtext;
        }
 
        // For specifying wrong message digest algorithms
        catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}