rubinownz111/kanes-wrath-reverse-move-bug-fix
GitHub: rubinownz111/kanes-wrath-reverse-move-bug-fix
通过 dinput8.dll 代理和 Frida 脚本修复《凯恩之怒》1.03 版本中单位倒车移动相关的一系列逻辑和朝向 Bug。
Stars: 0 | Forks: 0
# Kane's Wrath 倒车 Bug 修复
[](https://github.com/rubinownz111/kanes-wrath-reverse-move-bug-fix/actions/workflows/build.yml)
为 **Command & Conquer 3: Kane's Wrath 1.03** 提供完整的、经用户验证的倒车修复。
此仓库包含:
- 最终的原生 `dinput8.dll` 代理,版本 14;
- 构建 DLL 所需的完整 C++ 源码和测试;
- 完整的最终 Frida 脚本,版本 89,包含所有导入的依赖项;
- 完整的逆向工程和根本原因 PDF 文档;
- 经过精确验证的二进制校验和。
最终修复涵盖了原有的滞后、自塌陷和错误方向故障,罕见的待定和有限唤醒路径状态,攻击期间的陈旧倒车状态,以及从倒车到前进的瞬间 180 度旋转问题。
## 重要兼容性边界
这些地址和 hook 专用于 **32 位 Kane's Wrath 1.03 游戏镜像**:
```
RetailExe\1.3\cnc3ep1_1.3.dat
```
`CNC3EP1.exe` 仅仅是启动器存根,不是补丁的目标。
DLL 会执行精确的字节和指针预检。如果可执行文件与支持的版本不匹配,游戏 hook 事务应拒绝安装,而不是应用部分补丁。
## 选择一种模式
使用以下任一方式:
1. 原生 DLL,推荐用于正常游戏;或
2. Frida v89 脚本,适用于诊断和源码级实验。
**切勿同时运行会修改状态的 Frida 脚本和 DLL。**
## 快速安装:已验证的 DLL
1. 完全关闭 Kane's Wrath。
2. 备份任何已存在的游戏目录下的 `dinput8.dll`。
3. 将 [`release/dinput8.dll`](release/dinput8.dll) 复制到:
\RetailExe\1.3\dinput8.dll
4. 重启游戏。
已验证的 DLL SHA256:
```
8F426B2562C84254F6B550CF4977BA1002EBE54A08CFE7DF3BDA8D213F0A3028
```
在 PowerShell 中验证:
```
Get-FileHash `
"C:\Program Files (x86)\Steam\steamapps\common\Command and Conquer 3 - Kane's Wrath\RetailExe\1.3\dinput8.dll" `
-Algorithm SHA256
```
生产构建特意没有要求弹出窗口。没有弹出窗口并不意味着 DLL 加载失败。
## 从源码构建 DLL
### 前置条件
- Windows 10 或 Windows 11;
- Visual Studio 2022,需安装 **使用 C++ 的桌面开发**;
- MSVC x86 工具链和 Windows SDK;
- CMake 3.15 或更高版本。
hook ABI 是 MSVC x86 专用的。特意拒绝 64 位构建、MinGW 构建或非 MSVC 构建。
### 配置、构建和测试
打开 **Developer PowerShell for VS 2022** 或 **x86 Native Tools Command Prompt**,切换到仓库根目录,然后运行:
```
cmake -S dll -B build `
-G "Visual Studio 17 2022" `
-A Win32 `
-DBUILD_TESTING=ON `
-DKW_SHOW_PATCH_POPUP=OFF
cmake --build build --config Release
ctest --test-dir build -C Release --output-on-failure
```
输出为:
```
build\bin\Release\dinput8.dll
```
检查构建:
```
Get-FileHash build\bin\Release\dinput8.dll -Algorithm SHA256
dumpbin /headers build\bin\Release\dinput8.dll | Select-String "machine"
dumpbin /exports build\bin\Release\dinput8.dll
dumpbin /imports build\bin\Release\dinput8.dll
```
预期属性:
- PE machine `0x014C`, x86;
- 导出 `DirectInput8Create`,序号 1;
- 生产导入仅限于 `KERNEL32.dll`;
- `reverse_move_logic_tests` 通过。
随附的 DLL 是使用 MSVC 19.44.35228.0 构建的,大小为 21,504 字节。即使源码相同,由于编译器或链接器元数据的差异,本地重新构建的哈希值可能会有所不同。
### 可选的本地 hook 弹窗
对于仅在完整 hook 事务成功后才报告的本地诊断构建:
```
cmake -S dll -B build-popup `
-G "Visual Studio 17 2022" `
-A Win32 `
-DBUILD_TESTING=ON `
-DKW_SHOW_PATCH_POPUP=ON
cmake --build build-popup --config Release
```
弹窗构建还会导入 `USER32.dll`。它不是哈希匹配的生产工件。
## 运行完整的 v89 Frida 脚本
最终脚本特意与其完整的依赖链一起发布:
```
apply_v89_attack_turn_rate_transition.py
-> apply_v88_forward_turn_rate_transition.py
-> apply_v87_forward_turn_rate_clamp.py
-> apply_v85_reverse_forward_animation_trace.py
-> apply_v84_v11_shadow_fix_trace.py
-> apply_v83_move0_pending_edge.py
-> ../tools/kw_live.py
```
安装 Python 依赖项:
```
py -m pip install -r scripts\requirements.txt
```
然后:
1. 关闭 Kane's Wrath。
2. 移除或重命名游戏目录下的 `RetailExe\1.3\dinput8.dll`,以免 DLL 和脚本混合。
3. 启动 Kane's Wrath 并进入一场比赛。
4. 运行:
py scripts\apply_v89_attack_turn_rate_transition.py
或者使用启动器:
```
powershell.exe -ExecutionPolicy Bypass -File scripts\run_v89.ps1 -StartGame
```
在脚本终端按 `Ctrl+C` 进行分离。日志会写在脚本旁边,并被 `.gitignore` 忽略。
如果 `OpenProcess` 或 Frida attach 失败,请使用与游戏相同的权限级别运行终端。某些系统可能需要管理员权限。
## 最终修复的作用
游戏逻辑修复:
- 在 `MoveToGroupOrder+0x2A` 处记录每个单位精确的倒车意图;
- 要求从 `ThingTemplate+0x138 bit 9` 获取原版倒车能力;
- 将对象/命令/生成 token 传递给下层请求门;
- 仅修复已证实的无路径待定或有限唤醒状态;
- 在 `0x006AA7C1` 处调用原版请求提交,随后可选地在 `0x006AA9D6` 处调用原版步行者轮询;
- 仅在强跟随者接管或明确的更新非倒车指令时才废弃 token;
- 仅在正常的 MoveTo 和 AttackObject 原版执行周围清除 `REV_BIT`;
- 在各自已证实的独立边界处处理强制开火地面和强制攻击对象;
- 在每次潜在的、可重入的原版调用之后重新验证生成。
朝向修复:
- 仅捕获确切的倒车转前进或倒车转 AttackObject 的转换;
- 在 `0x00634E02` 处调用原版动态最大转向率获取器;
- 仅在确切的动机后调用 `0x006AFC1D -> 0x00441E55` 处钳制带符号角度;
- 持续生效直到收敛、移动器替换、更新的指令、64 帧或 48 次钳制调用;
- 绝不改变目的地、路径、速度、平移或转向符号。
## 仓库布局
```
dll/ Complete v14 C++ source, CMake project, and tests
scripts/ Complete v89 Frida script dependency chain
tools/kw_live.py Minimal process/memory helper required by v83
release/dinput8.dll Exact validated native DLL
docs/*.pdf Complete root-cause and implementation guide
.github/workflows/ Windows x86 build and test workflow
```
## 完整技术指南
阅读 [`docs/Kanes_Wrath_Reverse_Move_Bug_Complete_Guide.pdf`](docs/Kanes_Wrath_Reverse_Move_Bug_Complete_Guide.pdf) 了解:
- 完整的 UI 到移动器地址链;
- 经运行时证实的根本原因;
- 每个边缘案例及其捕获的状态;
- v1-v89 调查时间线;
- 失败的方法和崩溃证据;
- 所有对象、命令、跟随者和移动器偏移量;
- 最终算法伪代码;
- hook 事务安全性和验证。
## 最终验证
最终的原生工件经验证为:
- x86 / PE machine `0x014C`;
- `DirectInput8Create` 序号 1;
- 在运行中的游戏内可见完整的 hook 事务;
- 包含访问器调用保持原版;
- 确切的动机后转向 hook 激活;
- 原生测试通过;
- 用户不再能够复现倒车、攻击、强制开火、滞后、错误方向或瞬间旋转故障。
## 故障排除
### 游戏未运行!
脚本会 attach 到 `cnc3ep1.dat` 或 `cnc3ep1_1.3.dat`。在运行 v89 之前,请启动实际游戏并进入一场比赛。
### DLL 似乎未生效
确认 DLL 与游戏 `.dat` 文件位于同一目录,而不是仅仅在启动器旁边。复制后请完全重启 Kane's Wrath。验证游戏版本是否为 1.03。
### 在 DLL 存在时脚本拒绝启动
这是有意为之。请重命名或移除游戏目录下的 `dinput8.dll`,重启游戏,然后使用脚本。
### 使用了不同的可执行文件版本
不要削弱预检。在尝试移植之前,请为该确切版本重新推导地址和预期字节。
## 免责声明
这是一个独立的社区逆向工程和兼容性项目。它不隶属于 Electronic Arts,也未获得其认可。不包含任何游戏可执行文件、游戏资产或受版权保护的游戏数据。请仅在合法获取的 Kane's Wrath 副本上使用,并自行承担风险。
标签:Bash脚本, Bug修复, C++, Windows, 云资产清单, 动态链接库, 数据擦除, 游戏, 游戏模组, 逆向工具, 逆向工程