我正在为我的游戏实施基本(仅适用于小孩)反作弊。我为每个移动数据包都包含了一个时间戳,并在服务器端进行了完整性检查,以确定这些数据包之间的时间差。
我还包括一个数据包,它根据进程速度每5秒发送一个时间戳。但是当PC滞后时,这似乎是一个问题。
那么我应该用什么来检查由于“速度黑客”而导致的处理时间是否更快?
我在客户端的当前循环速度检查:
this_time = clock();
time_counter += (double)(this_time - last_time);
last_time = this_time;
if (time_counter > (double)(5 * CLOCKS_PER_SEC))
{
time_counter -= (double)(5 * CLOCKS_PER_SEC);
milliseconds ms = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
uint64_t curtime = ms.count();
if (state == WALK) {
// send the CURTIME to server
}
}
// other game loop function
如果客户端PC因RAM或CPU问题而导致延迟,则上述代码可以正常工作。他们可能运行了太多的应用程序。
服务器端代码供参考:(GoLang)
// pktData[3:] packet containing the CURTIME from client
var speed = pickUint64(pktData, 3)
var speedDiff = speed - lastSpeed
if lastSpeed == 0 {
speedDiff = 5000
}
lastSpeed = speed
if speedDiff < 5000 /* 5000 millisec or 5 sec */ {
c.hackDetect("speed hack") // hack detect when speed is faster than the 5 second send loop in client
}
答案 0 :(得分:1)
您的系统存在严重漏洞,可以轻松规避作弊者:它依赖于客户提供的时间戳。您从客户端收到的任何数据都可以由作弊者操纵,因此不能信任它。
如果您想检查服务器上的速度黑客攻击:
当速度大于玩家的速度限制时,你可能会有一个骗子。但请记住,滞后会导致突然出现尖峰,因此最好采用多个样本的平均速度测量来检测玩家是否是速度黑客。这可能会使速度检测不太可靠,但实际上这可能是一件好事,因为这使得黑客更难以了解他们使用的任何逃避方法的可靠程度。
为了避免误报,请记住跟踪任何不遵守速度限制的移动玩家的人为方式(如传送到被杀后产生的传送)。当发生这样的事件时,当前的速度测量是没有意义的,应该被丢弃。