使用WinHex切割二进制数据绕过部分Gal正版验证的方法

实用技术gal破解软电池
浏览数 - 1770发布于 - 2024-04-29 - 04:42

文章转自b站大佬@Dir-A图文“[Gal运行入门]#5 软电池 Sdwrap 过法总结”,原贴地址:https://www.bilibili.com/read/cv13788386/

Sdwrap又称软电池(ソフト電池),是一种Galgames 常见的认证方式。
Sdwrap本质上就是【Sdwrap认证exe+游戏真实exe】构成的,所以你会发现它有两个PE头

1.avif

如果要去掉软电池是比较简单的,只要把前面软电池认证那一节删了就行了
但是很多带Sdwrap认证的游戏,都会在游戏的主程序里进行检测,Sdwrap是否运行/存在。
所以这个就是一个难点,也就说,并不是所有的Sdwrap都只删了认证的那个exe部分就行了。

以下我给大家总结常见的几种Sdwrap的认证方式。

#0x0 有弹窗无验证,Sdwrap分离。

2.avif

在这个游戏中的软电池验证是我见过最奇葩的,不过也揭示了软电池本来的样子

第一个exe,大小为376kb,这个就是软电池的验证程序
第二个exe,大小为3640kb,这个是游戏的真实exe。

也可以注意到第二exe是被隐藏的,也就是说用户一般只能看到第一个exe
当用户点击第一个exe后打开一个软电池认证窗口

3.avif

当用户通过验证后,软电池程序就会去启动第二个exe,从而进入游戏

当然了,你如果聪明点,打开显示隐藏文件,直接就能看到第二个exe
从而直接启动这个exe进入游戏,也就相当于越过了软电池认证。

4.avif

当然这种情况的软电池特别少见,更多见的是下面介绍的这几种。

#0x1 有弹窗无验证,Sdwrap合并
我们来看下只有一个exe的,并且合并了Sdwrap,有弹窗提示的情况

5.avif

对于这种情况,我们只需要分离两个exe即可。
之前应该也说过,exe有PE结构,而PE结构的文件有PE头
我们可以依据PE头的二进制数据进行分割
当然我们并不需要得到软电池部分的exe,我们只需要得到游戏真实exe即可。
所以我们可以采用十六进制编辑器直接删除第二个PE头之前的数据
这样也就得到了我们需要的exe(游戏真实exe)

首先用winhex载入exe
并搜索十六进制 4D5A90

6.avif

确定后按下f3搜索下一个,一般只有两个结果。

7.avif

观察offset的值,我们可以看到此时已经来到了第二个PE头。转者注:若十六进制搜索4D5A90只有一个结果,可查找文字“MZ”并在给出结果的二进制码中逐条定位,同时对比右侧代码栏内容,直到找到第二个PE头为止。
接着我们用winhex定义块的功能,进行选中第二个PE头之前的数据并按下delete删除

先用鼠标选中一小段

8.avif

选择定义块功能

9.avif

把beginning改为0,即选中了第二个PE头之前的数据。
选中后按下delete键,或上图中的remove选项,接着弹出窗点确定即可。

10.avif

完成后单击保存,或 选 文件选项 中的另存为。

11.avif

运行修改后的文件即可进入游戏(此处为游戏首次打开的窗口/全屏选择)

12.avif

#0x2 无弹窗无验证,Sdwrap合并
有些软电池,双击后无任何反应,转区也如此,这时的处理和上面是一样的。

13.avif

你搜索PE头任然能搜到两个
这边说一下判断是否为软电池的方法

用winhex载入,按下ctrl+f,选择ANSCII搜索sdwrap,如果有结果,说明就是软电池。

14.webp

15.avif

接下来同上述处理即可。

16.avif

#0x3 有弹窗有验证,合并Sdwrap(Silky's)
正常软电池弹窗,说明有软电池,先通过上述方法搜索PE头去掉软电池即可。

17.avif

去掉软电池后出现另外和软电池有关的弹窗,这个为游戏exe内的验证。

18.avif

这种验证稍微复杂一点,不同引擎的游戏可能不一样,不过目前我也只发现了
Silky's引擎和真剣で私に恋しなさい这个系列有这种阴间验证
剣で私に恋しなさい不仅验证软电池存在,还会验证exe的完整性,这个需要通过内存补丁的方式来过比较好,不过这个很少见,而且内存补丁,我们这个教程也没教过,这里就不说了。

下面谈一下Silky's的过法。
用x64dbg载入后断下messagebox

19.avif

停在messagebox后按f8,每次通过ret后观察是否存在CreateEventw,

20.avif

21.avif

来到CreateEventW这个地方后往上翻,可以看到好几个条件跳转,这些就是关键的跳转
很具体的判断关键跳转的方法说起来有点麻烦,我们用一个不是很科学的方法来判断

从CreateEventW开始往上数,找到4个很长的条件跳转
那么什么是很长的条件跳转呢
简单来说就是x64dbg汇编窗口最上面到最下面都包含不下的
比如像这个就不算很长,一个窗口内都能看到跳转的目标

22.avif

再往上找,你能看到几个很长的跳转

23.avif

这几个跳转其实都指向了一个区域

24.avif

这个区域在CreateEventW下面

我们的目标是让这几个跳转不要跑下来
也就是说,有哪个跳转实现了,我们就需要nop掉。

给那几个跳转下断点,并disable掉messagebox
重新运行程序后来到刚刚下断点的地方

25.avif

运行后可以发现第一个je不跳,第二个je不跳,第三个跳,先nop掉,第四个跳,nop掉

26.avif

然后继续运行游戏即可进入

27.avif

一些时候Silky's的可能会遇到这种问题

28.avif

这个是路径问题,把路径全部换成英文即可。

当然还有个CreateEventA的玩意,这玩意是差不多的
来到CreateEventA的区域后往上4个条件跳转都打上断点
然后重新运行,不要disable掉messagebox
然后运行的时候,你会发现其中一个跳转没触发,跑进一个call后就触发messagebox了
那个跳转改成强制跳转即可

29.avif

30.avif

如果你实在不会,就CreateEventA/W往上数条件跳转,十个以内,总能对。

#0x4 有提示无验证,Sdwrap合并,入口点缺损。
这种算是比较阴间的

31.avif

还是和通常的软电池一样,去掉软电池部分,然后你会发现,运行后无任何反应
这种玩意在oep处改了些东西

32.avif

至于如何修复这部分玩意,有个比较简单的方法,
就是你找一个正版,或者已经运行起来的,这个懂的都懂
或者可以利用体验版/同引擎的版本也可以。
然后用x64dbg附加上去,来到oep处,把损坏的部分修完就ok了

#0x5 无提示有认证,无Sdwrap(写在游戏脚本中)
这种也是一个奇葩东西,是通过直接把软电池的认证写在游戏脚本里实现的
目前我只见过Artemis引擎的,这个谈一下,其实有点和老的krkr引擎alpharom认证差不多。

33.avif

首先我们先把脚本提取出来

34.avif

然后放入游戏目录下,这个讲Artemis引擎汉化的时候说过了

然后刚刚我们观察到script.ini里写了软电池的认证信息,
说明等下软电池认证的时候就会去调用这个文件

把system文件夹丢进Sublime,然后全局搜索 script.ini

35.avif

36.avif

然后可以看到有两个lua脚本去调用了这个玩意
如果你搞不懂哪个lua脚本才是验证的,直接两个都修改
把验证部分去掉就行了
这里是auth.lua
把其中这一堆删了就ok了

37.avif

然后可以把不必要的文件都删了
双击exe运行就进去了

38.avif

#1

我見過最多是,雙擊打開驗證後會生成一個xxx.log的文件。可以通過改文件權限防止這個文件被主程序刪掉。後綴名改成.exe之後可以運行,應該就是原本的執行文件。感覺是文中#0x1的情況,前面有個大約290KB的頭。沒辦法驗證的話,自己把頭刪除掉應該就好。

2024-04-29 - 07:02
listder
listder

1687

#2

写的好详细,支持

2024-04-30 - 16:30
#3

牛逼

2025-05-14 - 13:15
kohaku