CGAskGSChitChatSN 是当前 Game.exe 中仍然保留的一条 GSChitChat 相关请求包。结合同名配套回包 GCRetGSChitChatSN(1079) 的执行链可以确认:它并不是普通聊天正文包,而更像是在向服务器请求一段用于 WEB_GSCHITCHAT 服务的序号、令牌或链接后缀。需要注意的是,现役 /home/ubuntu/Game2 Lua 主链并没有接入 CGAskGSChitChatSN;当前服务端真正保留并返回的是另一套 CGAskGSChitChatInfo(1076) / GCRetGSChitChatInfo(1077) 协议。
包信息
| 项目 |
内容 |
| 封包 ID |
1078 |
| 包名 |
CGAskGSChitChatSN |
| 方向 |
CG 客户端 -> 游戏服 |
| 线上包长 |
1 |
| 当前 Lua 状态 |
当前旧版项目未接入;未检出 packet.CGAskGSChitChatSN 或 request:CGAskGSChitChatSN() |
当前 Game.exe 状态 |
仍保留请求类、发送入口和配套回包 GCRetGSChitChatSN(1079) |
| 作用 |
向 GSChitChat Web 服务请求 SN / 令牌 / 链接后缀一类的字符串参数 |
当前 Game.exe 可直接确认:
CGAskGSChitChatSN
GetPacketID() = 0x1405EC1A0 -> 1078;
Read = 0x1405FDB70;
Write = 0x1405C67A0;
Execute thunk = 0x1405C6FA0 -> 0x14007A4C0;
GetPacketSize 这类常量函数在该类附近的 vtable 槽位不如常规封包直观,但当前 Read()、Write() 与本地发送入口都一致只处理 1 字节,因此当前线上结构可以稳定确认为固定 1 字节。
包体结构
当前 Game.exe 的 Read() / Write() 都只处理 1 字节包体。由于当前客户端发送入口固定把该字节写成 0,而现役 Lua 又没有这条协议的服务端落点,因此这里保守命名为 reserved_flag:
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
reserved_flag |
uint8 |
当前 Game.exe 的本地发送入口固定写 0;结合配套回包语义,可谨慎理解为 GSChitChat SN 请求模式位,但当前证据不足以再细分命名 |
当前实际行为
- 当前
Game.exe 里,CGAskGSChitChatSN 仍有独立类、工厂和本地发送入口。
- 当前本地发送函数
0x1401F8D30 会在某个状态校验通过后构造 CGAskGSChitChatSN,并固定写入 reserved_flag = 0。
- 如果状态不满足,该本地入口不会发包,而是直接显示文本
#{GSZS_220609_01}。
- 当前
Game.exe 还保留了配套回包 GCRetGSChitChatSN(1079):
- 回包首字节表示字符串长度;
- 后续跟随对应长度的字符串正文;
Execute() 会把这段字符串追加到 WEB_GSCHITCHAT 链接后,再交给 GSChitChat Web 服务创建流程。
- 结合这条回包执行链可以确认:
CGAskGSChitChatSN 的真实用途不是同步聊天消息,而是向服务器请求一段 Web GSChitChat 所需的字符串参数。
- 当前
Game.exe 中还能检出以下强相关字符串:
WEB_GSCHITCHAT
OpenGSChitChat
CloseGSChitChat
skin4,720,504,gschitchat,%08x
create GSChitChat service error : %s.
- 与此相对,当前旧版项目 Lua 主链并没有
CGAskGSChitChatSN(1078):
/home/ubuntu/Game2/services/game/packet.lua 未定义该协议;
/home/ubuntu/Game2/services/msgagent.lua 未检出 request:CGAskGSChitChatSN() 入口。
- 当前服务端真正保留的是
CGAskGSChitChatInfo(1076) / GCRetGSChitChatInfo(1077):
- 请求包同样是
1 字节;
- 当前
msgagent 收到后会直接回一个两字节全 0 的 GCRetGSChitChatInfo;
- 这说明现役服务端已经只剩下一条非常轻量的占位兼容链,并没有接上
SN 版 Web 参数下发逻辑。
服务端落点
- 当前未接入的目标协议:
CGAskGSChitChatSN(1078)
- 当前 Lua 保留的相关协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 当前 Lua 保留的相关请求入口:
/home/ubuntu/Game2/services/msgagent.lua
当前现役 Lua 只检出以下替代链:
CGAskGSChitChatInfo(1076)
GCRetGSChitChatInfo(1077)
关键代码
以下代码块中,把 Game.exe 的底层流读写函数按语义简化记为 read_bytes / write_bytes,便于和线上结构对应。
当前 Game.exe 请求包结构
__int64 __fastcall CGAskGSChitChatSN_Read(__int64 packet, __int64 stream)
{
read_bytes(stream, packet + 24, 1);
return 1;
}
__int64 __fastcall CGAskGSChitChatSN_Write(__int64 packet, __int64 stream)
{
write_bytes(stream, packet + 24, 1);
return 1;
}
__int64 CGAskGSChitChatSN_GetPacketID()
{
return 1078;
}
当前 Game.exe 本地发送入口
__int64 CGAskGSChitChatSN_LocalSend()
{
if (qword_140911020)
{
if ((unsigned int)sub_14039A960(qword_140911020))
{
Packet pkt;
pkt.vftable = &Packets::CGAskGSChitChatSN::`vftable';
pkt.reserved_flag = 0;
PushPacket(ArgList, &pkt);
}
else
{
ShowPrompt(133, "#{GSZS_220609_01}");
}
}
return 0;
}
当前 Game.exe 配套回包执行要点
__int64 __fastcall GCRetGSChitChatSN_Execute(__int64 packet)
{
char *sn = (char *)(packet + 25); // 首字节后为字符串正文
CloseGSChitChatIfOpen();
AppendToWebLink("WEB_GSCHITCHAT", "?", sn);
CreateGSChitChatService(...);
return 2;
}
当前 Lua 现役替代链
packet.CGAskGSChitChatInfo = {
xy_id = packet.XYID_CG_ASK_GS_CHIT_CHAT_INFO,
ctor = function(self) self.unknow_1 = 0 end,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.unknow_1 = stream:readuchar()
end,
}
packet.GCRetGSChitChatInfo = {
xy_id = packet.XYID_GC_RET_GS_CHIT_CGAT_INFO,
ctor = function(self)
self.unknow_1 = 0
self.unknow_2 = 0
end,
bos = function(self)
local stream = bostream.new()
stream:writeuchar(self.unknow_1)
stream:writeuchar(self.unknow_2)
return stream:get()
end
}
function request:CGAskGSChitChatInfo()
local ret = packet_def.GCRetGSChitChatInfo.new()
ret.unknow_1 = 0
ret.unknow_2 = 0
Net:send(ret)
end
结论
CGAskGSChitChatSN(1078) 在当前 Game.exe 中仍然存在,线上结构固定为 1 字节请求。
- 从同名配套回包
GCRetGSChitChatSN(1079) 的执行链看,这条请求包更像是在向服务器请求 GSChitChat Web 服务用的序号、令牌或链接后缀,而不是普通聊天内容。
- 当前客户端本地发送入口固定把包体字节写成
0,因此这一字节目前只能保守命名为 reserved_flag。
- 当前旧版项目 Lua 主链没有接入
CGAskGSChitChatSN;现役服务端只保留了 CGAskGSChitChatInfo(1076) / GCRetGSChitChatInfo(1077) 这套占位兼容链。
- 因此,对
Temp_Release_v0-07-0300 的当前项目现状应当理解为:客户端仍保留 SN 版 Web GSChitChat 请求,但现役 Lua 服务端实际并不处理这条 1078 协议。