[国服027]枫叶物语一键端联网版精修内容(社交/技能/多人同屏/网络协议重构)V1.6更新!
本帖最后由 Ddov 于 2026-9-12 23:22 编辑枫叶物语 · 027 联机修复端V1.6
高版本降级重构 · 商城 / 社交 / 战斗 / 掉落 / 指令 全量实测
很久没来枫叶物语了,老号密码没找回,重新注册一个回来分享。此端以论坛名冠名,给老窝引个流。
▎本帖持续更新,任何异常可在本帖反馈!或加入QQ群:993890377即时反馈!
▎客户端修复配套V1.5版本,请重新下载客户端!内含增强补丁包客户端更稳定!
开启服务端后,使用LocalMapleLauncher.exe 启动游戏客户端,该程序会拉起hook跳过客户端启动动画
窗口化居中以及客户端稳定性增强等功能,兼容windows 11 (注:由于是强注入可能会被杀软误杀)
通过网盘分享的文件:枫叶物语V1.5 配套027客户端.7z
链接: https://pan.baidu.com/s/1nvFQVk41qDDopxljU1J3RA?pwd=q6vs 提取码: q6vs
通过网盘分享的文件:能力值详情截断补丁.7z (1.6升级补丁)
链接: https://pan.baidu.com/s/1VCfB5pGzs3hwCtrsY8AMEg?pwd=5pd6 提取码: 5pd6
▎关于底包
由高版本服务端逆向降级重构而来,已尽可能剥离高版本残留(代码层 / 数据库层均做过清理和回滚),尽量还原 027 原味手感。
▎任务系统
v1.6 重构: 任务引擎重构,NPC存在多个任务时可对话选择任务;全任务脚本补全;
▎商城系统
全模块实测可用:
商品购买 / 赠送礼物 / 换购 / 背包扩充 / CDKEY 兑换 —— 均通过
* 不符合性别的道具[购买按钮]将不可用(v1.5 优化)
* 商城 取宠物名 道具已屏蔽(该版本未实装用途,v1.6 调整)
▎交通系统
金银岛/天空之城 往返飞船正常工作!
概率出现蝙蝠魔劫持飞船!
v1.6 优化: 服务端侧船舶系统代码优化。
▎转职流程
全还原各职业转职流程!
▎社交 & 休闲
好友系统 / 组队系统 / 人气值 —— 全收敛修复
小游戏:五子棋、记忆大考验 —— 多人联机实测无异常
v1.6 修复: 小游戏服务端添加超时兜底机制,即便客户端漏发包服务端也会强行钳制回合;五子棋 悔棋 功能修复,可向对方发起悔棋请求,对方同意后撤回棋子并移交回合(每人每局限1次)。
▎战斗 & 职业技能
其余全技能逐条修复实测:
祭司 - 时空门(已冻结)
组队状态下野外回城落位异常问题,并且城镇内时空门无法使用(单人正常)。
火毒巫师 - 致命毒雾(v1.5 已修复解冻)
完整链路重构,不再造成客户端闪退,现已解除禁用。
火毒抗性不再错误的延长毒状态持续时间;毒雾术现在会正确结算DOT伤害;火毒合击修正了对怪物产生毒状态时间低于技能描述时长的问题。
数值加成 & 治疗修复(v1.6)
修复数值加成逻辑,技能现在会正确加成主属性数值;修复 群体治愈 治疗量为0的问题(原因为未正确加成主属性)。
▎宠物系统
完全对齐官方:召唤广播 / 亲密度系统 —— 全量还原。
v1.5 修复: 宠物指令系统(坐/不要/嘘嘘等)现已可用;宠物升级正确广播动画特效(多人可见);修复了使用一次指令后续指令不生效的问题。
v1.6 修复: 宠物指令产生的动作和对话气泡文字现在会被正确广播给其他玩家。
▎渲染还原
召唤物广播、召唤物攻击态、骑士附魔光效 —— 多人同屏显示一致,无广播丢包。
v1.5 补充: 客户端/服务端WZ资源修正 —— 装备物品类乱码对照官方数据源修正;技能描述多处错别字修正(如魔法→磨法、消费MP→消耗MP、耐性→抗性),更符合现代游戏语境。
修复客户端在选择角色界面展示角色属性卷轴UI中偶尔异常错位且不显示底部UI的问题。
修复商城道具 209系列(地图祝福)玩家消息被嵌套的问题。
v1.6 补充: 调整能力值详情界面异常截断的UI。
▎掉落概率重调
装备 0.7% (700)
消耗 3% (3000)
卷轴 0.5% (500)
稀有 0.7% (700)
主材料 65% (65000)
* v1.5 修正了1.3重调概率时意外改动的判定尺宽度,实际掉率体感与公布概率现已对齐。
▎玩家商店(自由市场摆摊)
v1.6 重构: 玩家商店全链路修复,摆摊功能现已完全可用。
▎GM / 玩家指令
授权方式:角色数据表 GM 字段填 6 即可。切勿在账号表填 GM 字段 —— 027 客户端有原生限制,账号表置 GM 会直接被拦无法开设组队。
@ 玩家命令(11条)
help / 卡图 / 呼叫管理员 / 帮助 / 搜索物品 / 重载商店 / 解卡 / @经验卡 / @str / @dex / @luk / @inte
* v1.5 移除 @ap,解构为 @str/@dex/@luk/@inte 四指令;@搜索物品 重构为全量解析显示物品名称;新增 @经验卡 列出当前可生效经验卡道具。
GMCommand(55 + 新增)
给予宠物 / 打开商店 / 清扫地面 / 获得技能 / 增加人气 / 技能点 / 职业 / 玩家转职 / 商店 / 升级 / 升级到 / 升级玩家到 / 物品 / 等级 / 玩家等级 / 设置事件 / 开始事件 / 事件 / 清除物品 / 喇叭 / 玩家喇叭 / 说话 / 玩家说话 / 给予地图状态 / 给予状态 / 克隆我 / 清除克隆 / 设置事件实例属性 / 事件实例属性 / 离开事件实例 / 地图上的玩家 / 开始事件实例 / 重置怪物 / 杀死OID怪物 / 重载NPC / 聊天公告 / 公告事项 / 黄字事项 / 我的IP / 切换爆物 / 监狱 / 查看NPC / 查看反应堆 / 查看传送点 / 我的位置 / 字母 / 召唤 / 召唤怪物 / 禁言 / 取消禁言 / 地图禁言 / 取消地图禁言 / 无敌 / 封印物品 / 线上玩家 / !满技能(v1.3 新增 —— 将当前转职全技能组加满,含前置转职联动,例:三转时一二转同步满级)
AdminCommand(17)
DamageBuff / 文件封包 / 最近的传送点 / Uptime / DropMessage / DropMsg / 设置管理员 / 切换自动注册状态 / 封包 / 脱掉所有人 / 送给所有人金币 / HotTime / 传送所有人到这里 / 踢所有人 / 关闭服务器 / 数据库 / 检测复制 / * v1.5 修复 !职业 500 提示不正确职业ID的问题,现在正确转职为 [无敌管理员] 职业。
InternCommand(37)
隐身 / 治愈 / 地图治愈 / 踢 / 杀死 / 我在哪 / 线上 / 去往 / 时钟 / 传送到这里 / 传送 / 查找 / WhosLast / WhosNext / 清怪 / 清怪爆物 / 全屏捡物 / 清除BUFF / 换频道 / Reports / FakeRelog / 打开NPC / 打开商店 / 清扫地面 / 商店 / 职业 / 杀死附近玩家 / ManualEvent / 开始炸弹人活动 / 结束炸弹人活动 / 清理背包 / 杀死地图玩家 / 搜索命令 / 查看封号 / 查看账号 / 检测作弊 / 角色信息
SuperGMCommand(75)
搜索物品 / 服务器公告 / 定时更变地图 / 设置名字 / 弹窗 / 存档 / 给予技能 / 解封印物品 / 扔 / 扔物品 / 地图说话 / 频道说话 / 世界说话 / 监视 / 重置玩家任务 / 开始玩家任务 / 完成玩家任务 / Threads / ShowTrace / 开关喇叭 / 放置反应堆 / 伤OID怪 / 伤全图怪 / 伤怪 / 杀怪 / 清怪爆物 / 清怪获得经验 / 添加临时NPC / 添加NPC / 添加怪物 / sendFilePacket / 封包 / 重载地图 / 生怪 / Crash / 重载IP监控 / 添加IP监控 / Subcategory / 最大金币 / 金币 / 给予金币 / 给予点券 / 获得抵用卷 / GainP / GainVP / 设置服务器包头 / 设置客户端包头 / 重载爆物 / 重载传送点 / 重载商店 / 重载事件 / 重置地图 / 重置任务 / 开始任务 / 完成任务 / 开始自定义数据任务 / 完成自定义数据任务 / 任务信息 / 玩家任务信息 / 攻击反应堆 / 攻击脚本反应堆 / 破坏反应堆 / 设置反应堆 / 重置反应堆 / 发送留言 / 给所有人发送留言 / 增益技能 / 增益物品 / 增益物品EX / 取消技能增益 / 地图增益技能 / 地图增益物品 / 地图增益物品EX / 漂浮公告 / MapItemSize
SuperDonatorCommand(3)
TradeHelp / Check / TSmega
▎其他
未逐条列举的其余功能均已对照官方表现收敛,自行体验即可。
▎v1.1 更新记录
[*]修复 创建角色掷骰子决定属性时,实际落库后 智力 / 运气 与面板显示相反(感谢 wenyu194222 反馈)
[*]修复 宠物亲密度外键倍率配置失效(感谢 wenyu194222 反馈)
[*]修复 GM 指令在日志目录误落盘 command_error 文件 —— 根因为清理库时误删 gmlog 表,已回滚
[*]改善 宠物广播包结构,修正地图切换时宠物脱离站立面向下滑出地图的丢位问题
▎v1.2 更新记录
[*]修复 玩家命令 @搜索物品 出现乱码的问题.(感谢 wenyu194222 反馈)
[*]修复 玩家命令 @warp 输入不存在地图ID时,出现空指针报错的问题.(感谢 wenyu194222 反馈)
[*]修复 砸卷功能中装备无升级次数使用卷轴提示正常但依旧会扣除卷轴的问题(感谢 wenyu194222 反馈)
[*]修复 最大HP/MP 上限钳制修正为30000(越界处理) (感谢 wenyu194222 反馈)
[*]新增 玩家命令 @解卡 ,用于解决对话NPC脚本卡住无法使用道具/传送门 等异常情况.
[*]修复 自动注册配置为true,无法通过初次登陆创建账号问题.
[*]修复 GM命令/升级流程中在处于新手职业时依旧会发放技能点奖励的问题,现在只有转职后才发放技能点.
[*]修复 残留的英文NPC对话脚本,现在是全中文对话.外加修复2个导致异常的NPC脚本.
提醒 在1.2版本中配置项默认开启了自动注册,可以通过输入账号密码注册直接注册.也可通过客户端 注册账号 进行原生注册!
▎v1.3 更新记录
[*]新增 GM命令 !满技能 —— 将当前转职全部技能组加满(含前置转职联动,例:处于三转时一二转技能同步满级)
[*]修复 任务系统:现可正确接取 / 完成(通过 NPC 直接对话接取与结算;本版无引导 UI,即 NPC 头顶灯泡 / 书 / 感叹状态不渲染,逻辑层已通)(感谢 wenyu194222 反馈)
[*]修复 龙骑士系 —— 龙之魂 / 龙之献祭 / 龙咆哮 现正确扣除血量及校验释放条件,龙咆哮对怪物眩晕结算与客户端眩晕渲染均已生效(感谢 wenyu194222 耐心测试与反馈)
[*]优化 骑士属性附魔 —— 再次释放不消耗原附魔状态,刻意保留
[*]修复 神圣之火 临时附加最大HP/MP 受外键配置血蓝上限钳制(注:客户端本地血槽渲染仍可能越界超 3W,药剂无法回至 3W 以上属客户端原生表现)
[*]修复 力量 / 防御崩坏 现正确驱散怪物对应增益
[*]修复 弓 / 弩 三转被动 贯穿箭 致死率异常
[*]补全 怪物技能引擎 —— 部分怪物行为已实装:
[*][**]铁甲猪 类会对自身施加 BUFF 状态(实测验证通过)
[*][**]蝴蝶精 / 幼魔精灵 类会对玩家施加 DEBUFF(封印 / 虚弱 / 诅咒 / 暗黑);渲染层已于1.4中推进修复
[*][**]神通术 装备偷取概率已对齐全局掉落表
[*][**]金钱攻击 现正确扣费并结算伤害
[*]冻结 蝴蝶精共享 BUFF(提升周边怪物魔攻)—— 客户端注册与到期回调内存不稳定,到期易踩空指针致闪退,暂时禁用
[*]冻结 火毒巫师 致命毒雾 生成逻辑 —— 延续 v1.2 已知项处置,服务端侧不再触发该异常路径
▎v1.4 更新记录
[*]修复 新建角色数据库 GM 字段不再默认置 6 —— 禁用新角色自动取得 GM 权限
[*]修复 怪物技能引擎渲染与闪退 —— 玩家所受 DEBUFF 现正确渲染(虚弱-流汗 / 封印-锁图标 / 暗黑-骷髅),不再触发客户端闪退;原 v1.3 标注的渲染层缺口已闭环
[*]追加 怪物技能 诅咒(鬼魂冒出特效)—— 削减玩家狩猎结算经验值,功能与渲染层均实测正常
[*]修复 飞侠 隐身术 实现链路收敛,功能 / 客户端渲染对齐官方表现,多人同屏实测无异常
[*]恢复 聊天室功能 —— 此前代码清理阶段误删,现已回挂;使用规范:通讯帮助内 /招待 角色名 无效,请在聊天室输入框直接填入对方角色名后回车发起邀请
[*]优化 落盘日志 —— 心跳包不再写盘,移除冗余日志噪音
[*]优化 外键配置 —— 剥离部分冗余外键约束,改由服务端硬编码接管,降低库层锁竞争
▎v1.5 更新记录
[*]重构 双倍经验值卡 —— 深度重构,现正确生效并按亚洲/上海时区判定;玩家背包存在多种经验卡时始终只生效1个效果(经验值 X2)
[*]修复 管理员命令 !职业 500 提示不正确职业ID的问题,现正确转职为 [无敌管理员] 职业
[*]新增 玩家命令 @经验卡 —— 列出当前时间可生效的经验卡道具,重叠时段的多张卡会如实全列出
[*]修复 [火毒巫师]技能组:
[*][**]致命毒雾 完整链路重构,不再造成客户端闪退,已解除禁用
[*][**]火毒抗性 不再错误延长毒状态持续时间
[*][**]毒雾术 现正确结算DOT伤害
[*][**]火毒合击 修正对怪物产生毒状态时间低于技能描述时长的问题
[*]新增 角色死亡服务端兜底机制 —— 小概率客户端不发送死亡封包时,玩家处于死亡状态15秒自动处理
[*]补全 死亡惩罚 / 护身符道具 / 新手免除惩罚机制
[*]移除 玩家命令 @ap(过于繁琐),解构为 @str / @dex / @luk / @inte 四指令以便快速增加对应能力值
[*]重构 玩家命令 @搜索物品 —— 现全量解析显示物品名称
[*]移除 制造者信息 —— 该版本客户端道具制造者文本按韩文编码解析,被读成中文后表现为乱码(客户端原生缺陷,属当年NEXON交付盛大时未发现的问题)
[*]修复 宠物指令系统 —— 现可对宠物发出指令(聊天框直接输入 坐/不要/嘘嘘 等官方原生指令即可)
[*]修复 宠物升级 —— 现正确升级并广播升级动画特效(多人可见)
[*]追加修复 宠物指令使用一次后续指令不生效的问题
[*]修复 小游戏 - 记忆大考验 轮次逻辑,现正确按规则递交翻牌权限
[*]优化 商城 —— 不符合性别的道具[购买按钮]将不可用
[*]修正 客户端/服务端WZ资源:
[*][**]装备/物品类 乱码对照官方数据源修正
[*][**]技能描述多处官方错别字修正(魔法→磨法、消费MP→消耗MP、耐性→抗性),更符合现代游戏语境
[*]修复 客户端选择角色界面展示角色属性卷轴UI偶尔异常错位且不显示底部UI的问题
[*]修复 商城道具 209系列(地图祝福)玩家消息被嵌套的问题
[*]重构 [无敌管理员]职业技能组 —— 以下技能均能正确施加给全图玩家(含自己):圣化之力 / 祝福 / 轻功 / 治疗+魔法无效;复活 技能已修复!
[*]修复 概率异常 —— 修复了由1.3重调概率意外改动的判定尺宽度,实际掉率体感与公布概率现已对齐
[*][**]装备 0.7% / 消耗 3% / 卷轴 0.5% / 稀有 0.7% / 主材料 65%
▎v1.6 更新记录
[*]重构 小游戏服务端架构 —— 添加超时兜底机制,即便客户端漏发包,服务端也会强行钳制回合
[*]修复 五子棋 悔棋 功能 —— 可向对方发起悔棋请求,对方同意后撤回棋子并移交回合(每人每局限1次)
[*]修复 宠物指令广播 —— 宠物产生的动作和对话气泡文字现在会被正确广播给其他玩家
[*]修复 管理员 复活 技能 —— 使周遭死亡的玩家满血复活
[*]屏蔽 商城 取宠物名 道具 —— 该版本未实装用途
[*]重构 玩家商店(自由市场摆摊)—— 全链路修复,摆摊功能完全可用
[*]优化 NPC脚本系统 —— 深扫脚本文件夹,修复制作物品等NPC脚本错误;功能回归 + 脚本链路优化,现可捕获所有异常并自动解卡
[*]优化 服务端船舶系统代码
[*]修复 传送门角色异常落位问题
[*]修复 数值加成逻辑 —— 技能现在会正确加成主属性数值
[*]修复 群体治愈 治疗量为0的问题(原因为未正确加成主属性)
[*]重构 任务引擎 —— NPC存在多个任务时可对话选择任务;全任务脚本补全;额外修复部分任务完成后开放特殊兑换的功能NPC(如:炼金术师,简 全链路完成后可以购买药水)
[*]恢复 商城 CDKEY 功能 —— 现在可以输入CDKEY领取/转增了
[*]优化 日志系统 —— 屏蔽部分无用日志落盘
[*]优化 @搜索物品 —— 现在会列出产出该物品的怪物掉落
[*]调整 客户端UI —— 修复能力值详情界面异常截断的问题
升级说明 请自行备份数据库,覆盖后将使当前数据库档案失效。
📌 版权声明
本端启动内置出处标识,归属 枫叶物语论坛。
仅作社区交流用途,禁止倒卖 / 禁止二次打包售卖。尊重改版时间,且用且珍惜。
一键端下载(DovMaple 1.6.7z)
**** Hidden Message *****
网络封包逆向工程报告附件不支持上传,详情见 2 楼 ↓ 随报随修,测到其余异常回帖即可。
本帖最后由 Ddov 于 2026-9-4 12:09 编辑
# 冒险岛国服 V027 客户端网络封包完整分析报告
> 分析对象:`D:\MXD\MapleStory.exe`(脱壳后,国服 027 版本)
> 工具:Ghidra 12.1.3 headless(工程 `D:\MXD\ghidra_proj\MapleStoryProj7`)
> 所有函数地址均为 VA(虚拟地址),可直接在 Ghidra 跳转复核。
---
## 一、结论总览
| 项目 | 结论 |
|---|---|
| 包头 | 4 字节:``,两 LE u16 异或即得长度 |
| opcode | **1 字节**(`CInPacket::Decode1` = FUN_004163ea),复合 opcode(0xB0-0xB5)带 1 字节 2 级子码 |
| payload 加密 | **明文**(无字段级/包级载荷加密,与 My 端 `crypt()` 空操作一致) |
| IV 体系 | 每包滚动 `getNewIv`(种子 `0xC65053F2`,与 My 端字节 `{-14,83,80,-58}` 相同);另有 12 字节 crypto state(`0x4727fe` 导出 / `0x4728b3` 安装) |
| 版本号 | 0x1B(27);握手包内为 u16 `0x001B` |
| 分发架构 | 三层:socket 层 → WvsContext 段(0x16-0x29) → context functor 虚调用 → 主分发器级联 |
| opcode 覆盖 | 0x0E-0xBB 全部枚举(见第八章映射表) |
---
## 二、连接与握手协议
### 2.1 握手读取器:FUN_0043dd01(阻塞 recv 模式)
客户端 `connect()` 成功后以阻塞模式读取握手包,解析流程(汇编证据 `0x43de42-0x43e053`):
```
```
逐字段:
| 字段 | 读取位置 | 处理 |
|---|---|---|
| u16 长度 | `0x43de42` `MOV AX,` | 接收循环收满 `base+len` 字节 |
| u16 版本 | `0x43debb`,存 `` | `0x43dfa4 CMP word ,0x1b`:<0x1B 抛异常 `0x22000006`;>0x1B 走版本过旧提示路径(写 `+0x80`);**必须精确 == 0x1B** |
| patch 串 | `0x43ded0 CALL 0x00430234` | 标准 MapleAsciiString:u16 长度前缀 + 内容,返回消耗 `len+2` 字节 |
| IV#1 | `0x43dee2`(0x4727fe 初始化)→ `0x43df0e`(0x4728b3 安装) | 安装到 crypto 对象 `sock+0x90` |
| IV#2 | `0x43df1b` → `0x43df47` | 安装到 `sock+0x9c` |
| u8 type | `0x43df6b` `MOV AL,`,`0x43df7c CMP AL,4` | **必须 == 4**(中国区标识) |
随后:
- `0x43e00c` `CALL 0x0043fc43`:重置 socket 字段(+0x7c/+0x84/+0x8c 清零)
- `0x43e031` `CALL `(IAT 运行时填充):切换异步模式(WSAAsyncSelect 系)
- 首个收包(` < 1`)做版本一致性校验(见 4.4)
### 2.2 与 My 服务端的对应(`LoginPacket.getHello`)
```java
writeShort(0x0E); // 总长度(此处为固定值)
writeShort(mapleVersion); // 0x001B ✓
writeMapleAsciiString(MAPLE_PATCH);
write(recvIv); // 4 字节 → 客户端 sock+0x90
write(sendIv); // 4 字节 → 客户端 sock+0x9c
write(type); // 4 = 中国区 ✓
```
注意 My 端 `sessionOpened` 时 session 无 client 属性,`MaplePacketEncoder` 走 raw 分支原样写出(握手明文直发)——与客户端阻塞解析完全兼容。**此前"length 与 version 同址"的歧义已排除**:客户端首 u16 读两次,第一次作长度(收满循环),第二次(`0x43debb`)作版本号,两者是同一字段的两种用途。
---
## 三、封包帧格式(4 字节头)
### 3.1 客户端发送方向编码(FUN_004f38d9,汇编 `0x43ef2a/0x43ef72` 调用)
调用形式:`FUN_004f38d9(sock+0x19, 0x1b, &IV, 1, IV)`(**0x1B 即版本号参数**)
```c
u16 h01 = (ushort)(IV >> 16) ^ 0x1B; // 即 (iv^0x1B) | (iv<<8)
u16 h23 = h01 ^ (u16)payload_len; // 两 u16 异或
按 LE 写出 4 字节
```
即线上字节序:`^0x1B]]`,分块上限 `0x5B4`(1460,MTU 对齐)。
### 3.2 客户端接收方向解码(FUN_004f34e9 头状态机,this = sock+0x78)
```c
*(this+0xE) = Decode2(); // 第一个 u16(LE)→ 存 sock+0x86
u16 second = Decode2();
len = second ^ *(this+0xE); // 两 u16 异或 = payload 长度
状态 1 = 头完成,状态 2 = 包完成
```
### 3.3 与 My 服务端互证
- My `MapleAESOFB.getPacketHeader(len)`(sendCypher,版本参数 `0xFFFF-27=0xFFE4`):
`iiv = (iv|iv<<8) ^ 0xE4FF` → 头 = `^0xE4]^0xFF]`
- My `getPacketLength`:`hi16 ^ lo16` 再 bswap —— 客户端无需 bswap 指令即可还原(LE 读两 u16 直接异或)
- My `checkPacket`(收客户端包):`h0^iv==0x1B, h1^iv==0x00` —— 与 3.1 客户端发送公式逐字节吻合
- 客户端首包校验 `hi16(IV) ^ == 0xFFE4`:`` = 首收包头前两字节(FUN_004f34e9 写入),代入 My 头公式得 `hi16(IV) ^ (iv^0xE4)|(iv^0xFF)<<8 = 0xFFE4` ✓ —— 这就是"服务器必须用 0xFFFF-version 作头编码版本"的强制校验
---
## 四、加密与 IV 体系
### 4.1 IV 滚动:FUN_005fc114(getNewIv)
```c
uint getNewIv(byte* iv, int len, uint* state) {
uint s = state ? *state : 0xC65053F2; // 种子,字节 = F2 53 50 C6 = {-14,83,80,-58}
for (i=0; i<len; i++) funnyShit(&s, iv<i>); // FUN_005fc261
return s;
}
```
与 My 端 `MapleAESOFB.getNewIv` 完全一致(含 funnyBytes 表 + ROL32 3)。**每收/发包后调用一次**。
### 4.2 crypto state 对象(12 字节,堆分配)
```
+0x00IV 当前 IV(密文形态存放)
+0x04key 滚动密钥字节
+0x05..+0x07 pad
+0x08check 完整性校验值(初始 0x9A65)
```
两个操作互为逆:
| 函数 | 方向 | 逻辑 |
|---|---|---|
| FUN_004727fe | **导出**(E) | `out<i> = state<i> ^ key; key += state<i> + 0x2A; check` 滚动;结束时校验 check==state+8,不符抛异常断线;返回导出的 IV dword;**不修改 state** |
| FUN_004728b3 | **安装**(D) | `key = rand()&0xFF; check = 0x9A65; state<i> = in<i> ^ key; key += state<i> + 0x2A` |
因 key 演化规则相同(都基于 state 字节),`E(D(x)) == x` 恒成立。
附带反调试:全局计数 `0x67a764` 每 0x37(55)次导出触发一次随机重装;每 0x6F(111)次安装时把 state 结构搬迁到新堆块(0x4024de 分配 / memcpy / 释放旧块)。
**重要结论**:这两个函数只操作 IV state,不接触 payload 数据。所有"字段编码函数大量调用 0x4727fe"的表象(如 FUN_0046f2cd 调用约 25 次)实为对多个 crypto 对象逐个导出 IV(调用点只传 ECX、无数据参数,见 `0x46f3b9` 汇编)——**payload 全明文**。
### 4.3 每包 IV 滚动(收包方向)
收包泵(FUN_0043f2d7,`0x43f369-0x43f38c`):
```c
cur = FUN_004727fe(crypto); // 导出当前 IV(=握手原文)
FUN_005fc114(&cur, 4, 0); // getNewIv 滚动
FUN_004728b3(crypto, 新IV); // 安装回 state
dispatch(packet);
```
发包方向(FUN_0043ee73)同理。
### 4.4 首包版本校验(FUN_0043f2d7,`0x43f323-0x43f34a`)
```c
if (状态机返回 > 0 && 已收包计数 < 1) { // 仅第一个包
dword v = FUN_004727fe(sock+0x9c); // 导出 IV(=服务端 sendIv 原文)
if ((v >> 16 ^ *(u16*)(sock+0x86)) != 0xFFE4) disconnect(); // 0xFFE4 = ~0x1B
if (*(u16*)(sock+0x88) > 0x10000) disconnect();
}
```
---
## 五、客户端收包链路
```
WSA 异步消息 → FUN_005e0bc3(消息泵)→ FUN_0043f2d7(收包泵)
└─ FUN_004f34e9(头状态机,this=sock+0x78)
├─ 首包: = 头前两字节;版本一致性校验(4.4)
└─ 收满 → 状态 2
└─ FUN_004f3464(包定稿:拷贝 payload 到 CInPacket,携带头 u16)
└─ IV 滚动(4.3)
└─ FUN_0043f3c4(ProcessPacket,分发入口)
```
读者函数(CInPacket):
- `FUN_004163ea` = Decode1(1 字节,**opcode**)
- `FUN_00416420` = Decode2(2 字节 LE)
- `FUN_00416459` = Decode4(4 字节 LE)
- `FUN_00430234` = DecodeString(u16 前缀 + 内容)
---
## 六、客户端发包链路
```
业务函数(FUN_004f3868 = COutPacket 构造器,100+ 调用方)
└─ FUN_0043ee73(CClientSocket::Send,vtable @0x631f98)
├─ FUN_004727fe 导出当前 IV
├─ 防弱 IV 循环:lo16(IV)%31==0 时
│ ├─ FUN_00445b6d 对发送队列所有缓冲滚动校验和
│ ├─ FUN_004f3868(0x12) 构造保活包 + 附加校验和
│ └─ 发送并重滚 IV
├─ FUN_004f38d9(sock+0x19, 0x1B, &IV, 1, IV)← 核心编码发送
│ ├─ 头:h01 = hi16(IV)^0x1B;h23 = h01^len
│ └─ 分块 0x5B4,链式缓冲
└─ getNewIv 滚动 + FUN_004728b3 安装
```
服务端应对:客户端主动发的 0x12(超时/保活,FUN_0043f928 处理的是服务端 0x12)与 0x0D(pong)均需 My 端正常兼容(当前已兼容,用户可正常游玩)。
---
## 七、封包分发架构(三层)
```
FUN_0043f3c4(CClientSocket::ProcessPacket)
├─ opcode 0x0E-0x14 → socket 层内联处理
├─ opcode 0x16-0x29 → FUN_005e810c(WvsContext 段)
└─ 其余 → context functor 虚调用 *(*(ctx+8))(opcode, packet)
(ctx 由 FUN_004786ad 按登录/游戏状态创建)
├─ 登录阶段 functor(FUN_00490a83 构造)→ FUN_005193d7
│ └─ 0x2B/0x2C → FUN_00519400 / FUN_005197b6(此后切游戏 context)
└─ 游戏阶段 functor(FUN_00478cf9 构造,0xcf8 大对象)→ FUN_0048a09a
├─ 0xB7-0xBB 直处理
└─ 其余 → FUN_0047d3e8(主分发器)
├─ 0x2F-0x3A / 0x3E 直处理
├─ 0x2A-0x2D → FUN_005193d7
└─ 区段级联 → 各业务子分发器(见下表)
```
阶段包裹分发器(在主分发器外再套一层,处理 UI 状态相关包):
| 分发器 | opcode | 处理 |
|---|---|---|
| FUN_004837b9 | 0xA1 / 0xA2 | FUN_004838c0 / FUN_0048388e |
| FUN_004865dd | 0x3C / 0x3D | FUN_00486611 / FUN_00486676(船效果/船状态) |
| FUN_0048884b | 0x9F / 0xA0 | FUN_00488881 / FUN_00488955 |
---
## 八、完整 opcode → handler 映射表
### 8.1 Socket 层(FUN_0043f3c4 直处理)
| opcode | handler | My sendops 名称 | 说明 |
|---|---|---|---|
| 0x0E | FUN_0043f50e | CHANGE_CHANNEL | 读 type;≠0 时创建登录 context 并切场景 |
| 0x0F | FUN_0043f49a | PING | **立即回发 0x0D pong** |
| 0x10 | FUN_0043f5ef | — | 标志位(bit1 切换状态;bit4 → 异常断开) |
| 0x11 | FUN_0043f6cb | — | 反外挂 |
| 0x12 | FUN_0043f928 | — | 保活/迁移(子码 1/2 → 异常 0x22000008/9) |
| 0x13 | FUN_0043f9e2 | — | 数据表 |
| 0x14 | FUN_0043fbf6 | CHANNEL_SELECTED | u16 count + 重复 |
### 8.2 WvsContext 段(FUN_005e810c,0x16-0x29)
| opcode | handler | My sendops |
|---|---|---|
| 0x17 | FUN_005ef1c7 | MODIFY_INVENTORY_ITEM |
| 0x18 | FUN_005ef3cb | UPDATE_INVENTORY_SLOT |
| 0x19 | FUN_005ef42d | UPDATE_STATS |
| 0x1A | FUN_005ef73e | GIVE_BUFF |
| 0x1B | FUN_005ef7d1 | CANCEL_BUFF |
| 0x1C | FUN_005ef833 | —(My 未用) |
| 0x1D | FUN_005ef08b | UPDATE_SKILLS |
| 0x1E | FUN_005ef8bc | — |
| 0x1F | FUN_005eff2e | FAME_RESPONSE |
| 0x20 | FUN_005ef8d9 | SHOW_STATUS_INFO |
| 0x21 | FUN_005f0fee | SHOW_NOTES |
| 0x22 | FUN_005f1125 | TROCK_LOCATIONS |
| 0x24 | FUN_005f0635 | CHAR_INFO |
| 0x25 | FUN_005f3f9c | PARTY_OPERATION |
| 0x26 | FUN_005f4ae7 | BUDDYLIST |
| 0x27 | FUN_005f01e3 | SPAWN_PORTAL |
| 0x28 | FUN_005f02ae | SERVERMESSAGE |
### 8.3 主分发器 FUN_0047d3e8 直处理
| opcode | handler | My sendops |
|---|---|---|
| 0x2F | FUN_0047d6c4 | — |
| 0x30 | FUN_0047d7ac | — |
| 0x31 | FUN_0047d81a | — |
| 0x32 | FUN_0047d872 | MULTICHAT |
| 0x33 | FUN_0047da26 | WHISPER |
| 0x34 | FUN_0047e2b2 | — |
| 0x35 | FUN_0047e2eb | MAP_EFFECT |
| 0x36 | FUN_0047ea40 | FULLSCREEN_BLESS |
| 0x37 | FUN_0047ec67 | CASH_SONG |
| 0x38 | FUN_0047ed39 | GM_EFFECT(内含子码 4/5/7/0xE 分发) |
| 0x39 | FUN_0047f092 | OX_QUIZ |
| 0x3A | FUN_0047f768 | — |
| 0x3B | 虚调用 +0x1C | CLOCK |
| 0x3E | FUN_0047d9b3 | GUILD_OPERATION |
| 0x2A-0x2D | → FUN_005193d7 | 0x2B WARP_TO_MAP / 0x2C CS_CHAR |
### 8.4 玩家池区段(0x3F-0x6D → FUN_005a9ff7)
**直处理**:
| opcode | handler | My sendops |
|---|---|---|
| 0x40 | FUN_005aa05c | SPAWN_PLAYER |
| 0x41 | FUN_005aa1fe | REMOVE_PLAYER_FROM_MAP |
**子分发 FUN_005aa293(0x42-0x54)**:
| opcode | handler | My sendops |
|---|---|---|
| 0x43 | FUN_00595ec3 | CHATTEXT |
| 0x44 | FUN_005964e2 | UPDATE_CHAR_BOX |
| 0x45 | FUN_00597ccf | — |
| 0x46-0x4C | FUN_0059661d | 0x47 SPAWN_PET / 0x48 MOVE_PET / 0x49 PET_CHAT / 0x4A PET_NAMECHANGE / 0x4B PET_COMMAND |
| 0x4D-0x53 | FUN_00596674 | 0x4E SPAWN_SUMMON / 0x4F REMOVE_SUMMON / 0x50 MOVE_SUMMON / 0x51 SUMMON_ATTACK / 0x52 DAMAGE_SUMMON |
**子分发 FUN_005aa30c(0x55-0x63)**:
| opcode | handler | My sendops |
|---|---|---|
| 0x56 | FUN_004e2fc0 | MOVE_PLAYER |
| 0x57/0x58/0x59 | FUN_005acd7f | CLOSE_RANGE/RANGED/MAGIC_ATTACK |
| 0x5A | FUN_005ad148 | SKILL_EFFECT |
| 0x5B | FUN_005ad24e | CANCEL_SKILL_EFFECT |
| 0x5C | FUN_005ae883 | DAMAGE_PLAYER |
| 0x5D | FUN_00422f10 | FACIAL_EXPRESSION |
| 0x5E | FUN_005aeb4f | UPDATE_CHAR_LOOK |
| 0x5F | FUN_00596055 | SHOW_FOREIGN_EFFECT |
| 0x60 | FUN_005aecc4 | GIVE_FOREIGN_BUFF |
| 0x61 | FUN_005aecf5 | CANCEL_FOREIGN_BUFF |
| 0x62 | FUN_005aed21 | UPDATE_PARTYMEMBER_HP |
**子分发 FUN_005aa407(0x64-0x6C)→ 统一入口 FUN_0059ece7**:含 0x65 SHOW_CHAIR、0x66 SHOW_SPECIAL_EFFECT、0x6A MESOBAG_SUCCESS、0x6B MESOBAG_FAILURE。
### 8.5 怪物区段(0x6E-0x7E → FUN_004dc1e1)
| opcode | handler | My sendops |
|---|---|---|
| 0x6F | FUN_004dc2c0 | SPAWN_MONSTER |
| 0x70 | FUN_004dc39e | KILL_MONSTER |
| 0x71 | FUN_004dc47e | SPAWN_MONSTER_CONTROL |
| 0x73 | FUN_004d56e6 | MOVE_MONSTER |
| 0x74 | FUN_004d5aa7 | MOVE_MONSTER_RESPONSE |
| 0x76 | FUN_004d5b59 | APPLY_MONSTER_STATUS |
| 0x77 | FUN_004d5bb1 | CANCEL_MONSTER_STATUS |
| 0x78 | FUN_004d5be6 | — |
| 0x79 | FUN_004d5d4f | — |
| 0x7A | FUN_004d5d99 | DAMAGE_MONSTER |
| 0x7B | FUN_004d5f92 | SKILL_EFFECT_MOB |
### 8.6 NPC / 掉落 / 爱心 / 防御区区段
| opcode | handler | My sendops |
|---|---|---|
| 0x80 | FUN_004e8265 | SPAWN_NPC |
| 0x81 | FUN_004e82f7 | REMOVE_NPC |
| 0x82 | FUN_004e8355 | SPAWN_NPC_REQUEST_CONTROLLER |
| 0x84 | FUN_004e6a94 | NPC_ACTION |
| 0x88 | FUN_0047001b | DROP_ITEM_FROM_MAPOBJECT |
| 0x89 | FUN_00470abe | REMOVE_ITEM_FROM_MAP |
| 0x8C | FUN_004ca206 | — |
| 0x8D | FUN_004ca22e | SPAWN_LOVE |
| 0x8E | FUN_004ca7df | REMOVE_LOVE |
| 0x91 | FUN_00415fb5 | SPAWN_DEFENDER |
| 0x92 | FUN_00416584 | REMOVE_DEFENDER |
### 8.7 门 / 反应堆区段
| opcode | handler | My sendops |
|---|---|---|
| 0x95 | FUN_0052bbca | SPAWN_DOOR |
| 0x96 | FUN_0052c558 | REMOVE_DOOR |
| 0x99 | FUN_0050570c | REACTOR_HIT |
| 0x9B | FUN_005057fc | REACTOR_SPAWN |
| 0x9C | FUN_00505bd3 | REACTOR_DESTROY |
### 8.8 交互区段(复合 opcode)
| opcode | handler | My sendops | 说明 |
|---|---|---|---|
| 0xA5 | FUN_00502d0a | NPC_TALK | |
| 0xA8 | FUN_0050f535 | OPEN_NPC_SHOP | 经 FUN_0050f33f |
| 0xA9 | FUN_0050f33f 内部分发 | CONFIRM_SHOP_TRANSACTION | 子码 0-10(1/5/9→0x205,2/10→0x89,3→0x206,其余→0x207) |
| 0xAC | FUN_00534242 | — | STORAGE 操作(回发 0x0C 确认) |
| 0xAD | FUN_00534498 | STORAGE_OPEN | |
| 0xAE | FUN_00534242 内部分发 | STORAGE_OPERATION | 子码 8/9/10/12/13/15 |
| 0xB0-0xB2 | FUN_0054ef29 | MESSENGER(0xB1) | **2 级子码 0-8**:0→0054ccb2,1→0054cf28,2→0054d03a,3→0054f195,4→0054efc0,5→0054f0a8,6→0054f2c6,7→0054f54f,8→0054f607 |
| 0xB3-0xB5 | FUN_004cc19d | PLAYER_INTERACTION(0xB4) | **2 级子码**:2→004cc5ee,3→004cc795,4→004cc9d0,5→004cc239,6→虚调用 vtable+0x48,9→004ccb11,10→004cca69 |
| 0xB7-0xBB | FUN_0048a09a 直处理 | — | 0048a100 / 0048a25c / 0048a2e7 / 0048a4c4 / 0048a5b6 |
### 8.9 未在客户端处理表中出现的区间
0x00-0x0D(登录 UI 包,如 LOGIN_STATUS 0x01 等)不在 socket 层与游戏分发器中——它们由**登录阶段 context functor** 的 vtable 虚调用处理(登录 functor 构造于 FUN_00490a83,0x2B/0x2C 之后切换为游戏 functor)。0xC0-0xFF 区间(My 的 CS_UPDATE/CS_OPERATION/雇佣商店 0xCA-0xCC)在本客户端主分发器中无静态 case,属商城连接独立通道或该版本未启用。
---
## 九、与 My 服务端的交叉验证结论
1. **握手**:`` —— My `getHello` 完全吻合,客户端强校验 version==0x1B、type==4。
2. **帧头**:客户端发送 `^0x1B]][...]`、校验服务端头 `hi16(IV)^h01==0xFFE4`(即服务端头必须用 `0xFFFF-27` 编码)—— My `sendCypher(0xFFE4)` / `recvCypher(0x1B)` 的构造**完全正确**。
3. **长度还原**:两 LE u16 异或 = My `getPacketLength` 的 `hi16^lo16` + bswap —— 等价。
4. **IV 滚动**:客户端 `FUN_005fc114` ≡ My `getNewIv`(种子、funnyBytes、ROL32 3 全同)。
5. **payload 明文**:客户端无任何 payload 变换调用(0x4727fe/0x4728b3 仅操作 IV state)—— My `crypt()` 空操作**正确,不是偷工减料**。
6. **保活**:客户端 0x0F(PING)→自动回 0x0D;客户端主动发 0x12(带发送队列校验和)—— My 需容忍 0x0D/0x12 上行包(当前已兼容)。
7. **opcode 表**:WvsContext 段 0x17-0x28 与 My sendops.ini 逐项吻合;主分发器各区间与 My 注释一一对应。
## 十、对照 Other 商业端的移植提示
- 客户端 0xB3-0xB5(FUN_004cc19d)是**统一玩家互动通道**(2 级子码区分交易/小游戏/聊天室等,子码 6 走对象 vtable)——这印证了 Other 商业端 GameRoom/TradeRoom 专门类的设计:**五子棋等小游戏应归入 PLAYER_INTERACTION 通道(0xB4)而非交易**,移植时按子码区分路由。
- 0xB0-0xB2(FUN_0054ef29)是 Messenger(好友聊天室)通道,与 0xB4 是两个不同的复合 opcode 家族,My 端当前 MESSENGER=0xB1 / PLAYER_INTERACTION=0xB4 的区分正确。
- 客户端不处理的 0xC0+ 区间说明:商城独立连接(如 My 的 CS server 通道)有独立分发器,不在主连接 opcode 表内。
- 删档重建后无需处理的换购旧道具兼容问题不受本协议分析影响。
---
## 附录:关键函数地址速查
| 地址 | 功能 |
|---|---|
| 0x0043dd01 | 握手读取器(阻塞 recv) |
| 0x0043fc43 | 握手完成 socket 重置 |
| 0x0043f2d7 | 收包泵(CClientSocket::OnReceive) |
| 0x004f34e9 | 收包头状态机(写 sock+0x86) |
| 0x004f3464 | 收包定稿(拷贝 CInPacket) |
| 0x0043f3c4 | 分发入口(ProcessPacket) |
| 0x004727fe / 0x004728b3 | IV 导出 / 安装(互逆对) |
| 0x005fc114 / 0x005fc261 | getNewIv / funnyShit |
| 0x004f3868 | COutPacket 构造器 |
| 0x004f38d9 | 发包编码(4 字节头 + 分块发送) |
| 0x0043ee73 | CClientSocket::Send |
| 0x004163ea / 0x00416420 / 0x00416459 | Decode1 / Decode2 / Decode4 |
| 0x00430234 | DecodeString |
| 0x0045b6d | (0x00445b6d)发送队列校验和(0x12 保活) |
| 0x0047d3e8 | 主游戏分发器 |
| 0x005e810c | WvsContext 分发器(0x17-0x28) |
| 0x005193d7 | 登录→游戏切换分发器(0x2B/0x2C) |
| 0x0048a09a | 游戏阶段分发器(0xB7-0xBB) |
| 0x004727fe 调用计数 0x67a764 | 反调试计数器(%0x37 / %0x6F) |</i></i></i></i></i></i></i>
66666666666666 老哥有客户端吗? wenyu194222 发表于 2026-9-4 20:02
老哥有客户端吗?
http://pan.baidu.com/s/1c1ro4EG 感谢您的分享!:lol非常好 6666666666666666666 Ddov 发表于 2026-9-4 22:40
http://pan.baidu.com/s/1c1ro4EG
第一次死亡回程点击确认无反应,要小退。偶然还会二次出现这种情况。装备爆率好像不太正常,能加个指令查看爆率么? 本帖最后由 Ddov 于 2026-9-5 12:08 编辑
wenyu194222 发表于 2026-9-5 11:11
第一次死亡回程点击确认无反应,要小退。偶然还会二次出现这种情况。装备爆率好像不太正常,能加个指令查 ...
感谢反馈!
死亡回城我倒是没注意测试过,爆点率是有不正常已经调过很多版了..目前还在推进掉率算法,趋近正常后会发布更新补丁的
我先去测试一下! wenyu194222 发表于 2026-9-5 11:11
第一次死亡回程点击确认无反应,要小退。偶然还会二次出现这种情况。装备爆率好像不太正常,能加个指令查 ...
死亡测试我这边是正常的,emmm 你是在哪个地图死亡的方便提供一下吗?我去测一下