Encode6BitBuf_算法.md 1.9 KB

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 编码核心)

; 入参 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 修正表值/方向位。