Files
IC.Rebuild/diagnostics/2026-10-13-patch-2026.10.06-adaptation.md

90 lines
5.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 客户端更新补丁 2026.10.06 完整适配与反汇编审计记录
- **日期**:2026 年 10 月 13 日
- **新客户端版本**:国际服 `2026.10.06.0000.0000`
- **新目标二进制**:`ffxiv_dx11.exe`(51,890,944 字节,SHA256 `B38840761E2677128B6BEC1CEAEE3F2870CD84E1D38AB7958216373058383780`)
- **旧客户端基线**:国际服 `2026.09.15.0000.0000`(51,878,744 字节,SHA256 `5BBC501DD5C7F22FD61A11D08C25356041D878DB7CD83203ADAE393E4DFACC44`)
- **旧二进制备份路径**:[`binaries/2026.09.15.0000.0000/ffxiv_dx11.exe`](file:///e:/SapphireServer/Dalamud%20Dev/IC.Rebuild/binaries/2026.09.15.0000.0000/)
---
## 1. 原生二进制签名全量扫描对比
在新版二进制 `ffxiv_dx11.exe`(`2026.10.06.0000.0000`)上对所有 23 处特征码进行完整静态扫描,**23/23 处特征码全部在新二进制中唯一定位成功**(其中 22 处为单一匹配,1 处 `NoBackswing` 包装入口匹配 2 处且首匹配正确)。
在扫描过程中,修正了 [`AdaptationManifest.cs`](file:///e:/SapphireServer/Dalamud%20Dev/IC.Rebuild/Core/AdaptationManifest.cs) 中 `ForcedWalkHook` 的签名字符串笔误(`????` 修正为标准的 `?? ??` 分隔通配符),成功定位到新 RVA `0x194AFE3`。
### 23 处 Hook 与函数入口 RVA 偏移位移对照表
| 序号 | 目标名称 | 模块 ID | 旧版本 RVA (2026.09.15) | 新版本 RVA (2026.10.06) | RVA 偏移量 | 匹配数 | 状态 |
| :--- | :--- | :--- | :--- | :--- | :--- | :--- | :--- |
| 1 | `SpeedHook` | 1 | `0x8D6E40` | `0x8D6AF0` | -0x350 | 1 | 匹配 |
| 2 | `AccelerationHook` | 2 | `0x182BB20` | `0x182BB40` | +0x20 | 1 | 匹配 |
| 3 | `MovePermissionHook` | 3 | `0xE16130` | `0xE16030` | -0x100 | 1 | 匹配 |
| 4 | `AntiKnockHook` | 4 | `0x90BC90` | `0x90B650` | -0x640 | 1 | 匹配 |
| 5 | `OnSendFlagHook` | 5 | `0x62AF60` | `0x62B050` | +0xF0 | 1 | 匹配 |
| 6 | `FallCheckHook` | 6 | `0x182F9E4` | `0x182FA04` | +0x20 | 1 | 匹配 |
| 7 | `ForcedWalkHook` | 7 | `0x194AEC3` | `0x194AFE3` | +0x120 | 1 | 匹配 |
| 8 | `StatusSetter` | 8 | `0x8A6BF0` | `0x8A6A30` | -0x1C0 | 1 | 匹配 |
| 9 | `LocalPlayerPtr` | 8 | `0xB37D7A` | `0xB37D0A` | -0x70 | 1 | 匹配 |
| 10 | `OnSendNormalMove` | 9 | `0x62B680` | `0x62B770` | +0xF0 | 1 | 匹配 |
| 11 | `OnSendCombatMove` | 9 | `0x62B730` | `0x62B820` | +0xF0 | 1 | 匹配 |
| 12 | `ActorRadius` | 14 | `0x175728F` | `0x175720F` | -0x80 | 1 | 匹配 |
| 13 | `NativeTargetRingUpdate` | 14 | `0x7B5430` | `0x7B52D0` | -0x160 | 1 | 匹配 |
| 14 | `NoBackswing` | 15 | `0x8D6F30` | `0x8D6BE0` | -0x350 | 2 (首匹配有效) | 匹配 |
| 15 | `ActionMovementStart` | 16 | `0x1822510` | `0x1822530` | +0x20 | 1 | 匹配 |
| 16 | `SyncRecast` | 17 | `0x8EF260` | `0x8EEC20` | -0x640 | 1 | 匹配 |
| 17 | `CastStaticAddress` | 19 | `0x104F17` | `0x104FF7` | +0xE0 | 1 | 匹配 |
| 18 | `CastUpdate` | 19 | `0x8E00A0` | `0x8DFA60` | -0x640 | 1 | 匹配 |
| 19 | `SetScale` | 29 | `0x899720` | `0x899560` | -0x1C0 | 1 | 匹配 |
| 20 | `ZoneUp` | 36 | `0x1D718C0` | `0x1D72B00` | +0x1240 | 1 | 匹配 |
| 21 | `ZoneDown` | 36 | `0x1D71440` | `0x1D72680` | +0x1240 | 1 | 匹配 |
| 22 | `ReceiverSendPacket` | M4 | `0x1CFD140` | `0x1CFD120` | -0x20 | 1 | 匹配 |
| 23 | `ZoneClientSendPacket` | M4 | `0x1D03040` | `0x1D03020` | -0x20 | 1 | 匹配 |
---
## 2. 核心原生入口反汇编与结构偏移核实
对关键功能的原生反汇编指令和内存结构进行逐一反编译核验:
1. **M4 主动发包通道结构不变**:
- `ReceiverSendPacket`(`0x1CFD120`):依然检查 `*(nint*)(rcx + 0xA70)`(`ZoneClient` 指针),为空则直接返回 `0`;非空则调用 `ZoneClientSendPacket`。
- `ZoneClientSendPacket`(`0x1D03020`):依然检查 `*(nint*)(rcx + 0x98)`,调用底层网络发送函数 `ZoneUp`(`0x1D72B00`)。
- `ZoneUp`(`0x1D72B00`):发送数据缓冲区协议完全未变(`+0x00`: Opcode, `+0x08`: TotalSize, `+0x20`: Payload)。
2. **模块 36 原始收发包 Hook 结构不变**:
- `ZoneDown`(`0x1D72680`):检查 `*(nint*)(rcx + 0x88)`,下行载荷解包偏移完全一致。
3. **模块 8 状态屏蔽结构不变**:
- `StatusSetter`(`0x8A6A30`):汇编代码仍为 `83 FA 3C`(`cmp edx, 3Ch` 即 60 个状态栏槽位),槽位大小依然为 12 字节。
- `LocalPlayerPtr`(`0xB37D0A`):依然调用虚函数表 `+0x278`(`FF 90 78 02 00 00`),读取本地玩家。
4. **模块 2 最大加速度结构不变**:
- `AccelerationHook`(`0x182BB40`):依然核对偏移 `+0x20`、`+0x3C`、`+0x44` 与 owner `+0x3E0`。
---
## 3. 网络协议与 Opcode 变动核实
SE 在本次 `2026.10.06` 补丁中对 Opcode 编号进行了全量重排:
- `UP_PingReq`:旧版为 `838`(`0x346`),新版更新为 `137`(`0x89`)。
- `DOWN_PingRsp`:依然为 `338`(`0x152`)。
- 由于模块 36 属于通用二进制载荷抓取,无需等待所有 Opcode 逆向即可正常捕获和导出所有数据包。
- `XIVLauncher` 本地配置 `opcodes.json` 已追加 `2026.10.06.0000.0000` 节点,Ping 对齐功能可立即正常显示。
---
## 4. 双版本向后兼容设计(Dual-Version Support)
为确保过渡平滑与回滚安全,代码更新为支持双审计版本:
- 当前审计版本(`AuditedClientVersion`):`2026.10.06.0000.0000`
- 兼容基线版本(`BaselineClientVersion`):`2026.09.15.0000.0000`
- `IsAuditedVersion(v)` 同时认可两者,未在审计名单中的未知版本(如 `2026.99.99`)继续受 M0 严格门控保护。
---
## 5. 自动化验证与部署
1. **测试套件**:84/84 项单元测试全部一次性通过(涵盖双版本适配清单核验、门控行为、网络管线、M4 原生缓冲区分组、状态阻断等)。
2. **发布与备份**:
- 旧版本 `0.1.15` 已备份至 [`deploy-backups/0.1.15-before-0.1.16/`](file:///e:/SapphireServer/Dalamud%20Dev/IC.Rebuild/deploy-backups/0.1.15-before-0.1.16/)。
- 新版本 `0.1.16.0` 已部署至 `%APPDATA%\XIVLauncher\dev\ICRebuild`。