# Encode6BitBuf 算法(静态逆向自游戏客户端 Mach-O) > 逆向日期: 2026-09-18 > 来源: /tmp/cq2_debug.app(游戏客户端重签副本) > 地址: 编码核心 @ __TEXT+0x4b4e4,解码核心 @ __TEXT+0x4b594(文件偏移,vm = +0x100000000) > lua 桥接: `lua_mmorpg_..._Encode6BitBuf` @0x416c0(luaL_Reg 表项 @0x828e98) ## 用途 传奇客户端登录帧 CS 2001 的 body 字段编码: `account / Encode6BitBuf(password) / Encode6BitBuf(channelID) / otpType / otpCode` ## 汇编解读(ARM64, 0x4b4e4 编码核心) ```asm ; 入参 x0=src, x1=dst, x2=len, x3=&out_len ldrb w15, [x0], #0x1 ; 取1字节 ldrb w15, [x13, x15] ; 查表 tbl1[256] @ 0x1008ae5f4 eor w16, w15, #0x9 ; XOR 0x09 ; 位重组: 6bit 累积输出, 偏移 0x3C (= '<',可打印化) ; w12 ∈ 0..5 循环移位计数, 每 4 字节输入 → 每 3 字节输出后翻转方向(Mir 双向变体) strb w17, [x1, w8, sxtw] ; 输出 = 6bit值 + 0x3C ``` 本质:Mir2/传奇系经典 Encode6BitBuf 变体—— 1. 每字节先过 256 字节替换表(表数据在 __DATA @0x1008ae5f4) 2. XOR 0x09 3. 8bit→6bit 重组(方向位 w12: 0→4 加 2,4→0 翻转——对应 Mir 源码里 `bt=6/bt=2` 的 zigzag) 4. 每输出 6bit 加 `0x3C` 变可打印字符 ## 注意 - **256 字节替换表**是算法的一部分,尚未从二进制提取(地址已知:运行时 `__DATA段基+0x5f4`, dump 侧 `/tmp/lua_heap.bin` 或直接读 `/tmp/cq2_debug.app/996传奇盒子` 文件偏移 0x8ae5f4 附近) - 解码(0x4b594)为逆过程,同样查表(表 @0x8ae6f4),可先提取表再做 Python 实现 - 与开源 Mir 源码(Encode6BitBuf/Decode6BitBuf)高度同源,可对照实现 ## 验证方法(下一步) 用真实抓包的 CS 2001 帧(docs 里 capture 的 102 字节明文帧)对比本算法输出, 逐字节 diff 修正表值/方向位。