CGMinorPasswd 是旧版客户端用于查询、设置、修改、解锁二级密码的复用请求包。当前 Temp_Release_v0-07-0300 的 Lua 服务端已经真实接入这条协议,请求入口位于 /home/ubuntu/Game2/services/msgagent.lua 的 request:CGMinorPasswd()。
这条包的核心特征是“按 flag 复用包体结构”:
- 查询类请求只发送 1 字节
flag
- 设置 / 解锁会额外携带 1 段密码
- 修改密码会额外携带“旧密码 + 新密码”两段数据
包信息
| 项目 |
内容 |
| 封包 ID |
139 |
| 包名 |
CGMinorPasswd |
| 方向 |
CG 客户端 -> 游戏服 |
| 包长 |
动态 |
| 直接回包 |
GCMinorPasswd |
| 回包 ID |
242 |
| 当前 Lua 协议定义 |
/home/ubuntu/Game2/services/game/packet.lua |
| 当前 Lua 请求入口 |
/home/ubuntu/Game2/services/msgagent.lua |
| 相关枚举 |
/home/ubuntu/Game2/lualib/define.lua 中的 MINORPASSWD_REQUEST_TYPE / MINORPASSWD_RETURN_TYPE |
| 主要作用 |
查询二级密码状态、设置密码、修改密码、解锁密码、查询强制解除倒计时 |
当前 Game.exe 的虚函数结论为:
GetPacketID() = 139;
GetPacketSize():
flag 1/2/6 -> 1;
flag 3/5 -> password_len + 2;
flag 4 -> old_password_len + new_password_len + 3;
Read = sub_1405C5960;
Write = sub_1405C5B80;
Execute = sub_140329040;
包体结构
flag = 1 / 2 / 6
这三种模式都只带一个请求类型字节。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
flag |
uint8 |
二级密码请求类型 |
flag = 3 / 5
这两种模式用于“设置密码”与“解锁密码”,都会附带 1 段密码字符串。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
flag |
uint8 |
请求类型,3=设置,5=解锁 |
0x01 |
0x01 |
password_len |
uint8 |
密码长度,协议层限制 1..16 |
0x02 |
n |
password |
char[n] |
密码原文 |
flag = 4
修改密码时,会连续携带旧密码与新密码两段数据。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
flag |
uint8 |
请求类型,固定为 4 |
0x01 |
0x01 |
old_password_len |
uint8 |
旧密码长度,协议层限制 1..16 |
0x02 |
n |
old_password |
char[n] |
旧密码原文 |
0x02 + n |
0x01 |
new_password_len |
uint8 |
新密码长度,协议层限制 1..16 |
0x03 + n |
m |
new_password |
char[m] |
新密码原文 |
当前实际行为 / 模式说明
当前 Lua 与客户端脚本已经可以把 flag 的用途明确确认下来:
flag |
枚举 |
用途 |
当前 Lua 实际行为 |
1 |
MREQT_PASSWDSETUP |
查询是否已设置二级密码 |
回 GCMinorPasswd(type=1),同步“是否已设置 + 是否已解锁” |
2 |
MREQT_DELETEPASSWDTIME |
查询强制解除倒计时 |
当前项目未进入强制解除流程时直接不回包,避免客户端误判 |
3 |
MREQT_SETPASSWD |
设置二级密码 |
未设置时保存密码并回成功;已设置时回失败 |
4 |
MREQT_MODIFYPASSWD |
修改二级密码 |
校验旧密码与新密码非空,成功回 type=4,失败回 type=10 |
5 |
MREQT_UNLOCKPASSWD |
解锁二级密码 |
校验密码,成功回 type=5,失败回 type=11 |
6 |
MREQT_DELETEPASSWD |
申请强制解除密码 |
当前 Lua 只提示“强制解除二级密码请联系客服”,不发 GCMinorPasswd |
还有两点需要单独说明:
- 当前协议层只限制密码长度
1..16,但旧客户端设置 / 修改 / 解锁界面通常要求最短 4 位,因此线上正常流量一般是 4..16。
- 当前客户端里银行密码、PK 等其他密码输入路径并不统一复用这条包,
CGMinorPasswd 主要服务于“二级密码”这一套独立界面。
关联回包结构
GCMinorPasswd 是与本包配套的结果包,当前结构已经可以明确整理如下。
GCMinorPasswd(type = 1 / 14) 状态同步结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
m_Type |
uint8 |
回包类型,1 或客户端兼容分支 14 |
0x01 |
0x01 |
m_ReturnSetup.m_uFlag |
uint8 |
是否已设置二级密码,0=未设置,1=已设置 |
0x02 |
0x01 |
unlock_flag |
uint8 |
是否已解锁二级密码保护,0=未解锁,1=已解锁 |
GCMinorPasswd(type = 2) 强制解除倒计时结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x01 |
m_Type |
uint8 |
回包类型,固定为 2 |
0x01 |
0x04 |
m_ReturnDeleteTime.m_uTime |
uint32 |
强制解除二级密码剩余时间 |
其余结果类型
type = 3 / 4 / 5 / 6 / 7 / 9 / 10 / 11 / 12 / 13 时,GCMinorPasswd 当前只回 1 字节 m_Type,不附带额外参数。
其中当前 Lua 主链已实际使用的结果语义为:
3:设置密码成功
4:修改密码成功
5:解锁成功
9:设置密码失败
10:修改密码失败
11:解锁失败
type = 14 在当前 Game.exe 里仍保留兼容处理,但当前 Lua 项目未发现主动发送点,更适合视为“客户端兼容的状态同步类型”。
服务端落点
这条包在当前项目中的关键位置如下:
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 请求入口:
/home/ubuntu/Game2/services/msgagent.lua
- 状态同步构包:
/home/ubuntu/Game2/services/msgagent.lua 的 build_minor_password_state_sync_packet()
- 请求 / 回包枚举:
/home/ubuntu/Game2/lualib/define.lua
关键代码
当前 Lua 协议定义
packet.CGMinorPasswd = {
xy_id = packet.XYID_CG_MINOR_PASSWD,
ctor = function(self)
self.flag = 0
end,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.flag = stream:readuchar()
local FLAG = define.MINORPASSWD_REQUEST_TYPE
if self.flag == FLAG.MREQT_SETPASSWD or self.flag == FLAG.MREQT_UNLOCKPASSWD then
local password_size = stream:readuchar()
if password_size > 0 and password_size < 0x11 then
self.password = stream:read(password_size)
end
elseif self.flag == FLAG.MREQT_MODIFYPASSWD then
local old_password_size = stream:readuchar()
if old_password_size > 0 and old_password_size < 0x11 then
self.old_password = stream:read(old_password_size)
end
local new_password_size = stream:readuchar()
if new_password_size > 0 and new_password_size < 0x11 then
self.new_password = stream:read(new_password_size)
end
end
end
}
当前 Lua 请求处理
function request:CGMinorPasswd()
local FLAG = define.MINORPASSWD_REQUEST_TYPE
local minor_password = ma_func:get_minor_password()
local msg = packet_def.GCMinorPasswd.new()
if self.flag == FLAG.MREQT_PASSWDSETUP then
msg = build_minor_password_state_sync_packet()
elseif self.flag == FLAG.MREQT_DELETEPASSWDTIME then
return
elseif self.flag == FLAG.MREQT_SETPASSWD then
...
elseif self.flag == FLAG.MREQT_MODIFYPASSWD then
...
elseif self.flag == FLAG.MREQT_UNLOCKPASSWD then
...
elseif self.flag == FLAG.MREQT_DELETEPASSWD then
promptmessage(3501)
return
end
Net:send(msg)
end
当前状态同步回包
local function build_minor_password_state_sync_packet()
local minor_password = ma_func:get_minor_password()
local has_minor_password = minor_password ~= nil
local msg = packet_def.GCMinorPasswd.new()
msg.m_Type = define.MINORPASSWD_RETURN_TYPE.MRETT_PASSWDSETUP
msg.m_ReturnSetup.m_uFlag = has_minor_password and 1 or 0
msg.unlock_flag = has_minor_password and ma_func:is_minor_password_is_unlock() and 1 or 0
return msg
end
当前 Game.exe 结果处理结论
GCMinorPasswd::GetPacketSize() 当前规则可以明确确认:
type 1/14 -> 3;
type 2 -> 5;
type 3/4/5/6/7/9/10/11/12/13 -> 1;
客户端结果处理函数还引用了以下文本资源:
MinorPassword_Set_Password_Ok
MinorPassword_Set_Password_Fail
MinorPassword_Modify_Password_OK
MinorPassword_Modify_Password_Fail
MinorPassword_Unlock_Password_Fail
MinorPassword_Apply_Force_Unlock_Password
MinorPassword_Apply_Force_Unlock_Password_Time
MinorPassword_Force_Unlock_Password_OK
MinorPassword_Force_Unlock_Password_Fail
这组当前客户端证据与 Lua 中的返回类型语义是一致的。
结论
CGMinorPasswd 在 Temp_Release_v0-07-0300 中已经不是残留包,而是当前 Lua 主链真实在用的“二级密码复用请求包”。
这条包的最终结论可以直接定为:
flag=1 查询二级密码状态
flag=2 查询强制解除倒计时
flag=3 设置密码
flag=4 修改密码
flag=5 解锁密码
flag=6 申请强制解除密码
同时,配套回包 GCMinorPasswd(type=1) 中最后 1 字节的字段语义,已经可以结合当前 Lua 实际发送逻辑与当前 Game.exe 的结构规则,明确命名为 unlock_flag,不再适合继续保留为 unknow。