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 修复 [![构建 DLL](https://static.pigsec.cn/wp-content/uploads/repos/cas/dd/ddb9abe7890c1198ac37caee5a7de988236d30c6543365e9c1390f37dcb120e7.svg)](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, 云资产清单, 动态链接库, 数据擦除, 游戏, 游戏模组, 逆向工具, 逆向工程