SimHub 智能自适应激活器 v1.0.0 发布与使用指南

SimHub 是一款广泛应用于模拟赛车(如《神力科莎》、《F1》等)的仪表盘、外设及震动板控制软件。本文介绍的 SimHub Auto Activator 工具基于 Mono.Cecil 内存动态 IL 修改技术,实现了对最新版授权逻辑的自动化热补丁,原生支持 Base 基础版Motion 动感版 功能。

软件下载


核心特性

  • 动态内存热补丁:自动提取主程序清单嵌入资源中的原生 SimHub.Licensing.dll,在内存中完成 MSIL 指令修改后重新打包写回,完全避免了替换旧版 Mock DLL 带来的接口缺失与崩溃风险。
  • 构造函数防护:安全清空 LicenceInfo 类构造函数主体并注入基类 System.Object 默认构造函数调用,规避混淆保护下私有字段未初始化引发的 NullReferenceException 异常。
  • 自适应寻路算法:优先通过 Windows 注册表 SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\SimHub_is1 获取安装路径,并集成了默认安装路径与运行目录的多级回退策略。
  • 静默无感启动:基于 PowerShell 与 VBScript 混合驱动,仅在软件版本升级或时间戳变动时请求一次管理员提权(UAC)以刷新补丁和 NGEN 缓存,日常启动无任何弹窗打扰。

项目结构与文件说明

  • ReplaceResource/:基于 Mono.Cecil 实现 IL 注入与资源重封包的 C# 源代码项目。
  • ReplaceResource.exe:编译就绪的 Release 可执行二进制工具。
  • SimHubLauncher.ps1 / SimHubLauncher.vbs:版本差异检测与静默热补丁启动器。
  • activate_simhub.bat:自动化部署、注册表寻路与桌面快捷方式生成脚本。

依赖库说明

项目直接引入了 Mono.Cecil 官方套件,允许在无需 C# 源码的前提下在 MSIL 中间语言层面对 .NET 程序集进行反编译与二进制重构:

  • Mono.Cecil.dll:核心元数据读写库,负责解析程序集结构、指令集与写回磁盘。
  • Mono.Cecil.Rocks.dll:扩展工具库,简化对泛型类型(如 List<T>)的动态构造与方法体扩展。
  • Mono.Cecil.Pdb.dll / Mono.Cecil.Mdb.dll:Windows PDB 与 Mono MDB 调试符号维护支持。

安装与使用步骤

  1. 下载 SimHub_Auto_Activator_v1.0.0.zip 并解压至任意临时目录。
  2. 右键 activate_simhub.bat 选择 “以管理员身份运行”
  3. 脚本会自动读取注册表定位 SimHub 根目录、部署启动器并应用初次热补丁,同时在桌面创建 SimHub (Auto Activated) 快捷方式。
  4. 日常启动:双击桌面上的 SimHub (Auto Activated) 快捷方式即可启动。

实现原理

根据 ReplaceResource 模块的 C# 源码实现,核心热补丁流程分为以下四个阶段:

1. WoteverCommon.dll 签名校验劫持

工具使用 Mono.Cecil 扫描 WoteverCommon.AssemblyHelper 类,定位到 RSACryptoServiceProvider::VerifyData 公钥签名校验方法:

1
2
3
4
5
6
7
// 查找 VerifyData 验证调用后的条件跳转指令
if (instr.OpCode == OpCodes.Callvirt &&
instr.Operand.ToString().Contains("RSACryptoServiceProvider::VerifyData"))
{
var nextInstr = instructions[i + 1];
nextInstr.OpCode = OpCodes.Br_S; // 将条件短跳转 Brtrue_S 改为无条件短跳转 Br_S
}

将紧随其后的条件短跳转 Brtrue_S 劫持为无条件短跳转 Br_S,跳过底层强签名合法性校验。

2. 嵌入式 Licensing.dll 内存抽取与 MSIL 重构

SimHubWPF.exe 主程序将官方授权逻辑储存在名为 SimHubWPF.Resources.SimHub.Licensing.dll 的嵌入资源(EmbeddedResource)中。补丁工具在内存中对其进行提取与重构:

1
2
3
4
5
6
7
8
9
10
11
12
// 1. 清空 LicenceInfo 构造函数
var licenceInfoCtor = licenceInfoType.Methods.FirstOrDefault(m => m.Name == ".ctor");
licenceInfoCtor.Body.Instructions.Clear();
var il = licenceInfoCtor.Body.GetILProcessor();
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Call, module.ImportReference(typeof(object).GetConstructor(Type.EmptyTypes)));
il.Emit(OpCodes.Ret);

// 2. 强制授权状态返回 true
forceBoolMethod(globalManagerType, "get_HasBaseLicense", true);
forceBoolMethod(globalManagerType, "HasActiveMotionLicence", true);
forceBoolMethod(globalManagerType, "HasMotionLicence", true);

重写 get_Featuresget_FeaturesNames 返回同时包含 BaseMotion 授权的 List 集合,最后将修改后的字节数组重新封包为 EmbeddedResource 塞回主程序,并抹除对 SimHub.Licensing 的强签名依赖。

3. 主程序授权检测点劫持

SimHubWPF.exe 模块中动态注入恒真辅助静态方法 SimHubWPF.IgnoreMarker.GetTrue()

1
2
3
4
5
6
7
var getTrueMethod = new MethodDefinition(
"GetTrue",
MethodAttributes.Public | MethodAttributes.Static,
module.TypeSystem.Boolean
);
ilProc.Emit(OpCodes.Ldc_I4_1); // 加载 int 1 (true)
ilProc.Emit(OpCodes.Ret); // 返回

随后遍历主程序全量类与方法,扫描对 GlobalLicenseManager 授权校验属性(如 get_HasBaseLicense)的 15 处 调用位置,统一替换为对 GetTrue() 的静态 call 指令。

4. NGEN 原生映像缓存清理

在 Windows 平台中,.NET CLR 运行时会优先优先加载全局 C:\Windows\assembly\NativeImages_* 缓存中的原生映像(NGEN)。为了防止运行时 bypass 物理修改后的二进制文件,补丁更新后会自动调用 ngen.exe 清理缓存:

1
ngen.exe uninstall "C:\Program Files (x86)\SimHub\SimHubWPF.exe"

免责声明

本项目仅用于逆向工程与 .NET IL 字节码注入技术交流,请支持正版软件。