Grasscutter Backroom 小游戏解密
上个月挑战了一下这道 Grasscutter Backroom 社区里的题,花了一天时间。竟然是第一个做完的,不过是 Teamwork。最近写不出来啥了,就来记录一下全过程吧。
第一条消息
OSRELWin2.7.0_CHT
e91fa91c9e242e0e4401b84e75ce771de32e80108e582601c99324bb46ffb180fe19c42df8c814
f3d02f545bf35e7255d357236826199a853a0d1e39beb27deca57e4d7dd053a818fd53e0f8cfc986c60b5a8055c83ee46a35ab9309349eaf4ca9276efdd4256b23a7935c519db8a760707b813ecc3d4955e40e9dd8d7e0bea40de7ca3f0da384f77c30fed883574f11b16301be0808e9f3da330a658bd925bf008df225f13914ea9d4ab6bb77e34c6ed2a53fa8a6f710ad48d9e15e2afbcda1f0a4ea73425a1b14be65ab2c282710874f1077c414d2fab4b4ad3254317a5e429630b490c07e42ab63276d5fa2f3beb446ac174f81de2feee060114b2218d048fc2adf2933cd0848edb96b6d71ae6a6971ab5228c455ae56c2f88cc40efa26a0cf0d7f3b5efab0e6307c167490f91c3104ac640329eb7e34ccbf569c3ffcf7b9c997a51b381eb2c53f3a7adfca1056651f0e983e020fc4523037e9a5b522e61edd6a271c6bf96826e2820b9e303650629ddfadccec6ae43d289b3ac455685f461489c60acac16b9eea8ca95d8238cae285f5a4edc72acd92eb13213027beb65c49fade30e50a837e5abf55b6a38d8e2f86739dd571eee07bf7dcf863329980fb57c99981d843c40256cd8bbd9a765f1b661169dffdb0c067730914208437ced47cda02008ac3ad0f6b8e0c9b8204f8304ff79038f21aac60fc67aa32297ec168d1eb33f3c0aa0e789d40572f60c1dc44b15399c9f293e94232f891497db8c21f8030f37b6aa5783830ef72245491f2ed131f94ccd43b56de6bb57a819ba486850e7d2fb465a73c8d832297657f5ef4f27a796911f34598445fc4eb9e81a96b6576f4d439bc0349aaebc01fa6f839b45d3a809c8b886afad8767505b431a9205f5605b228f32578efea67a58698ead4b4e87003922f8ced702c496c7436d10129b92900e4087388cfa0c154e5653d78dad92763f1a4418b3519f92665e6159fe7a14a99313839e3c59905a3ee65896c95bd469e6ee5efbe9ff4653ed1d9d9ecff783eba2791a2c5e851584c0304b4c8eac906ba8431e749f5b6eecb0c68d6ee8810878c7b5352e2e8e0d42f2645b83183a86e34d9a7b03fbd1635adf50beab46054dbd341e00decfc8b84963affe28cbc3ee430d107fbbd0a6c98d32792fc762f610ed3c07c7a92
这是我当时拿到的题。
尽管不清楚 CHT 究竟是什么意思(下面会提到),不过先确定这题跟 2.7.0 脱不了关系。
两个消息,一短一长,都是十六进制的转储。看到忽悠密码学,一开始可能以为这跟
RSA 之类的有关,从 global-metadata.dat
找了几个公钥尝试解密都不行。
后来 meme 给了提示,想象一下这是 Wireshark 转储的数据,于是本能直接进 Iridium 看一下。

这是长的那个,不过没有 21595
这个包,meme
也说了没想到我会这么神必,直接手动导入。然后就想着以为这个错了,这个可能是个有问题的
frame
,于是想自己手动补 head
信息,全失败了。
倒是我之前拿到了 Wireshark 解 KCP
的 Lua
插件,当时可能以为这个需要做点操作变成之类的东西。第二天起床在看 Genshin
KCP
的东西,鉴于对这玩意略知一二(指炸服用的那个小玩意),为了进行学习,看了看
Grasscutter 的代码,看到了 0x4567
开头的特征之类的。我猛然想到,可能需要做异或。
鉴于我不清楚用哪个 key
,直接把 Iridium 里的
keys
一个一个试,直到找到了 0x4567
的特征。

4567 0083 0000 0000 001b 0a01 3110 4518 0322 0931 3039 3035 3832 3832 58ff bd03 6001 f064 0189 ab
这下对了,0x4567
开头,紧跟着
cmdid
,判断出是 GetPlayerTokenRsp
的包。可以直接拿 CyberChef 或者别的工具直接解析。最后拿到:
{
'uid': 69,
'platformType': 3,
'accountUid': '109058282',
'secretKeySeed': '57087',
'accountType': 1,
'channelId': 1
}
第一条消息就解出来了。
第二条消息
说实话,这个长的非常神笔,我一开始想继续异或,用
MHYkeys.json
里的,结果不行,后来经队内大手子指点,看看
secretKeySeed
走一遍 mt64
拿到
key
。

需要好好表扬一下 Sorapointa 写的梅森,非常方便。走完了之后,解密完拿到这个:

研原顶针,鉴定为 UnionCmdNotify
,但是我拿到的
UnionCmd
的字段顺序有点问题,message_id
和
body
需要修。发现 id
对应的 proto
竟然是 AbilityInvocationsNotify
,好吧又套一层,拿
body
的字节码继续去解析。
最后拿到神笔 JSON:
eyJoaW50X3JvdDEzIjoiSGZyIGdqYiBjYnZhZyBydnR1ZyBadnVibGJPdmFRbmduIHhybCIsImVuY29kZWRfcGF5bG9hZCI6IsOdw43Dj8OPw5jDnsOTw4LDmcOVw4bDj8Oew57Dk8ONw5nCosKlw4TDmMKiw4PDkcOSw5XDhMOQwqHCpMODw5HDksOVw4bDgMOOwqTDlcOWw5jDhcOCw5DDnMOew5PDnsOZwqLCo8OAwqHDnsOVw5TDmsOZw4LDkMOUwqTDk8Oaw5rDgcOPw5DDmMONw5vDg8OSw57DgMOUw5bCosOTw57DmsOBw43DkMOcw53CpMODw5LDlsOOw4TDlsKkw5vDh8OYw53DhMOEw5bDjcODw53DmcONw4bDgMOOw57Dk8OCw5nDlcOCw4DCo8ONw43CpcOSw5bDkcOWw4LDhcObw5jDmsOZw43Dn8OEwqPDk8OCw5LDlsOFw5/DkMKjw5PDh8OZw43CosOQw5zCpMOFw5TDksOVw4bDgMKjw43DlcOWw4fDkcOPw4/DnMKjw4XDlsOYw4HDjcOAw5zCo8ODw5jDmsORw4DDgMOcw57Dk8OPw5nDkcKlw5DDhsOew5PDgsOZw5XDhMOEw5bDg8Klw4PDksOVw4TDkMOEwqPCpMOGw5rDkcKlw5DDkMKlw5XDlsOaw5nDgMOQw4TDjcObw5jDmMOGw4bDkcOSw4LCpcOVw5LDlcOBw4DDnMKhw53DmCJ9
ey
感觉 base64
格式的 JSON
解一下,看看还有啥?

hint_rot13
第一感觉就是凯撒,offset
是
13
:Use two point eight MihoyoBinData key
。
2.8 的 xorKey
是 97
,开了个 Genshin Studio
从 96
试了一下就清楚了,直接对 encoded_payload
进行异或,拿到又是一串密文。
JZXXOIDUNBQXIIDZN52SO5TFEBSG63TFEBQWY3BAORUGKIDIN54W6IBCMNUGC3DMMVXGOZLTEIWCA5DIMVZGKJ3TEAYSA3LPOJSSAZTJNZQWYIDUNBUW4ZZ2EAFAURLOMNZHS4DUEARHG4DPNZ5GK3RCEBQW4ZBAPFXXK4RAOVZWK4TOMFWWKIDXNF2GQIDUNBSSAT2TEBSGS43QMF2GG2BAMNWGSZLOOQQFEU2BEBVWK6JO
我以为就结束了,以为这是最后答案,不过 CyberChef
这个魔术棒就是非常棒(๑•̀ㅂ•́)و✧
Now that you've done all the hoyo "challenges", there's 1 more final thing:
Encrypt "sponzen" and your username with the OS dispatch client RSA key.

现在结束了,只需要拿 RSA Key
做个加密就可以了,不过我直接偷懒,拿了 Sorapointa 的
key
,是国服的。
meme 说没事,然后告诉我是第一个解完的,送了我一个月免费 nitro,然而我没敢要。
关于 CHT 是个啥
就是 SAR
,meme 说这个服务器的 key
不会在
Iridium
里面,然而事实上就在,哈哈。我还以为有文本之类的彩蛋,他说没有,整这个太难了,失败了就不弄了。