像我们游戏,战斗的逻辑是写在客户端的,而且是只发送结果给服务器,这种情况就非常容易用变速器(调速器)来作弊,尤其是我们游戏还有打 BOSS 这样的玩法.所以...防御变速器作弊是非常必要的.
原理如下:
//开始战斗的时候记录下当前时间
float CurBattleTime = 0;
void StartBattle()
{
CurBattleTime = 0;
_startPoint = System.DateTime.Now;
}//在 Update()里面叠加 Time.deltaTime 给 CurBattleTime
private void Update()
{
CurBattleTime+= Time.deltaTime;
}//战斗结束,判断一下 CurBattleTime 和实际时间差 sysLostTime 有多少的误差
void FinishBattle()
{
var curTime = System.DateTime.Now;
int sysLostTime = (int)((curTime - _startPoint).TotalSeconds);
int tmp = Mathf.CeilToInt(CurBattleTime) - sysLostTime;
if (sysLostTime > 0 && tmp <10)
{
Debug.Log("FinishBattle WithoutCheating battleTime = " + sysLostTime + " tmp = " + tmp);
}
else
{
Debug.Log( "FinishBattle Player Cheating !!!!!!!!!! battleTime = " + sysLostTime + " tmp = " + >tmp);
}
}
实测可以鉴定出葫 lu 侠的变速器,当然也可以在战斗开始的时候给服务器发通知,再在战斗结束的时候发送 CurBattleTime 给服务器,让服务器鉴定时间是否在允许的范围内(我们已经在用这个方法了,所以把老的代码分享出来,不过并没有坑你们,也是可以测出来加速的)
以上代码都是我自己敲出来的,欢迎各种搜
1
elmander OP 第一次发帖,不知道可以写 markdown,就这样吧,代码不多,将就看也能看懂的
|
2
yuchting 2016-01-22 16:43:54 +08:00
给你提供一个网址: https://www.assetstore.unity3d.com/cn/#!/content/10395
就说这么多,多了都是凑字数。 |
4
shuax 2016-01-22 17:01:08 +08:00
只能证明这个外挂不给力, System.DateTime.Now 都没拦截
|
5
elmander OP Obscured Types 其实很好做的,自定义一个类,隐式类型重载到相应类(float,int)即可
|
6
yuchting 2016-01-22 17:07:41 +08:00
混淆做不了哇,做不了~
Unity 做混淆 dll 的功能貌似木有哇,之前买了一个插件,不能用哇。 |
7
elmander OP |
8
k9982874 2016-01-22 17:26:07 +08:00 via iPhone
我们的项目是在服务器做验证。另外客户端会把管卡数据的 md5 值也发过来,和服务器的数据比对,所以修改客户端管卡数据用简单管卡冒充 boss 关也是行不通的
|
9
wuyouchao 2016-01-22 17:38:40 +08:00
这东西本地数据都不可信,服务器验证才靠谱
|
10
undef404 2016-01-22 17:55:49 +08:00
要断绝在客户端做计算的想法,给人家破解了协议,什么幺蛾子数据都能给你传上来。。
|
11
elmander OP |
13
undef404 2016-01-22 19:54:44 +08:00
每次传输时和服务器比对时间,有问题就强制下线
|
14
elmander OP |
15
akagi 2016-01-22 22:14:58 +08:00
@elmander 嗯,可以这么说,还是看你们的工时和安全性的要求了。实在不行就找个收费服务,话说爱加密很贵么,应该比不上官方的服务价格吧?
|
16
mV2GK 2016-01-23 14:24:41 +08:00
实习的时候研究过 u3d 的反作弊,主要是 dll 混淆,感觉实用性不是很强,对称加密破解者段位高一点就可以破解了,还是去研究 VM 吧。。。。。
|
17
elmander OP |
18
dogfeet 2016-01-25 09:47:47 +08:00
根据客户端传过来的一个值来检测,等于一定程度上的信任客户端,就怕这个值被篡改。其实完全可以根据服务器上同一个玩家的 2 次战斗间隔来呀,还要加上战斗力的一些校验。
|
19
mV2GK 2016-03-06 15:40:10 +08:00
@elmander VM 是虚拟机的意思,这个我也没怎么研究过。
比混淆高级点的,可以考虑 dll 文件字节加密,这个你需要研究下 unity 引擎如何将 dll 文件 load 进内存的,加密后在 load 进内存前解密就行了。可以参考思路: https://www.zhihu.com/question/25414422 |