文章转自b站大佬@Dir-A图文“[Gal运行入门]#5 软电池 Sdwrap 过法总结”,原贴地址:https://www.bilibili.com/read/cv13788386/
Sdwrap又称软电池(ソフト電池),是一种Galgames 常见的认证方式。
Sdwrap本质上就是【Sdwrap认证exe+游戏真实exe】构成的,所以你会发现它有两个PE头
如果要去掉软电池是比较简单的,只要把前面软电池认证那一节删了就行了
但是很多带Sdwrap认证的游戏,都会在游戏的主程序里进行检测,Sdwrap是否运行/存在。
所以这个就是一个难点,也就说,并不是所有的Sdwrap都只删了认证的那个exe部分就行了。
以下我给大家总结常见的几种Sdwrap的认证方式。
#0x0 有弹窗无验证,Sdwrap分离。
在这个游戏中的软电池验证是我见过最奇葩的,不过也揭示了软电池本来的样子
第一个exe,大小为376kb,这个就是软电池的验证程序
第二个exe,大小为3640kb,这个是游戏的真实exe。
也可以注意到第二exe是被隐藏的,也就是说用户一般只能看到第一个exe
当用户点击第一个exe后打开一个软电池认证窗口
当用户通过验证后,软电池程序就会去启动第二个exe,从而进入游戏
当然了,你如果聪明点,打开显示隐藏文件,直接就能看到第二个exe
从而直接启动这个exe进入游戏,也就相当于越过了软电池认证。
当然这种情况的软电池特别少见,更多见的是下面介绍的这几种。
#0x1 有弹窗无验证,Sdwrap合并
我们来看下只有一个exe的,并且合并了Sdwrap,有弹窗提示的情况
对于这种情况,我们只需要分离两个exe即可。
之前应该也说过,exe有PE结构,而PE结构的文件有PE头
我们可以依据PE头的二进制数据进行分割
当然我们并不需要得到软电池部分的exe,我们只需要得到游戏真实exe即可。
所以我们可以采用十六进制编辑器直接删除第二个PE头之前的数据
这样也就得到了我们需要的exe(游戏真实exe)
首先用winhex载入exe
并搜索十六进制 4D5A90
确定后按下f3搜索下一个,一般只有两个结果。
观察offset的值,我们可以看到此时已经来到了第二个PE头。转者注:若十六进制搜索4D5A90只有一个结果,可查找文字“MZ”并在给出结果的二进制码中逐条定位,同时对比右侧代码栏内容,直到找到第二个PE头为止。
接着我们用winhex定义块的功能,进行选中第二个PE头之前的数据并按下delete删除
先用鼠标选中一小段
选择定义块功能
把beginning改为0,即选中了第二个PE头之前的数据。
选中后按下delete键,或上图中的remove选项,接着弹出窗点确定即可。
完成后单击保存,或 选 文件选项 中的另存为。
运行修改后的文件即可进入游戏(此处为游戏首次打开的窗口/全屏选择)
#0x2 无弹窗无验证,Sdwrap合并
有些软电池,双击后无任何反应,转区也如此,这时的处理和上面是一样的。
你搜索PE头任然能搜到两个
这边说一下判断是否为软电池的方法
用winhex载入,按下ctrl+f,选择ANSCII搜索sdwrap,如果有结果,说明就是软电池。
接下来同上述处理即可。
#0x3 有弹窗有验证,合并Sdwrap(Silky's)
正常软电池弹窗,说明有软电池,先通过上述方法搜索PE头去掉软电池即可。
去掉软电池后出现另外和软电池有关的弹窗,这个为游戏exe内的验证。
这种验证稍微复杂一点,不同引擎的游戏可能不一样,不过目前我也只发现了
Silky's引擎和真剣で私に恋しなさい这个系列有这种阴间验证
剣で私に恋しなさい不仅验证软电池存在,还会验证exe的完整性,这个需要通过内存补丁的方式来过比较好,不过这个很少见,而且内存补丁,我们这个教程也没教过,这里就不说了。
下面谈一下Silky's的过法。
用x64dbg载入后断下messagebox
停在messagebox后按f8,每次通过ret后观察是否存在CreateEventw,
来到CreateEventW这个地方后往上翻,可以看到好几个条件跳转,这些就是关键的跳转
很具体的判断关键跳转的方法说起来有点麻烦,我们用一个不是很科学的方法来判断
从CreateEventW开始往上数,找到4个很长的条件跳转
那么什么是很长的条件跳转呢
简单来说就是x64dbg汇编窗口最上面到最下面都包含不下的
比如像这个就不算很长,一个窗口内都能看到跳转的目标
再往上找,你能看到几个很长的跳转
这几个跳转其实都指向了一个区域
这个区域在CreateEventW下面
我们的目标是让这几个跳转不要跑下来
也就是说,有哪个跳转实现了,我们就需要nop掉。
给那几个跳转下断点,并disable掉messagebox
重新运行程序后来到刚刚下断点的地方
运行后可以发现第一个je不跳,第二个je不跳,第三个跳,先nop掉,第四个跳,nop掉
然后继续运行游戏即可进入
一些时候Silky's的可能会遇到这种问题
这个是路径问题,把路径全部换成英文即可。
当然还有个CreateEventA的玩意,这玩意是差不多的
来到CreateEventA的区域后往上4个条件跳转都打上断点
然后重新运行,不要disable掉messagebox
然后运行的时候,你会发现其中一个跳转没触发,跑进一个call后就触发messagebox了
那个跳转改成强制跳转即可
如果你实在不会,就CreateEventA/W往上数条件跳转,十个以内,总能对。
#0x4 有提示无验证,Sdwrap合并,入口点缺损。
这种算是比较阴间的
还是和通常的软电池一样,去掉软电池部分,然后你会发现,运行后无任何反应
这种玩意在oep处改了些东西
至于如何修复这部分玩意,有个比较简单的方法,
就是你找一个正版,或者已经运行起来的,这个懂的都懂
或者可以利用体验版/同引擎的版本也可以。
然后用x64dbg附加上去,来到oep处,把损坏的部分修完就ok了
#0x5 无提示有认证,无Sdwrap(写在游戏脚本中)
这种也是一个奇葩东西,是通过直接把软电池的认证写在游戏脚本里实现的
目前我只见过Artemis引擎的,这个谈一下,其实有点和老的krkr引擎alpharom认证差不多。
首先我们先把脚本提取出来
然后放入游戏目录下,这个讲Artemis引擎汉化的时候说过了
然后刚刚我们观察到script.ini里写了软电池的认证信息,
说明等下软电池认证的时候就会去调用这个文件
把system文件夹丢进Sublime,然后全局搜索 script.ini
然后可以看到有两个lua脚本去调用了这个玩意
如果你搞不懂哪个lua脚本才是验证的,直接两个都修改
把验证部分去掉就行了
这里是auth.lua
把其中这一堆删了就ok了
然后可以把不必要的文件都删了
双击exe运行就进去了