找回密码
 registerss
搜索
查看: 25|回复: 0

洱海月 v0-07-0300 封包解析:ID 139 CGMinorPasswd(二级密码请求)

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:603
  • 打卡月天数:1
  • 打卡总奖励:600
  • 最近打卡:2026-10-03 06:32:28
Waylee 发表于 2026-4-12 23:38 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?registerss

×

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。

您需要登录后才可以回帖 登录 | registerss

本版积分规则

QQ|手机版|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )|天天打卡

GMT+8, 2026-10-4 11:26 , Processed in 0.061791 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表