如何用Python检测Minecraft Java版服务器是破解版还是正版验证服
Minecraft Java版服务器正版验证状态检测Python实现
基础前提
- 标准的MC服务器Ping协议响应中不包含正版验证状态字段,所以mcstatus这类基于Ping协议的工具库原生不支持该功能,仅通过Ping操作无法拿到所需信息
- 无需完全登录服务器、也无需提供正版账号凭证即可完成判断,仅需要模拟登录流程的前2步交互即可,不会实际进入服务器,也不会触发大多数服务器的登录封禁规则
实现原理
Minecraft Java版登录流程的特征可以直接用于判断正版验证状态:
- 和服务器建立TCP连接后,发送握手包切换到登录状态
- 发送登录起始包,填写任意随机用户名即可
- 读取服务器返回的第一个响应包判断状态:
- 响应包ID为
0x01(加密请求包):服务器开启正版验证 - 响应包ID为
0x02(登录成功包)、或先返回0x03(设置压缩包)后返回登录成功包:服务器关闭正版验证
- 响应包ID为
- 拿到结果后直接断开TCP连接即可,无需后续交互
示例代码
import socket import struct def check_online_mode(host: str, port: int = 25565, timeout: int = 5) -> bool | None: """ 检测Minecraft Java版服务器是否开启正版验证 返回True为开启正版验证,False为关闭,None为检测失败 """ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(timeout) try: sock.connect((host, port)) # 构造握手包 handshake = b"" handshake += b"\x00" # 包ID: 握手 handshake += b"\x47" # 协议版本 (759 = 1.19,兼容绝大多数新版本) # 写入主机名 handshake += struct.pack(">B", len(host)) + host.encode("utf-8") handshake += struct.pack(">H", port) # 端口 handshake += b"\x02" # 下一个状态: 登录 # 发送包长度 + 包内容 sock.sendall(struct.pack(">B", len(handshake)) + handshake) # 构造登录起始包 login_start = b"" login_start += b"\x00" # 包ID: 登录开始 # 随机用户名,长度不超过16字符 fake_user = "test123" login_start += struct.pack(">B", len(fake_user)) + fake_user.encode("utf-8") sock.sendall(struct.pack(">B", len(login_start)) + login_start) # 读取响应包长度 length = struct.unpack(">B", sock.recv(1))[0] # 读取包内容 packet = sock.recv(length) packet_id = packet[0] if packet_id == 0x01: return True elif packet_id == 0x02 or packet_id == 0x03: return False else: return None except Exception as e: return None finally: sock.close() # 调用示例 if __name__ == "__main__": # 测试正版服 print(check_online_mode("mc.hypixel.net", 25565)) # 输出True # 测试本地破解服 # print(check_online_mode("127.0.0.1", 25565)) # 输出False
注意事项
- 部分带反机器人、反爬虫机制的服务器可能会阻断请求或返回伪造响应,检测准确率无法保证100%,但兼容绝大多数原版端、Spigot/Paper等主流插件端
- 如需支持旧版本服务器,可修改代码中的协议版本号为对应版本的数值
- 如果服务器使用SRV记录做端口转发,需要先完成SRV记录解析再调用检测逻辑
内容的提问来源于stack exchange,提问作者adsgniD
相关产品推荐
相关产品推荐

