• 注册
  • 安装教程 安装教程 关注:1779 内容:78

    仅修改一个字节过SPT启动器正版验证的思路

  • 查看作者
  • 打赏作者
  • 11
  • 安装教程
  • 初来乍到

    现有的过验证思路很简单粗暴,既然SPT启动器只是验证注册表项存不存在,对应的文件存不存在,那我们就创建那几个文件出来,找个位置放,然后写到注册表里就好了。

    于是我们的过验证工具,在硬盘上释放了一堆空文件,还写了条注册表。要说“危害”是没有什么,但是总觉得不够“优雅”。再说了释放文件又写注册表的,遇到一些比较笨的杀毒软件就报毒了。

    仅修改一个字节过SPT启动器正版验证的思路

    那我们换个思路,在启动器本身下手不就好了,反正是开源的……但是我就为了玩个游戏,还要装.NET SDK,一更新还要重新拉源码编译,麻烦得很啊。

    那就修补已有的启动器就好了。

    以4.0.1的启动器为例,反正验证函数已经几百年没更新过了,在以后的版本大概率也是完全不会动。


    众所周知,SPT的启动器是一个基于.NET 9的程序,在较早的版本中(4.0.0 以前)基于.NET的更早版本。

    但它们的原理都是相同的。启动程序时,CLR会接管执行,然后通过JIT编译器,把IL转换成本机机器码。

    而我们的修补则从IL入手。

    我们首先利用ILSpy工具找到验证函数的代码,它在这里(同样的源码已经由SPT团队开源,可以看到几乎一致)

    仅修改一个字节过SPT启动器正版验证的思路

    那关键部分已经很明确了,我们只要让它的返回值始终为真就好了。也就是最后一句

    return num == 0;

    接着我们切换到IL视图,得到了这样的IL代码

    仅修改一个字节过SPT启动器正版验证的思路

    它所对应的字节码就是

    07
    16
    FE 01
    2A

    我们修补的关键在于 07 和 16 这两个字节

    在IL代码中,它们分别代表 ldloc.1 (加载局部变量1)和 ldc.i4.0(压入常量 0),它们组成了相等判断的两项.

    如果我们改为

    16
    16
    FE 01
    2A

    仅修改一个字节过SPT启动器正版验证的思路

    显然,0==0始终为真。函数也会始终返回真

    同理的,改为

    07
    07
    FE 01
    2A

    仅修改一个字节过SPT启动器正版验证的思路

    一样是始终返回真,一样能实现我们的需求。

    也就是我们只需要修改一个字节,就好了。


    那么我们怎么找到要修改的字节序列的位置呢?

    拖进HxD,直接搜索07 16 FE 01 2A我们会得到至少4个结果

    仅修改一个字节过SPT启动器正版验证的思路

    那我们往上看一看IL代码,还有一句leave.s IL_00d4,对应的字节码是 DE 00

    仅修改一个字节过SPT启动器正版验证的思路

    那就简单了,DE 00 07 16 FE 01 2A那条就是我们要找的字节序列


    试验一下,把为了过验证丢的文件和写的注册表项都删了,启动启动器,启动游戏,果然报错

    仅修改一个字节过SPT启动器正版验证的思路

    然后打开HxD,改一个字节,保存

    仅修改一个字节过SPT启动器正版验证的思路

    再启动启动器,启动游戏,和预期一样,没有出现任何报错,启动器自动最小化,游戏成功启动

    仅修改一个字节过SPT启动器正版验证的思路


    同样的方法我已经放到最新版本的SPT Fuyu实现自动化执行了,感兴趣的可以看一看

    初窥堂奥

    NB,现在才知道过验证是这样的。


    回复
    炉火纯青
    2021

    就很强,赞一个!

    回复
    初来乍到

    6

    回复

    是否还要验证一下,spt更新小版本后,是否需要重新修改启动器文件,比如4.0.1更新到4.0.2,或者4.0到4.1

  • ukia因为是在启动器本身动手,所以每次更新只要更换启动器是肯定要再修补一次的
    拉黑 3星期前 电脑端回复
  • 回复
    初来乍到

    请问大佬这样子过验证除了方便会不会跟原来的spt管理器有其他方面的不同啊

  • ukia我们实际只动了启动器在正版验证逻辑中的部分,理论上对其它部分是没有影响的。而且spt的启动器也不会加密和自校验(毕竟已经是开源了的),所以实测是没有什么影响。
    拉黑 3星期前 电脑端回复
  • 回复
    登堂入室
    打赏了1金币
    回复
    登堂入室

    不如下载源码直接改了 [s-52]

  • ukia拉源码编译也麻烦嘛,哪怕用ILSpy直接patch,也还要多一个工具多好几步操作。最后简化成搜索“DE 00 07 16 FE 01 2A”然后改一个字节,在原理上可靠,在自动化上制作程序的逻辑也比用Harmony hook和做一整套IL代码解析函数去找到Validate方法要简单了。不是有句话说:“人们要的不是一个四分之一英寸的钻头,而是一个四分之一英寸的孔。"嘛。把为了达到目的所需要的开销降到最低就对了。
    拉黑 3星期前 电脑端回复
  • 回复
    初来乍到

    弹了个啥啥已修改,列举操作可能无法执行,不知道是啥意思,我给SPT重新装了一下


    回复

    请登录之后再进行评论

    登录
    离线版教程
  • 今日 0
  • 内容 1043
  • 关注 1779
  • 聊天
    关注 16

    【招募】GRIFFIN TKF项目开工 期待你的加入 || 你是否想加入格里芬书写自己与人形的故事

    捐助我们

    • 微信
    • 支付宝
  • 签到
  • 任务
  • 发布
  • 模式切换
  • 偏好设置
  • 帖子间隔 侧栏位置: