Skip to content

Minecraft finalmask#6210

Open
Exclude0122 wants to merge 9 commits into
XTLS:mainfrom
Exclude0122:minecraft-finalmask
Open

Minecraft finalmask#6210
Exclude0122 wants to merge 9 commits into
XTLS:mainfrom
Exclude0122:minecraft-finalmask

Conversation

@Exclude0122
Copy link
Copy Markdown
Contributor

@Exclude0122 Exclude0122 commented May 29, 2026

听说最近国内中专机上了检测设备,Shadowsocks 用不了了。HTTP/TLS 有备案问题,更是用不了。所以我写了个 Minecraft Finalmask。国内机开个 MC 服,跑图流量大一点很合理吧 😁。

配置

客户端

"finalmask": {
  "tcp": [
    {
      "type": "minecraft",
      "settings": {
        "usernames": ["user1"],
        "password": "13f462cb64c72770",
        "hostname": "mc.hypixel.net"
      }
    }
  ]
}

服务端

"finalmask": {
  "tcp": [
    {
      "type": "minecraft",
      "settings": {
        "password": "13f462cb64c72770"
      }
    }
  ]
}

协议

C->S Handshake

Name Value
Protocol Version 775 (26.1)
Address 默认使用真远程地址,可在配置中覆盖
Port 使用真远程端口
Intent 2

如果 Intent 是 1 则进入 Ping 模式,服务端户会响应客户端的 Ping 请求。

image

C->S Login Start

Name Value
Username 默认 Dream,可配置
UUID 自动生成

S->C Encryption Request

Name Value
Server ID 空字符串
Public Key 从 password 自动生成
Verify Token 随机 4 bytes
Should authenticate true

C->S Encryption Response

Name Value
Shared Secret 客户端生成对称加密用到的密钥,并用服务端的 Public Key 加密
Verify Token 加密后的 Verify Token + password。因为有 PKCS#1 v1.5 padding,所以在此处拼接 password 不会导致密文长度超过原版。

服务端在成功接收 Encryption Response 数据包后,将立即开启 AES/CFB8 加密。

服务端会检测 password 是否正确,如果正确则握手成功,进入转发模式;否则返回原版拒绝理由multiplayer.disconnect.authservers_down,并踢掉客户端。

客户端会使用 password 生成出同样的 RSA public key,防止 MITM 攻击。

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 29, 2026

终究还是来了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

终究还是来了

啊?这个以前讨论过吗

@Fangliding
Copy link
Copy Markdown
Member

怎么这东西也学reality弄个pubkey和shortid啊 一个密钥不就行了?安全性给上层

@Fangliding
Copy link
Copy Markdown
Member

哎全是AI写的

@Snow-dash
Copy link
Copy Markdown

@Exclude0122 是伪装成mc协议还是真的放在mc协议里传输

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 29, 2026

啊?这个以前讨论过吗

https://t.me/projectXtls/1473 ,这个是真的 MC 协议的话需要改名 XMC,否则 header-custom 就能解决的问题就别加了

依稀记得以前看到过一个项目是真的 MC 协议,不清楚能不能过游戏加速器,链接你们找找

@Exclude0122
Copy link
Copy Markdown
Contributor Author

@Exclude0122 是伪装成mc协议还是真的放在mc协议里传输

开启加密前完全遵守 mc 协议进行握手+密钥协商,开启加密有后就直接开始转发了。不过自己实现的 mc 协议肯定和原版有区别,以后可以写一个 minecraft-dialer mod,使用真原版客户端

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 29, 2026

开启加密前完全遵守 mc 协议进行握手+密钥协商,开启加密有后就直接开始转发了

加密包也要符合 MC 协议规范啊不然 header-custom 的科学计算器似乎就能实现?不然很容易被 GFW 和游戏加速器 gank

@Exclude0122
Copy link
Copy Markdown
Contributor Author

怎么这东西也学reality弄个pubkey和shortid啊 一个密钥不就行了?安全性给上层

pubkey 是原版 mc 就有的东西,shortid 是为了服务端验证客户端,如果是真 mc 客户端的话会提示 Authentication servers are down

image

@Exclude0122
Copy link
Copy Markdown
Contributor Author

开启加密前完全遵守 mc 协议进行握手+密钥协商,开启加密有后就直接开始转发了

加密包也要符合 MC 协议规范啊不然 header-custome 的科学计算器似乎就能实现?不然很容易被 GFW 和游戏加速器 gank

加密也符合 MC 协议规范,用的是握手阶阶段协商出来的密钥

@Fangliding
Copy link
Copy Markdown
Member

原版mc不是填个地址端口就能进去了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

原版mc不是填个地址端口就能进去了

会因为 shortid 不对被踢

@Exclude0122
Copy link
Copy Markdown
Contributor Author

Exclude0122 commented May 29, 2026

我本来还想写一个 fallback,如果 shortid 不对就转发到真 mc 服务器。不过 finalmask 这一层好像不能接管连接,WrapConnClient WrapConnServer 返回 err 连接就直接被关闭了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 29, 2026

会因为 shortid 不对被踢

这是搞了个 MC 版 REALITY 出来吗,如果 MC 这加密足够可靠的话或许也可以加成安全层?只是想了一下

@LjhAUMEM
Copy link
Copy Markdown
Collaborator

我本来还想写一个 fallback,如果 shortid 不对就转发到真 mc 服务器。不过 finalmask 这一层好像不能接管连接,WrapConnClient 返回 err 连接就直接被关闭了

fallback 是 server 管的吧,我之前写的 WrapConnServer err 是继续返给上层,但是后面被人改了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

mc 是 rsa 1024 bits + AES/CFB8,并不可靠 😅
我写这些只是想防一下简单的主动探测

@Fangliding
Copy link
Copy Markdown
Member

原版mc不是填个地址端口就能进去了

会因为 shortid 不对被踢

我的意思是这个pubkey原版mc游戏(至少客户端UI)不存在 为什么这里还要填个这东西 一个鉴权用的字符串不就行了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

原版mc不是填个地址端口就能进去了

会因为 shortid 不对被踢

我的意思是这个pubkey原版mc游戏(至少客户端UI)不存在 为什么这里还要填个这东西 一个鉴权用的字符串不就行了

客户端 pin 服务端公钥,防止 MITM
mc 原版是靠微软的认证服务器防 MITM 的

@Fangliding
Copy link
Copy Markdown
Member

我觉得用字符串或者hex派生出来就够了 没必要像reality那样严格分开公私钥 数据要安全上面就用tls或者vlessenc

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 29, 2026

看群里的讨论 https://t.me/projectXray/4991727 貌似 MC 这加密也就是 SS 的水平,那还是加成 mask 别加成安全层了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

我觉得用字符串或者hex派生出来就够了 没必要像reality那样严格分开公私钥 数据要安全上面就用tls或者vlessenc

https://pkg.go.dev/crypto/rsa#GenerateKey

go 不支持生成确定性的 RSA 私钥

我要不把 private key 和 sha256 改成可选项,如果不填就随机生成一个。如果用户不在意 MITM 可以不填。

@Exclude0122
Copy link
Copy Markdown
Contributor Author

把 short id 也改成可选项,不填就不认证客户端

@Fangliding
Copy link
Copy Markdown
Member

我觉得用字符串或者hex派生出来就够了 没必要像reality那样严格分开公私钥 数据要安全上面就用tls或者vlessenc

https://pkg.go.dev/crypto/rsa#GenerateKey

go 不支持生成确定性的 RSA 私钥

RSA密钥本质就是两个大素数 标准库生成方法复制出来用扩展欧几里得算法或者别的什么求个逆出来就是整个私钥了 AI两分钟就弄好了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

我觉得用字符串或者hex派生出来就够了 没必要像reality那样严格分开公私钥 数据要安全上面就用tls或者vlessenc

https://pkg.go.dev/crypto/rsa#GenerateKey
go 不支持生成确定性的 RSA 私钥

RSA密钥本质就是两个大素数 标准库生成方法复制出来用扩展欧几里得算法或者别的什么求个逆出来就是整个私钥了 AI两分钟就弄好了

客户端也填同样的密码,用同样的算法生成 RSA 密钥,来防止 MITM 吗

@Fangliding
Copy link
Copy Markdown
Member

差不多
你说是 rsa 1024 bits 那本身也没什么卵用稍微弄一下就行了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

short id 还要留着吗

@MoRanYue
Copy link
Copy Markdown

我知道 但是感觉不是很有必要 或者留个放address的地方 port 用函数取

address 是不是有歧义,用户可能以为真的连接到这个地址了,要不改成 host

(Minecraft协议中,此字段应当被称为Hostname呀)

@qwerttvv
Copy link
Copy Markdown

将军如何理解Minecraft呢…

@Exclude0122
Copy link
Copy Markdown
Contributor Author

我知道 但是感觉不是很有必要 或者留个放address的地方 port 用函数取

address 是不是有歧义,用户可能以为真的连接到这个地址了,要不改成 host

(Minecraft协议中,此字段应当被称为Hostname呀)

我也觉得应该叫 hostname,因为 mc 源码里用的是 hostname
image

@Yue-cn
Copy link
Copy Markdown

Yue-cn commented May 30, 2026

跑 MC 确实有一点,毕竟特征很明显,但是一旦Encryption Request 之后只剩AES 流来着(应该是),
实际上好像写个 Forge Mods 就可以简单实现了,然后可以直接发binary(但是性能有待考察)

@Exclude0122
Copy link
Copy Markdown
Contributor Author

总结一下

* 客户端和服务端预共享一个鉴权密码

* 鉴权密码派生出 RSA 公钥私钥

* 服务端把 RSA 公钥发给客户端

* 客户端用 RSA 公钥加密 对称加密用到的密钥 和 鉴权密码,发给服务端

是这样吗

改完了

@Exclude0122
Copy link
Copy Markdown
Contributor Author

跑 MC 确实有一点,毕竟特征很明显,但是一旦Encryption Request 之后只剩AES 流来着(应该是), 实际上好像写个 Forge Mods 就可以简单实现了,然后可以直接发binary(但是性能有待考察)

Encryption Response 以后就全 AES 加密了
不用写 forge mod,可以直接写个 java 程序调用 mc 网络栈,naive minecraft

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 30, 2026

先测一下能不能过游戏加速器吧(它们支持自建服务器的 MC 吗?)

@FirstMelody
Copy link
Copy Markdown

FirstMelody commented May 30, 2026

我有一个ultimate solution... 首先你绝对不能伪装成原版服务器 因为原版服务器你跑烂了都绝对不可能跑100mbps的持续流量 你必须得是forge/neoforge/fabric 其次 我的设想是 利用真实的客户端和服务端 不去做协议伪装 而是直接做一个mod把流量塞进network payload 这样这就是一个绝对行为特征与正常mc服务器完全一致的mc流量 而且在多mod包下 大流量十分常见 如distant horizon下发区块轻松可以达到70mbps+ 加点科技机器就可以突破100mbps 另外 虽然我不喜欢abuse 但是minecraft在26.2snapshot7引入的peer to peer connection可以拿来abuse relay...直接用微软的服务器做到完全伪装 另外如果这么做了 加速器也一定可以用了(但是我感觉这么用迟早会导致加速器直接撤掉所有mc加速)

@qwerttvv
Copy link
Copy Markdown

直接用微软的服务器做到完全伪

这个6

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 30, 2026

通过游戏的中心服务器来传输数据属于 XDRIVE “滥用一切”的范畴,你们不要整得大家玩不了 MC

但是我感觉这么用迟早会导致加速器直接撤掉所有mc加速

MC 撤了还有其它,比如任何 P2P 游戏理论上都能打洞成功后实际上传输伪装成游戏数据包的 WG/mKCP/QUIC,GTA 危

@FirstMelody
Copy link
Copy Markdown

通过游戏的中心服务器来传输数据属于 XDRIVE “滥用一切”的范畴,你们不要整得大家玩不了 MC

但是我感觉这么用迟早会导致加速器直接撤掉所有mc加速

MC 撤了还有其它,比如任何 P2P 游戏理论上都能打洞成功后实际上传输伪装成游戏数据包的 WG/mKCP/QUIC,GTA 危

哥别说了我求你了 我刚在群里也想到了我全删了 别真做 别整得以后我没有steam networking用到最后是自己把自己的路炸了

@RPRX
Copy link
Copy Markdown
Member

RPRX commented May 30, 2026

哥别说了我求你了 我刚在群里也想到了我全删了 别真做 别整得以后我没有steam networking用到最后是自己把自己的路炸了

没人提 PR 我也不想提这个,其实五年前我修 Xray FullCone 经常测 GTA 时就在群里提过了,不过群聊历史被 TG 吞了

不过五年前连 SS 都没被 GFW gank 呢,这方法也就图一乐,那毕竟都 P2P 了肯定直接想到这个啊,想不到才不正常

@Kc2353
Copy link
Copy Markdown

Kc2353 commented May 30, 2026

但是minecraft在26.2snapshot7引入的peer to peer connection
这个要求正版,我个人猜测不是每个人都愿意花这89块钱,其他游戏同理?而且MC目前测试版好像已经撤了好友联机只剩好友列表了
minecraft还有一个问题是不登录(服务器不开正版验证, 一般称为“离线模式”)默认就不会加密,据我所知大部分修改的服务端(如模组服)出于各种考虑(比如谁负担第三方登录验证服务器的钱,这不可能让微软负担)也几乎不开,如果这个特征不处理那也会出问题(比如你没有向微软请求登录,却有加密,又回到上面那个问题了)
https://zh.minecraft.wiki/w/Java%E7%89%88%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE#%E5%8A%A0%E5%AF%86%E8%BF%9E%E6%8E%A5
https://minecraft.wiki/w/Java_Edition_protocol/Packets#Login
个人认为如果游戏允许自定义payload还是游戏内夹带比较好一点,据我所知MC有的模组会有大量加密payload
当然如果只是要一个SSR替代物那就没什么了

@Yue-cn
Copy link
Copy Markdown

Yue-cn commented May 30, 2026

不建议公开使用,搞不好MC Protocol跟着遭殃。毕竟MC那个 AES + RSA 交换方式,如果是正版,恐怕很难有MITM了,因为账户名对不上,那实际很难破解了

@FirstMelody
Copy link
Copy Markdown

但是minecraft在26.2snapshot7引入的peer to peer connection 这个要求正版,我个人猜测不是每个人都愿意花这89块钱,其他游戏同理?而且MC目前测试版好像已经撤了好友联机只剩好友列表了 minecraft还有一个问题是不登录(服务器不开正版验证, 一般称为“离线模式”)默认就不会加密,据我所知大部分修改的服务端(如模组服)出于各种考虑(比如谁负担第三方登录验证服务器的钱,这不可能让微软负担)也几乎不开,如果这个特征不处理那也会出问题(比如你没有向微软请求登录,却有加密,又回到上面那个问题了) https://zh.minecraft.wiki/w/Java%E7%89%88%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE#%E5%8A%A0%E5%AF%86%E8%BF%9E%E6%8E%A5 https://minecraft.wiki/w/Java_Edition_protocol/Packets#Login 个人认为如果游戏允许自定义payload还是游戏内夹带比较好一点,据我所知MC有的模组会有大量加密payload

付费这个确实,玩久了就没考虑过要买正版的事情了,理所当然了(不过这样也不错,至少可以减少abuse的人)模组竟然会主动加密payload吗 这个我还真不知道诶...啥mod会加密 ysm这种吗? 然后好友联机撤了我也提到了() 至于没加密这个 如果加密是靠online-mode控制的(没去看代码 只是假设)用authlib-injector+velocity套个插件/原地建一个blessing skin应该可以秒了

@FirstMelody
Copy link
Copy Markdown

不建议公开使用,搞不好MC Protocol跟着遭殃。毕竟MC那个 AES + RSA 交换方式,如果是正版,恐怕很难有MITM了,因为账户名对不上,那实际很难破解了

是的 所以这个我从来不敢在公开场景下提出来 尽管从接触reality这个理念的时候我就想到了这种方式了 但是马上就想到这要是被abuse遭殃的是我自己 竟然有人真的拿出来说了(

@Kc2353
Copy link
Copy Markdown

Kc2353 commented May 30, 2026

我认同“不建议大规模使用的观点”,这个只能做备用,大规模用几乎必然拉着正常玩家带着自己一块遭殃

但是

毕竟MC那个 AES + RSA 交换方式,如果是正版,恐怕很难有MITM了

说实话技术上,MC的加密方式算是有点落后了,1024位的RSA+AES-CFB8在我们这里是要被批判的,你这段话的意思我似乎没懂,这里似乎并没有涉及破解或攻击MC协议?

@Exclude0122
Copy link
Copy Markdown
Contributor Author

先测一下能不能过游戏加速器吧(它们支持自建服务器的 MC 吗?)

加速器都是实名的,我不想测(
有没有群友帮忙测一下

我有一个ultimate solution... 首先你绝对不能伪装成原版服务器 因为原版服务器你跑烂了都绝对不可能跑100mbps的持续流量 你必须得是forge/neoforge/fabric 其次

我抓包看了下,fabric 的握手疑似都发生在开启加密以后,所以明文握手包和 vanilla 一样,不用改

我的设想是 利用真实的客户端和服务端 不去做协议伪装 而是直接做一个mod把流量塞进network payload 这样这就是一个绝对行为特征与正常mc服务器完全一致的mc流量

这个以后可以写

虽然我不喜欢abuse 但是minecraft在26.2snapshot7引入的peer to peer connection可以拿来abuse relay...直接用微软的服务器做到完全伪装 另外如果这么做了 加速器也一定可以用了(但是我感觉这么用迟早会导致加速器直接撤掉所有mc加速)

滥用微软的 relay 意义不大,因为这种特征明显,用的人多了必被封,而且封的后果不大。伪装 HTTPS 没事,是因为无脑封所有 HTTPS 流量经济影响很大,封一个游戏的 p2p 协议后果不大。这个功能我是不会写的

@Kc2353
Copy link
Copy Markdown

Kc2353 commented May 30, 2026

@Exclude0122
我最近正好脑抽冲了一个月某小牌加速器的会员,但是我目前无法开游戏服,如果有需要可以用你们的服务器协助验证吗?

@bytecategory
Copy link
Copy Markdown
Contributor

@RPRX 群聊历史是被TG吞的?

@Exclude0122
Copy link
Copy Markdown
Contributor Author

@Exclude0122 我最近正好脑抽冲了一个月某小牌加速器的会员,但是我目前无法开游戏服,如果有需要可以用你们的服务器协助验证吗?

我也没服务器,等一个群友提供吧

@Kc2353
Copy link
Copy Markdown

Kc2353 commented May 30, 2026

但是我没号,群里聊天看不到,如果到时候有好心人可以帮忙转发上来一下吗谢谢了

@ql1c3
Copy link
Copy Markdown

ql1c3 commented May 30, 2026

不建议在没准备充分的情况下加入xray,有太多mc玩家会受到牵连。
如果非要加入,推荐先慢慢实现,至少给特征尽可能降一下

@Exclude0122
Copy link
Copy Markdown
Contributor Author

说句题外话,滥用 p2p relay 还要看俄罗斯老哥

https://github.com/kulikov0/whitelist-bypass 这个项目可以直接用语音平台的 webrtc 中转服务器,用 datachannel 或 vp8 来传输数据

@Kc2353
Copy link
Copy Markdown

Kc2353 commented Jun 1, 2026

如果非要加入,推荐先慢慢实现,至少给特征尽可能降一下

可以选择保留一个branch不并入主线,想测试或者尝鲜者自行编译并配置,我同意不应“简单配置即可实现”以免备用手段被滥用。
我对于特征的看法与你有所不同不同,该branch默认特征应当与真实流量有一定差异但可以过基础验证(类似SSR)以免加速器不能区分于是直接滥杀 ,毕竟一堆人看着我们就算协议完全完美也必然有人会知道
(不过拿mod直接开一个tunnel/端口转发不香吗,里面直接跑vless enc, 不用搓这些了)

另外有一件事啊,加速器一般默认会限速,正常一般非模组服顶不到上限,但是这里就不一样了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.