返回博客列表

Kenshi 随机种子修复:DLL 注入解决固定随机问题

一个针对《Kenshi》固定随机数种子问题的内存修复工具,通过 DLL 注入替换游戏运行时的随机数种子,实现每次开档的随机差异化。

#Game Dev#Reverse Engineering#C++#Kenshi#DLL Injection

问题背景

Kenshi 的 MOD 系统在不变更 MOD 列表时,每次新开游戏会产生相同的随机结果(如 NPC 位置、物品掉落等)。这是因为游戏使用了固定的随机数种子,导致玩家每次新开档都遇到完全相同的随机事件。

解决方案

本工具通过 DLL 注入替换游戏运行时的随机数种子,以实现每次开档的随机差异化。

技术实现

参考 RE_Kenshi FixRNG 的实现策略,通过 Hook MSVCR100 运行时库与游戏内函数来实现种子替换:

Hook 目标说明
srandMSVCR100 种子替换(时间戳或自定义值)
randTLS 切换真随机 / 确定性模式
randomIntBuilding::selectParts +0x113,整数随机
random (float)Building::selectParts +0x26D,浮点随机
getFoliageRotationRVA 0x6CB8A0,植被旋转随机

种子替换原理

// 使用时间戳替代固定种子
void srand_hook(unsigned int seed) {
    if (use_custom_seed) {
        original_srand(custom_seed_value);
    } else {
        // 使用当前时间戳作为种子
        original_srand((unsigned int)time(NULL));
    }
}

上述 5 个 Hook 均基于逆向工程得到的固定偏移地址实现。

使用方法

基本使用

  1. KenshiRNGFix.dll 和启动器放入 Kenshi 游戏目录
  2. 运行启动器,选择是否使用自定义种子
  3. 启动游戏,每次新开档都会产生不同的随机结果

自定义种子

如果需要复现特定的随机结果:

[RNG]
use_custom_seed=true
custom_seed=12345

使用相同种子可以复现一致的随机结果,便于测试和分享。

验证方法

  • 日志中出现 "Full RNG fix active (RE-style)" 表明全部 Hook 生效
  • 多次新开档后对比 NPC 位置与物品掉落可验证随机化效果
  • 启用 use_custom_seed 可在相同种子下复现一致的随机结果

局限性

本工具的 Hook 依赖于特定游戏版本的内存偏移:

  • 仅支持 Kenshi 1.0.64 版本
  • 游戏更新后可能需要重新适配偏移地址
  • 不保证与其他 DLL 注入工具的兼容性

与 RE_Kenshi 的关系

本工具的 Hook 策略参考了 RE_Kenshi FixRNG 的实现,但作为独立工具提供,不依赖 RE_Kenshi 框架。


相关链接


最后更新: 2026-03-17