0%

《河洛群侠传》中的反盗版暗桩

本文中的部分代码是对《河洛群侠传》反编译的结果。这些代码的版权属河洛工作室所有

正版玩家体验不到,亏大了

在用dnSpy分析河洛群侠传的代码时意外地发现了这游戏居然有一串检测steam_api.dll文件完整性的代码,如果发现steam_api.dll不是原版,就把主角传送到拱石村附近的龙口洞窟中(这个地方只能用卡点脱逃跑出来),并把卡点脱逃关掉,让玩家卡死在里面。

这段检测出现在Heluo.Platform.SteamPlatform中,代码为

1
2
3
4
5
6
if (SteamManager.HelloWorld)
{
gameData.PlayerPostioion = new Vector3(48.48f, 155.22f, -1202.68f);
gameData.TimeFreezed = true;
GameConfig.EscapeFlag = "NoPainNoGain";
}

追踪到SteamManager,可以看到跟原版Steamworks.NET的SteamManager相比,它多了一个名叫HelloWorld的方法。它会返回一个叫m_bHelloWorld的bool变量,而设置m_bHelloWorld值的代码在Awake方法中:

1
2
3
4
if (!DllCheck.Test())
{
this.m_bHelloWorld = true;
}

继续追踪DllCheck,发现这是魔改的SteamWorks自带的DllCheck。原版的这段代码上面的注释“Returns false only if the steam_api.dll is found and it’s the wrong size or version number.”表明它会检测steam_api.dll是否存在,如果存在则检测文件大小和版本号是否正确。而魔改后的代码有一些变动(我的分析可能有错,望指出):

  • 如果找不到steam_api.dll就返回false(原版是返回true)
  • 多出了一段类似CRC的完整性检验(可能是自己写的),操作为读入steam_api.dll文件并用一个预设的变量和第一个byte异或,将结果再和第二个byte异或……直到和所有的byte执行异或计算,最后将变量和一个预设的值进行对比,如果不同就返回false。

好的,我懂了,这就作个死
(嚣张.jpg)


还原dll文件之后就能正常读档了