XMC: use packet-framed configuration stream by default#6487
Conversation
|
额 这和之前的模式区别是什么 |
之前的 raw 模式只在前面完成 MC 握手和加密协商,之后就直接传输上层字节流,不再按 MC 数据包格式封装。 |
|
后续可以再完整进入 Play 阶段:服务端下行的大流量使用合法的 Chunk Data 承载,客户端上行继续使用 Play custom_payload,心跳切换为 Play Keep Alive。由于 Registry 和 Chunk 格式与 MC 版本强相关,建议拆成后续独立 PR。 |
|
我觉得没必要,因为开启加密以后 中间人看不出来发的是不是真 mc 包。 |
AES/CFB8 开启后确实无法解析 Packet ID 和 Payload,这点认同。但 raw 模式会在 Encryption Response 后立即进入任意字节流,缺少正常 MC 会话中的 Login Success、Configuration、Play 等阶段。虽然状态本身不可见,这些阶段产生的方向、首包大小、间隔和后续流量分布仍然可以统计。 |
Refactor Varint readFrom and writeTo methods to use constants for segment and continue bits.
|
弄成默认的,别加 |
|
我觉得没必要改 这是原版 mc 的登陆流程,只有完整实现了这些包才有意义,不然还是有包大小特征。最好是写一个 mod,用真 mc 客户端连接 mc 真服务器,然后用 Plugin channels 传输流量 |
| @@ -229,7 +274,7 @@ func (c *clientConn) SetWriteDeadline(t time.Time) error { | |||
| } | |||
|
|
|||
| func generateOfflineUUID(uuid *UUID, username string) { | |||
There was a problem hiding this comment.
正版玩家的 UUID 必须要调用 mojang API 获取,所以最好把 UUID 放到配置里让用户填
There was a problem hiding this comment.
正版玩家的UUID必须要调用mojang API获取,所以最好把UUID放到配置里让用户填写
单独配置 UUID 还需要认证结果及用户名,皮肤等数据保持一致,完整的正版登录比离线登录复杂,不如就用离线登录
There was a problem hiding this comment.
离线登陆不能开启加密 😅
1.20.5 之后,MC 协议本身支持离线模式加密,只是原版服务端没有提供这个开关(离线加密的话Should Authenticate还要改成false)
There was a problem hiding this comment.
原版服务端不支持,但是 xmc 支持,这不就是最大的特征吗
| } | ||
|
|
||
| propertyCount := Varint(0) | ||
| if err = writePacket(c.writer, 0x02, &uuid, &username, &propertyCount); err != nil { |
There was a problem hiding this comment.
原版服务器会在这个包里下发玩家皮肤的贴图,所以包长度不一样
There was a problem hiding this comment.
原版服务器会在这个包里下发玩家皮肤的贴图,所以包长度不一样
properties 为空是合法的,客户端会根据 UUID 使用默认皮肤
There was a problem hiding this comment.
但是这个包的长度就和原版不一样了,伪装了个寂寞
There was a problem hiding this comment.
还有原版默认开启压缩,xmc 没有实现压缩,也会导致包长度不一样
There was a problem hiding this comment.
还有原版默认开启压缩,xmc 没有实现压缩,也会导致包长度不一样
这个应该不用管,本来就可以关掉
There was a problem hiding this comment.
但是这个包的长度就和原版不一样了,伪装了个寂寞
这个符合离线玩家的资料
There was a problem hiding this comment.
这个应该不用管,本来就可以关掉
压缩默认开启,绝大部分服务器都开压缩,不开就是特征
这个符合离线玩家的资料
开启加密就意味着是正版模式,哪来的离线玩家
|
|
|
那写个 padding 机制吧,可配置长度范围以及包的方向,两端配置一样,因为要检查对端有没有发完这个包,收完再发自己的 |
可以 |
|
可以用 vless xtls vision 吗? |
|
按上面说的补了 padding 机制,参考原版 26.1.2 登录流程,按长度范围和包的方向收完再发,目前模拟到 player_loaded |
|
其实我的意思本来是让配置项加个数组可以自定义这些东西,不过你加了预设模板那也留着吧,此外要开放配置数组自定义 |

Summary
Make packet-framed XMC the default transport behavior. XMC now completes Login, remains in Configuration state, carries proxy bytes in
xmc:datacustom payload packets, and exchanges Minecraft Configuration Keep Alive packets.The user-facing
modesetting and the raw post-encryption path have been removed. This is wire-incompatible with the previous XMC behavior, so both endpoints must be updated together.This also fixes bounded packet parsing, partial CFB8 writes, n+EOF reads, offline UUIDv3 generation, random-source handling, and shared-secret validation.
This intentionally does not emit version-specific Play or Chunk Data packets.
Validation
go test -count=20 ./transport/internet/finalmask/xmcgo test ./transport/internet/finalmask/...go test ./infra/conf -run '^$'go vet ./transport/internet/finalmask/xmc ./transport/internet/finalmaskgo build ./main