[DSP]ver 0.9.24.11271

发布于 2022-02-06  4.36k 次阅读


0x00 前言

眼看到了春节假期的最后一天,花了几天时间把死亡搁浅全成就之后再度进入贤者模式,感觉无游可玩...思来想去,还是把DSP下了回来,毕竟又是机甲又是硬核建造,是个男人都会爱上的罢(

游戏自ver 0.8.22.8915之后新增了100条成就,同时也新增了异常数据检测功能, 数据异常不能开启成就检测并且无法上传银河系数据(如凭空多出物品、凭空解锁科技、游戏数值更改等异常) 。对于我这种不安分的人来说,怎么才能在“合理”增强游戏体验的同时不影响跳成就呢?让我们花点时间来一探究竟

0x01 查找异常数据检测逻辑

使用steam浏览游戏本地文件,进入到Dyson Sphere Program\DSPGAME_Data\Managed中,找到了熟悉的Assembly-CSharp.dll,可见DSP是一款基于Unity构建的游戏,同时使用了Mono框架。使用dnSpy查看逻辑,搜索关键词normal,可以找到关键方法GameAbnormalityData. IsGameNormal()

为了屏蔽掉数据检测功能,只要让IsGameNormal()始终返回true即可

0x02 编写BepInEx插件

BepInEx,全称Bepis Injector Extensible,是一款适用于 Unity Mono、IL2CPP和 .NET框架(XNA,FNA,MonoGame,etc.)游戏的插件框架。本次我们通过编写一个BepInEx Plugin来修改DSP的游戏逻辑

1.准备开发环境

配置VS2019(安装.NET桌面开发)、下载BepInEx最新版本并释放到DSP根目录,并运行一次游戏,使BepInEx完成初始化,生成config、plugins等文件夹及cfg配置文件

2.新建项目

VS2019中新建一个类库(.NET Framework)项目,框架选择.NET Framework 4.7.2,添加下列引用:

1.0Harmony20.dll //HarmonyX Pacth base
2.BepInEx.dll
3.Assembly-CSharp.dll //Dyson Sphere Program\DSPGAME_Data\Managed\Assembly-CSharp.dll
4.UnityEngine.dll
5.UnityEngine.CoreModule.dll
3.基于模板开始编写

我们给默认的Class1修改一个我们想要的名字,我这里改为DSPPlugin,然后将BepInEx的命名空间using一下。

BepInEx中,给我们准备了一个类BaseUnityPlugin,这是继承于MonoBehaviour的,也就是说BepInEx Plugin最终会以组件的形式挂载。这里我们以官方wiki - Creating a new plugin project中所给出的模板为基础, 将DSPPlugin继承BaseUnityPlugin,并在类上方添加了一个名为BepInPlugin的特性,这是必须要完成的,只有这样才能正确加载插件

using BepInEx;

namespace DSPPlugin
{
    //插件描述特性 分别为 插件ID 插件名字 插件版本(必须为数字)
    [BepInPlugin("cn.floeice.DSPPlugin", "EnableAchievements Plugin", "1.0")]
    public class DSPPlugin : BaseUnityPlugin
    {
        //Unity的Start生命周期
        void Start()
        {
            Logger.LogInfo("Hello World!");
        }
    }
}
4.使用Harmony进行Prefix

参考:HarmonyX Wiki - HarmonyX prefix behaviour

Prefix,即前置补丁,是在补丁目标运行之前运行的,同时我们可以选择是否执行原方法。此处我们的目标就是使IsGameNormal()始终返回true,且不执行原方法。写法如下:

using HarmonyLib;

public class GameAbnormalityCheckPatch
{
    [HarmonyPrefix]
    [HarmonyPatch(typeof(GameAbnormalityData), "IsGameNormal")]
    public static bool IsGameNormal(ref bool __result)
    {
        __result = true;
        return false; //拦截原方法,直接使用我们给出的结果
    }
}

同时在Start()中加上下述代码以实现自动Patch

Harmony.CreateAndPatchAll(typeof(GameAbnormalityCheckPatch));
5.生成并使用插件

选择生成->生成 DSPPlugin ,待生成完毕后,打开输出目录,将生成的DSPPlugin.dll复制到我们的BepInEx/plugins目录下:

运行游戏,插件将自动加载

0x03 功能测试

以成就-死星计划为例:

首先新开一档,然后配合Multifunction Mod无限物品+一键铺满地基,很快,游戏里跳了成就:

稍作等待后,Steam也同步跳了成就:

证明插件有效,成功屏蔽了异常数据检测功能

0x04 参考

1. Unity游戏Mod/插件制作教程

2.Acceyuriko/DSPYurikoPlugin