HWID(防小号)

HWID(防小号)

阻止玩家通过硬件ID检查替代账号来绕过封禁。

管理

你在运行服务器时,是否偶尔会遇到一些想赶走的玩家,但他们换了小号并挂 VPN 又回来了?现在,你有机会根据硬件 ID 来识别他们的账号,而不是依赖不可靠的 IP、皮肤或行为!


这个模组做什么

  • 这个模组注册了一个空参数,如果你的服务器安装了它,客户端必须带上该参数才能加入。试图从自己的模组包中移除这个模组的玩家将无法加入你的服务器。
  • 当玩家加入你的服务器时,客户端会根据玩家的硬件计算一个半唯一的哈希值,并由服务器存储(<服务器根目录>/config/hwid),同时记录账号的 UUID。

这个模组不做什么

  • 不根据硬件 ID 自动封禁玩家
  • 不提供多人在游戏内查找硬件 ID 的简单方法

那么如何使用?

请看下面的一些示例脚本,我不想把以下两点埋在代码块中,因为阅读它们很重要。


隐私

虽然硬件 ID 听起来有侵犯性,但它比 IP 地址包含的机密信息少得多。硬件 ID 是在客户端使用 SHA-256 算法计算的,该算法不可逆,因此服务器操作员无法得知使用了哪些硬件。硬件 ID 只能用于区分不同的硬件配置。

局限性

  • 硬件 ID 是半唯一的。如果玩家升级或彻底更换了电脑,硬件 ID 将会改变。如果玩家碰巧拥有相同的电脑(例如常见的预装机),也可能具有相同的硬件 ID。在哈希计算中会包含序列号(如果存在),以尽量减少这种情况的发生。
  • 那些懂 Java 的“专业捣蛋分子”可以反编译此模组并创建一个“邪恶版”,每次加入时发送随机或特定的硬件 ID。

Bash

#!/bin/bash

destination_path="/home/minecraftserver/config/hwid"
for file in "$destination_path"/*
do
    line_count=$(wc -l <"$file")  # 统计文件中的行数
    if [ "$line_count" -gt 1 ]  # 检查行数是否大于 1
    then
        echo ""; echo "$(basename "$file")"  # 打印一个空行和文件名
        while IFS= read -r line  # 从文件中读取每一行
        do
            uuid=${line}  # 将行内容赋给变量 'uuid'
            response=$(curl -s https://sessionserver.mojang.com/session/minecraft/profile/${uuid})  # 向 Mojang API 发送请求以获取配置文件信息
            name=$(echo "$response" | jq -r '.name')  # 使用 jq 从 API 响应中提取 'name' 字段
            echo "${uuid} - ${name}"  # 打印 UUID 和对应的名称
        done < "$file"  # 从文件中读取
    fi
done

Python 3

import os, json, requests

search = ""  # 设置搜索词,例如:用户名、UUID 或其任意部分

for filename in os.listdir("/home/minecraftserver/config/hwid"):  # 遍历指定目录中的每个文件
    with open(f"/home/minecraftserver/config/hwid/{filename}", "r") as file:  # 以读取模式打开每个文件
        lines = file.readlines()  # 读取文件的所有行
        if len(lines) > 1:  # 检查文件中的行数是否大于 1
            result = ""  # 初始化结果字符串
            for line in lines:
                uuid = line.strip()  # 获取每行的 UUID
                response = requests.get(f"https://sessionserver.mojang.com/session/minecraft/profile/{uuid}")  # 向 Mojang API 发送 GET 请求以获取玩家配置文件
                name = json.loads(response.text)['name']  # 从响应中提取玩家名称
                result += f"{uuid} - {name}\n"  # 将 UUID 和名称追加到结果字符串中
            if search in result:  # 检查搜索结果字符串中是否有搜索词
                print(result)  # 打印结果