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

洱海月 v0-07-0300 封包解析:ID 1078 CGAskGSChitChatSN(GSChitChat 序号请求)

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

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

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

×

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

结论

  1. CGAskGSChitChatSN(1078) 在当前 Game.exe 中仍然存在,线上结构固定为 1 字节请求。
  2. 从同名配套回包 GCRetGSChitChatSN(1079) 的执行链看,这条请求包更像是在向服务器请求 GSChitChat Web 服务用的序号、令牌或链接后缀,而不是普通聊天内容。
  3. 当前客户端本地发送入口固定把包体字节写成 0,因此这一字节目前只能保守命名为 reserved_flag。
  4. 当前旧版项目 Lua 主链没有接入 CGAskGSChitChatSN;现役服务端只保留了 CGAskGSChitChatInfo(1076) / GCRetGSChitChatInfo(1077) 这套占位兼容链。
  5. 因此,对 Temp_Release_v0-07-0300 的当前项目现状应当理解为:客户端仍保留 SN 版 Web GSChitChat 请求,但现役 Lua 服务端实际并不处理这条 1078 协议。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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