现有的过验证思路很简单粗暴,既然SPT启动器只是验证注册表项存不存在,对应的文件存不存在,那我们就创建那几个文件出来,找个位置放,然后写到注册表里就好了。
于是我们的过验证工具,在硬盘上释放了一堆空文件,还写了条注册表。要说“危害”是没有什么,但是总觉得不够“优雅”。再说了释放文件又写注册表的,遇到一些比较笨的杀毒软件就报毒了。
那我们换个思路,在启动器本身下手不就好了,反正是开源的……但是我就为了玩个游戏,还要装.NET SDK,一更新还要重新拉源码编译,麻烦得很啊。
那就修补已有的启动器就好了。
以4.0.1的启动器为例,反正验证函数已经几百年没更新过了,在以后的版本大概率也是完全不会动。
众所周知,SPT的启动器是一个基于.NET 9的程序,在较早的版本中(4.0.0 以前)基于.NET的更早版本。
但它们的原理都是相同的。启动程序时,CLR会接管执行,然后通过JIT编译器,把IL转换成本机机器码。
而我们的修补则从IL入手。
我们首先利用ILSpy工具找到验证函数的代码,它在这里(同样的源码已经由SPT团队开源,可以看到几乎一致)
那关键部分已经很明确了,我们只要让它的返回值始终为真就好了。也就是最后一句
return num == 0;
接着我们切换到IL视图,得到了这样的IL代码
它所对应的字节码就是
07 16 FE 01 2A
我们修补的关键在于 07 和 16 这两个字节
在IL代码中,它们分别代表 ldloc.1 (加载局部变量1)和 ldc.i4.0(压入常量 0),它们组成了相等判断的两项.
如果我们改为
16 16 FE 01 2A
显然,0==0始终为真。函数也会始终返回真
同理的,改为
07 07 FE 01 2A
一样是始终返回真,一样能实现我们的需求。
也就是我们只需要修改一个字节,就好了。
那么我们怎么找到要修改的字节序列的位置呢?
拖进HxD,直接搜索07 16 FE 01 2A我们会得到至少4个结果
那我们往上看一看IL代码,还有一句leave.s IL_00d4,对应的字节码是 DE 00
那就简单了,DE 00 07 16 FE 01 2A那条就是我们要找的字节序列
试验一下,把为了过验证丢的文件和写的注册表项都删了,启动启动器,启动游戏,果然报错
然后打开HxD,改一个字节,保存
再启动启动器,启动游戏,和预期一样,没有出现任何报错,启动器自动最小化,游戏成功启动
同样的方法我已经放到最新版本的SPT Fuyu实现自动化执行了,感兴趣的可以看一看


















NB,现在才知道过验证是这样的。
就很强,赞一个!
6