════ 发包写法_参考模板风格_2026-09-25 ════ ★ 重要发现:抓包记录每条比真实包多 2 个前导 00。 真实包(喂给发包Call的)= 抓包hex去掉开头 4 个字符(2字节 00 00)。 验证:开店真实包 0000CB00 0D 00 01 0A 00 [店名] ←→ 抓包 0000|0000CB000D00010A00[店名] 完全吻合。 包头真实结构:[0000][功能号 word][包体长度 word],包体长度=包体字节数(从功能号后算到包尾)。 ────────────────────────────── 一、开店(沿用你验证过的模板,仅补编码提示) ────────────────────────────── .版本 2 .子程序 发包_开店 .参数 开店名称, 文本型 .如果真 (开店名称 = “”) 开店名称 = “8888” .如果真结束 ' 中文店名若乱码/被拒,把下一行的 到字节集(开店名称) 换成: ' 到字节集 (编码_简体到BIG5 (开店名称)) 封包 = 机器码到字节集 (“0000CB00”) + 到字节集 (到字节 (取文本长度 (开店名称) + 3)) + { 0, 1 } + 到字节集 (到字节 (取文本长度 (开店名称))) + { 0 } + 到字节集 (开店名称) 发包Call (封包, 取字节集长度 (封包)) ────────────────────────────── 二、物品操作(0x99,按已定案字段翻译成同款写法) 总长 114 字节(发包Call发出后线上为 116,对应抓包头 0000 9900 6C00) ────────────────────────────── .版本 2 .子程序 发包_物品操作 .参数 槽位, 字节型 ' 抓包样本:3 或 4 .参数 物品编号, 整数型 ' 抓包样本:1000000106(槽3)/ 1000000204(槽4) .参数 唯一码, 文本型 ' 7字节hex原样抄抓包:槽3物品=B313AD8B19EBDC,槽4物品=B8F5FA64A8E55C .参数 数量, 字节型 ' 抓包样本:11/22/103/113 封包 = 机器码到字节集 (“000099006C00”) ' 前缀+功能号0x99+包体长度108 封包 = 封包 + { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 01 + 11个0 封包 = 封包 + 机器码到字节集 (唯一码) ' 物品唯一码7字节(每件物品固定,从抓包抄) 封包 = 封包 + 到字节集 (到字节 (槽位)) + { 0, 0, 0, 0 } ' 槽位+4个0 封包 = 封包 + 到字节集 (物品编号) ' 物品编号4字节小端 封包 = 封包 + { 0, 0, 0, 0 } ' 4个0 封包 = 封包 + 到字节集 (数量) ' 数量1字节(偏移40) 封包 = 封包 + 取重复字节集 (75, { 0 }) ' 尾部75个0(凑满包体108) 发包Call (封包, 取字节集长度 (封包)) 自检:6+12+7+5+4+4+1+75 = 114 = 6字节头 + 包体108(0x6C) ✓ ────────────────────────────── 三、测试与观察 ────────────────────────────── 1. 先原样复刻一次抓包(槽3/1000000106/B313AD8B19EBDC/数量11),若服务器有反应 → 组包通路正确,再逐个改数量/槽位/物品编号做交叉验证。 2. 若发包Call 发出去服务器没反应:在封包最前面补 “0000”(凑成116字节完整版)再试, 用来判定发包Call 是否已自动补前缀。 3. 数量超过物品实际堆叠上限时服务器的反应(拒绝/截断/照单全收)也值得记一笔。 4. 唯一码不能编造——换物品必须换对应唯一码,否则大概率被服务器丢弃。 ════ 第二批开店测试包(0925,喂发包Call格式,0000CB00 开头)════ 店名 包总长 直接发送 小店 13 0000CB000700010400A470A9B1 我的商店 17 0000CB000B00010800A7DAAABAB0D3A9B1 天天商店 17 0000CB000B00010800A4D1A4D1B0D3A9B1 哈哈哈哈哈哈 21 0000CB000F00010C00ABA2ABA2ABA2ABA2ABA2ABA2 888888888888 21 0000CB000F00010C00383838383838383838383838 8888888888888888 25 0000CB00130001100038383838383838383838383838383838 888...(20个8) 29 0000CB0017000114003838383838383838383838383838383838383838 888...(24个8) 33 0000CB001B00011800383838383838383838383838383838383838383838383838 abcd8888 17 0000CB000B000108006162636438383838 测试目的: - 中文正常名(小店/我的商店/天天商店) → 验证BIG5编码服务端接受 - 12/16/20/24字节纯数字 → 从短到长探测店名长度上限(哪个开始被拒即上限) - abcd8888 → 验证英文小写是否允许 - 哈哈哈哈…12字节 → 与纯数字同长度对照(区分"长度"与"字符集"拒因) ════ ★★ 修正(0925 实测后):发包Call 不补前缀,包必须用完整 4 字节前缀 ╡═══ 实测结论: - 用 0000CB00 开头的包 → 失败(少 2 字节前缀) - 抓包原样 00000000CB000D00010A00A4FBA4FBA4FBA4FBA4FB(店名 牛牛牛牛牛)→ 成功 - ⇒ 发包Call 原样发送,真实包 = [00000000][功能号 word][包体长度 word][01][文本长度 word][文本BIG5] - 旧模板的 0000CB00 是旧工具发包Call 自动补了 2 字节前缀所致。 修正后直接可发(完整格式): 小店 00000000CB000700010400A470A9B1 我的商店 00000000CB000B00010800A7DAAABAB0D3A9B1 天天商店 00000000CB000B00010800A4D1A4D1B0D3A9B1 哈哈哈哈哈哈 00000000CB000F00010C00ABA2ABA2ABA2ABA2ABA2ABA2 888888888888 00000000CB000F00010C00383838383838383838383838 8888888888888888 00000000CB00130001100038383838383838383838383838383838 88888888888888888888 00000000CB0017000114003838383838383838383838383838383838383838 abcd8888 00000000CB000B000108006162636438383838 修正版开店子程序(唯一改动:机器码到字节集("00000000CB00")): .版本 2 .子程序 发包_开店 .参数 开店名称, 文本型 .如果真 (开店名称 = “”) 开店名称 = “牛牛牛牛牛” .如果真结束 封包 = 机器码到字节集 (“00000000CB00”) + 到字节集 (到字节 (取文本长度 (开店名称) + 3)) + { 0, 1 } + 到字节集 (到字节 (取文本长度 (开店名称))) + { 0 } + 到字节集 (开店名称) 发包Call (封包, 取字节集长度 (封包)) ★ 物品包同理:喂发包Call 的包也要加满 4 字节前缀,即把 机器码到字节集 (“000099006C00”) 改为 机器码到字节集 (“0000000099006C00”), 尾部 0 相应减 2 个(75→73),总长 116。 ════ ★ 实测结果(0925):修正版 8 包全部开店成功 ╡═══ 小店/我的商店/天天商店/哈哈哈哈哈哈/12位/16位/20位数字/abcd8888 全部可用。 开店协议最终定案:[00000000][CB00][包体长度=3+len][01][len u16][店名BIG5],长度上限≥20字节,英文/数字/BIG5中文均允许。 下一步:物品包 116 字节格式实测(头改 0000000099006C00、尾 73 个 0)。 ════ 发包开店·逐行注释版(0925,用户实测通过)════ .版本 2 .子程序 发包开店, 逻辑型, 公开 .参数 开店名称, 文本型 .局部变量 店名BIG5, 字节集 .局部变量 封包内容, 字节集 .如果真 (开店名称 = “”) 开店名称 = “牛牛自助开店” .如果真结束 店名BIG5 = 到字节集 (编码_简体到BIG5 (开店名称)) ' 游戏内码BIG5,简体必须转,数字英文不变 封包内容 = 机器码到字节集 (“00000000CB00”) + 到字节集 (到字节 (取字节集长度 (店名BIG5) + 3)) + { 0, 1 } + 到字节集 (到字节 (取字节集长度 (店名BIG5))) + { 0 } + 店名BIG5 发包Call (封包内容, 取字节集长度 (封包内容)) 挂机信息.加入文本 (自定义时间 () + “发包开店:” + 到文本 (转换_字节集到十六进制 (封包内容)) + #换行符 + #换行符) 返回 (真) 字节段说明: ① 00000000 固定前缀 ② CB00 功能号=开店 ③ (L+3) 包体长度低字节 ④ 0=包体长度高字节 ⑤ 1=子命令(开店动作) ⑥ (L) 店名长度低字节 ⑦ 0=店名长度高字节 ⑧ 店名BIG5本体 例:牛牛牛牛牛(L=10) → 00000000CB000D00010A00A4FBA4FBA4FBA4FBA4FB(与抓包逐字节一致) 用户改动备注:编码_简体到BIG5 返回文本型,需套 到字节集();末段字节集直接 +,不可套 到字节(到字节集())。 ════ 开店放入物品·子程序(0925,结构定案待实测)════ 流程:先发 1A 选摊位格 → 再发 CB 放物品(两包一组,顺序不能反) .版本 2 .子程序 发包_开店上架, 逻辑型, 公开, 放物品到店铺摊位(1A选格+CB放物品) .参数 摊位格, 整数型, , 抓包见过 3/4/5/23/24/25/26 .参数 物品编号, 整数型, , 如 1000000106 .参数 唯一码, 文本型, , 7字节hex 如 B313AD8B19EBDC,必须跟物品走 .参数 价格, 整数型, , 单价,实测 1~100 均可(≤255) .参数 背包总量, 整数型, , 该物品背包总数量(1A包用,如 103) .参数 上架数量, 整数型, , 实际上架数量(≤255) .局部变量 封包, 字节集 ' ① 选摊位格:00000000|1A00|0C00|01 00|格|28 00|序号|背包总量|00 00|55AA 封包 = 机器码到字节集 ("000000001A000C000100") + 到字节集 (到字节 (摊位格)) + { 0 } + 机器码到字节集 ("2800") + 到字节集 (到字节 (1)) + { 0 } + 到字节集 (到字节 (背包总量)) + { 0, 0, 0 } + 机器码到字节集 ("55AA") 发包Call (封包, 取字节集长度 (封包)) ' ② 放物品:00000000|CB00|6100|02|物品ID4B|0000 0000|唯一码7B|00|价格|格|数量|0填满包体97 封包 = 机器码到字节集 ("00000000CB00610002") + 到字节集 (物品编号) + { 0, 0, 0, 0 } + 机器码到字节集 (唯一码) + { 0 } + 到字节集 (到字节 (价格)) + { 0 } + 到字节集 (到字节 (摊位格)) + { 0 } + 到字节集 (到字节 (上架数量)) + { 0 } + 取重复字节集 (74, { 0 }) 发包Call (封包, 取字节集长度 (封包)) 挂机信息.加入文本 (自定义时间 () + "开店上架:" + 到文本 (转换_字节集到十六进制 (封包)) + #换行符) 返回 (真) 说明: - CB包总长105(8头+包体97),包体=1+4+4+7+1+2+2+2+74个0 - 1A包总长22(8头+包体12+尾55AA),"序号"字段抓包为1,1,2,3,4,5,6,7递增,语义未定先写1 - B0包是客户端心跳(约10秒一发),不用伪造 ════ 确认开店 / 取消开店(0925 22:57)════ .版本 2 .子程序 发包_开店确认, 逻辑型, 公开, 放完物品后确认开店(总长11字节=8头+子命令1+55AA) .局部变量 封包, 字节集 封包 = 机器码到字节集 (“00000000CB00010003”) + 机器码到字节集 (“55AA”) 发包Call (封包, 取字节集长度 (封包)) 返回 (真) .子程序 发包_取消开店, 逻辑型, 公开, 取消开店(3字节动态值待破解,先抄包) .参数 动态值, 文本型, , 6位hex 如 1A6DDF,从抓包抄 .局部变量 封包, 字节集 封包 = 机器码到字节集 (“00000000B000040005”) + 机器码到字节集 (动态值) 发包Call (封包, 取字节集长度 (封包)) 返回 (真) 0xCB 家族:01=开店/改店名 02=放物品 03=确认开店 取消开店=B0包(05+3字节动态值),与心跳同型,规律待破解 ════ 发包_开店放物·合并版(0925 23:01,用户读内存风格 + 今日实抓 105 格式)════ .版本 2 .子程序 发包_开店放物, 逻辑型, 公开, 从背包读物品数据直接组包(含1A选格) .参数 背包格子, 整数型, , 0-35 .参数 摊位格, 整数型, , 放到店铺哪个格(抓包见 3/4/5/23/24/25/26) .参数 出售数量, 整数型, , 传0=自动读背包实际数量 .参数 出售价格, 整数型, , 单价(≤65535,实测1~100) .局部变量 背包首址, 整数型 .局部变量 物品位置, 整数型 .局部变量 物品编号, 字节集 .局部变量 唯一码, 字节集, , 物品结构+80 读8字节(7字节token+尾00,与抓包吻合) .局部变量 背包总量, 整数型 .局部变量 封包数据, 字节集 背包首址 = 内存_读整数型 (全局_进程句柄, #背包基址) 物品位置 = 内存_读整数型 (全局_进程句柄, 背包首址 + 4 × 背包格子 + #背包位置) 物品编号 = 内存_读字节集 (全局_进程句柄, 物品位置 + #背包编号, 4) 背包总量 = 内存_读整数型 (全局_进程句柄, 物品位置 + #背包数量) .如果真 (出售数量 = 0) 出售数量 = 背包总量 .如果真结束 唯一码 = 内存_读字节集 (全局_进程句柄, 物品位置 + 92, 8) ' +92=0x5C,0925晚CE活体验证(旧参考代码写80是错的) ' ① 1A 选摊位格(总22字节,含尾55AA) 封包数据 = 机器码到字节集 (“000000001A000C000100”) + 到字节集 (到字节 (摊位格)) + { 0 } + 机器码到字节集 (“2800”) + 到字节集 (到字节 (1)) + { 0 } + 到字节集 (到字节 (背包总量)) + { 0, 0, 0 } + 机器码到字节集 (“55AA”) 发包Call (封包数据, 取字节集长度 (封包数据)) ' ② CB 放物品(总105字节,包体97) 封包数据 = 机器码到字节集 (“00000000CB00610002”) + 物品编号 + { 0, 0, 0, 0 } + 唯一码 + 到字节集 (到字节 (出售价格)) + { 0 } + 到字节集 (到字节 (摊位格)) + { 0 } + 到字节集 (到字节 (出售数量)) + { 0 } + 取重复字节集 (74, { 0 }) 发包Call (封包数据, 取字节集长度 (封包数据)) 挂机信息.加入文本 (自定义时间 () + “开店放物:” + 到文本 (转换_字节集到十六进制 (封包数据)) + #换行符) 返回 (真) ★ 与旧工具参考代码的差异(重要): - 旧工具格式 0000CB00 2900 总47:数量2+格子2+价格8(长整数),字段顺序不同 → 疑似旧版协议 - 今日实抓 00000000CB00 6100 总105:价格2+格子2+数量2 → 以实抓为准 - 你的发包Call 现在不补前缀,头必须写全 00000000;长度别写死47,用 取字节集长度 ════ CE 活体验证记录(0925 23:10,全链通过)════ 读法链(实测):P=[0x03BEF5D0];物品位置=[P+0x53C+4×格子] +0x54(84) 物品编号4B +0x5C(92) 唯一码8B(7字节token+00,与发包字段逐字节一致)★旧参考代码+80是错的 +0x64(100) 名称(BIG5,可解码) +0xD4C(3404) 数量 +0xD54(3412) 分类 验证样本:槽3 雪原蔘 6ACA9A3B/B313AD8B19EBDC00/103、槽4 藥繕的萬年雪蔘 CCCD9A3B/B8F5FA64A8E55C00/113, 与抓包 token 完全一致;1A包的"背包总量"=+0xD4C。 注意:堆上明文缓存(0x174DD657等)地址会漂移,不要直接用;走背包链读最稳。 ════════════════════════════════════════════════════════════════ 开店放入物品 · 完整子程序(0925 定稿,用户写法风格) ════════════════════════════════════════════════════════════════ 【流程】① 发 1A 选摊位格 → ② 发 CB 放物品 → (可选)发 CB 03 确认 【地址】背包基址 P=[0x03BEF5D0];物品位置=[P+0x53C+4×格子] +0x54(84) 物品编号4B +0x5C(92) 唯一码8B(7B token+00) +0xD4C(3404) 背包数量 +0xD54(3412) 物品分类 【相关常量】#背包基址值 / #背包物品位置值(1340) / #背包物品编号值(84) #背包物品数量值(3404) / #物品分类值(3412) / #背包物品名称值(100) .版本 2 .支持库 spec .子程序 发包开店放入物品, 逻辑型, 公开, 开店后把背包物品放进摊位(1A选格+CB放物) .参数 物品格子, 整数型, , 背包格子 0-35 .参数 摊位格, 整数型, , 店铺摊位格 0-35 .参数 出售价格, 整数型, , 单价,实测 1~100 均可(上限 65535) .参数 出售数量, 整数型, , 传 0 则按背包实际数量全放 .参数 操作序号, 整数型, , 1A 包的递增序号,从 1 开始每次放物 +1 .局部变量 背包基址, 整数型, , 内存读来的背包管理器指针 .局部变量 物品位置, 整数型, , 该格子对应物品结构体的实际地址 .局部变量 物品编号, 字节集, , 4 字节,如 6ACA9A3B(雪原蔘) .局部变量 背包总量, 整数型, , +3404 该物品背包存量,1A 包要填 .局部变量 唯一码, 字节集, , 8 字节 = 物品位置+92(0x5C),放物包必填 .局部变量 封包内容, 字节集, , 最终要发出的封包 背包基址 = 内存_读整数型 (全局_进程句柄, #背包基址值) 物品位置 = 内存_读整数型 (全局_进程句柄, 背包基址 + 4 × 物品格子 + #背包物品位置值) 物品编号 = 内存_读字节集 (全局_进程句柄, 物品位置 + #背包物品编号值, 4) 背包总量 = 内存_读整数型 (全局_进程句柄, 物品位置 + #背包物品数量值) .如果真 (出售数量 = 0) 出售数量 = 背包总量 .如果真结束 ' ★ 唯一码在 物品位置+92(0x5C),不是 +80!CE 活体验证过,7字节token+尾00 唯一码 = 内存_读字节集 (全局_进程句柄, 物品位置 + 92, 8) ' ── ① 选摊位格(22 字节,含尾 55AA)─────────────────────────── ' 00000000|1A00|0C00|01 00|摊位格 u16|2800|序号 u16|背包总量 u16|00 00|55AA 封包内容 = 机器码到字节集 ("000000001A000C000100") + { 0 } + 到字节集 (到字节 (摊位格)) + { 0 } + 机器码到字节集 ("2800") + 到字节集 (到字节 (操作序号)) + { 0 } + 到字节集 (到字节 (背包总量)) + { 0, 0 } + 机器码到字节集 ("55AA") 发包Call (封包内容, 22) ' ── ② 放物品(105 字节,包体 97,尾部 74 个 0 补满)──────────── ' 00000000|CB00|6100|02|物品编号4|0000 0000|唯一码8|价格u16|摊位格u16|数量u16|0×74 封包内容 = 机器码到字节集 ("00000000CB00610002") + 物品编号 + { 0, 0, 0, 0 } + 唯一码 + 取字节集左边 (到字节集 (到字节 (出售价格)) + { 0 }, 2) + 取字节集左边 (到字节集 (到字节 (摊位格)) + { 0 }, 2) + 取字节集左边 (到字节集 (到字节 (出售数量)) + { 0 }, 2) + 取重复字节集 (74, { 0 }) 发包Call (封包内容, 105) 挂机信息.加入文本 (自定义时间 () + "开店放入物品:背包格" + 到文本 (物品格子) + " → 摊位格" + 到文本 (摊位格) + " 数量" + 到文本 (出售数量) + " 价格" + 到文本 (出售价格) + #换行符 + 转换_字节集到十六进制 (封包内容) + #换行符) 返回 (真) .子程序 发包开店确认, 逻辑型, 公开, 放完所有物品后确认开店(11 字节) .局部变量 封包内容, 字节集 封包内容 = 机器码到字节集 ("00000000CB00010003") + 机器码到字节集 ("55AA") 发包Call (封包内容, 11) 返回 (真) ★ 使用示例: 发包开店放入物品 (3, 3, 100, 11, 1) ' 背包格3 雪原蔘 → 摊位格3,价100,放11个 发包开店放入物品 (4, 4, 200, 0, 2) ' 背包格4 萬年雪蔘 → 摊位格4,价200,全放 发包开店确认 () ★ 三个血泪坑: 1. 头必须写全 00000000(4 字节),你的发包Call 原样发送不补前缀 2. 唯一码取 +92,旧参考代码里的 +80 读出来是错的 3. 1A 的"序号"要递增(1,2,3…),固定填 1 可能被服务器当成重复包丢弃 ════════════════════════════════════════════════════════════════ CE 活体分析·开店放入物品(0925 23:20~23:40,YGOnline PID 13264) ════════════════════════════════════════════════════════════════ 【A 读法链复查 —— 重登后依然 100% 稳定】 [0x03BEF5D0] = 0x47BB7008(与昨晚同值) 槽3 雪原蔘 6ACA9A3B / B313AD8B19EBDC00 / 103 ✓与昨日一致 槽4 藥繕的萬年雪蔘 CCCD9A3B / B8F5FA64A8E55C00 / 113 ✓ 槽23 鐵箭 96CA9A3B / B1D31C80AD0C5D00 / 111 ✓ 槽26 藥繕的金創藥 CACD9A3B / 25947781AD0C5D00 / 91 ✓ 【B 背包槽数组下标语义 —— 用户写法得到证实】 P+0x53C 起 36 个 dword,下标 = 背包格子号(0~35),空槽填 0 本次空槽 = 27,28,29,31,32,33(其余 30 格有物) ⇒ 内存_读整数型(背包基址 + 4×物品格子 + 0x53C) 的写法完全正确 【C 物品结构全图(槽3 雪原蔘,共读 0xE60 字节)】 +0x000 = 0x010FA7B0 +0x008 = 0x0000001A(26)★恒 +0x00C = 0x2360 +0x010 = 14 +0x014 = -1 +0x01C = 1 +0x028 = 123(0x7B) +0x02C = 267 +0x030/0x34 = 32/32 +0x038/0x03C = 0x46B496F0/4(全局文本池,与 P+0x38 同址) +0x04C = 0xFFFF +0x054 = 物品编号 +0x05C = 唯一码8B +0x064 = 名称(BIG5) +0x068 = 30951 +0x0F8/0xFC = 残余 +0x2F8 = 0x10000 +0x2FC = 0x10003 +0x300 = 指针 +0x320/0x324 = 0x3F800000(浮点1.0) +0x32C = 0x100 +0xD38 = 0x46B496C8(全局池) +0xD4C = 数量103 +0xD54 = 分类 +0xD60 = 600 +0xD68 = 180(恒为 D60×0.3,疑似重量/上限) +0xDC0/0xDD0/0xDD4/0xDF8 = 3/1/1/1 +0x0E00 = 40 【D 两个「像但都不是」的关联(重要,别踩坑)】 ✗ 假设:1A 包的 2800 来自物品结构 +0x0E00 → 证伪 槽26 金創藥 +0x0E00=38,但抓包里该包仍写 2800 ⇒ 1A 包的 0x28 固定写死 40(客户端常量:背包容量),不要读内存 ✓ 现象:物品结构 +0x008 恒 = 0x1A(本次 30 个背包物品 100% 相同) 与 1A 包功能号同值,疑为「背包物品对象」的类别标记/幻数 可作为「这格确实是有效背包物品」的校验位,但因果未证实 ✗ 尝试:序列扫描 1,2,3,4,5,6,7 找发包流水号计数器 → 未定位 抓包序号 1,1,1,2,3,4,5,6,7 会重复,故不是全局流水号 ⇒ 判定为「开店会话内的放物次数」,子程序用外部递增参数即可 【结论】子程序无需改动;新增两条可用信息: ① 背包槽下标 = 格子号,空槽指针为 0(可用来判断格子是否为空) ② +0x008=0x1A 可作物品有效性校验