WGCAladdinToken 是 CGWAskAladdinToken(971) 的直接回包。当前 Game.exe 能明确确认它固定长度为 26 字节,由 2 + 4 + 16 + 4 四段组成;客户端真正消费的是中间 16 字节令牌数据和最后的结果标记。
包信息
| 项目 |
内容 |
| 封包 ID |
972 |
| 包名 |
WGCAladdinToken |
| 方向 |
WGC 消息服 -> 客户端 |
| 包长 |
26 字节 |
| 对应请求 |
CGWAskAladdinToken (971) |
| 当前 Lua 协议定义 |
/home/ubuntu/Game2/services/game/packet.lua |
| 当前消息服发送 |
/home/ubuntu/Game2/services/msgagent.lua |
| 主要作用 |
返回一段 16 字节令牌数据及结果标记 |
当前 Game.exe 虚函数结论:
GetPacketID() = 972;
GetPacketSize() = 26;
Read() = 0x140622CD0;
Write() = 0x140622D40;
Execute() = 0x140622CC0 -> 0x140098BF0;
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x02 |
reserved_1 |
uint16 |
当前客户端执行链未直接消费 |
0x02 |
0x04 |
reserved_2 |
uint32 |
当前客户端执行链未直接消费 |
0x06 |
0x10 |
token_data |
char[16] |
16 字节令牌正文 |
0x16 |
0x04 |
result_flag |
uint32 |
结果标记;当前客户端按它决定是否写入本地令牌缓存 |
当前实际行为
- 客户端收到回包后,会先检查
result_flag。
- 当
result_flag != 0 时,客户端会把 token_data 写入本地缓存,并执行两步令牌刷新流程。
- 当
result_flag == 0 时,客户端不会把 token_data 落到本地缓存,只执行一条状态刷新链。
- 无论是否成功,客户端最后都会把
result_flag 继续传给后续处理函数。
当前 Lua 消息服实现如下:
reserved_1 = 6114
reserved_2 = 270213680
token_data = 固定 16 字节
result_flag = 0
这意味着现行 Lua 返回的是一条固定内容、且不会让客户端真正缓存令牌的返回包。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 消息服发送:
/home/ubuntu/Game2/services/msgagent.lua
关键代码
当前 Lua 协议定义
packet.WGCAladdinToken = {
xy_id = packet.XYID_WGC_AlADDIN_TOKEN,
ctor = function(self)
self.reserved_1 = 0
self.reserved_2 = 0
self.token_data = ""
self.result_flag = 0
end,
bos = function(self)
local stream = bostream.new()
stream:writeushort(self.reserved_1)
stream:writeuint(self.reserved_2)
stream:write(self.token_data, 0x10)
stream:writeuint(self.result_flag)
return stream:get()
end
}
当前 Game.exe 执行逻辑
if (result_flag != 0) {
cache_token(token_data);
refresh_token_state();
refresh_token_ui();
} else {
refresh_token_state();
}
dispatch_result_flag(result_flag);
结论
WGCAladdinToken 是一条固定 26 字节的阿拉丁令牌返回包。当前客户端真正关心的是 token_data 和 result_flag;现行 Lua 消息服虽然会回这条包,但固定把 result_flag 置为 0,因此客户端不会把返回的 16 字节令牌真正写入本地缓存。
|