unity 手游防御变速器的方案

2016-01-22 16:26:12 +08:00
 elmander

像我们游戏,战斗的逻辑是写在客户端的,而且是只发送结果给服务器,这种情况就非常容易用变速器(调速器)来作弊,尤其是我们游戏还有打 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 给服务器,让服务器鉴定时间是否在允许的范围内(我们已经在用这个方法了,所以把老的代码分享出来,不过并没有坑你们,也是可以测出来加速的)

以上代码都是我自己敲出来的,欢迎各种搜

5271 次点击
所在节点    程序员
19 条回复
elmander
2016-01-22 16:42:20 +08:00
第一次发帖,不知道可以写 markdown,就这样吧,代码不多,将就看也能看懂的
yuchting
2016-01-22 16:43:54 +08:00
给你提供一个网址: https://www.assetstore.unity3d.com/cn/#!/content/10395
就说这么多,多了都是凑字数。
elmander
2016-01-22 16:54:26 +08:00
@yuchting 这个东西能做混淆吗?
shuax
2016-01-22 17:01:08 +08:00
只能证明这个外挂不给力, System.DateTime.Now 都没拦截
elmander
2016-01-22 17:02:15 +08:00
Obscured Types 其实很好做的,自定义一个类,隐式类型重载到相应类(float,int)即可
yuchting
2016-01-22 17:07:41 +08:00
混淆做不了哇,做不了~
Unity 做混淆 dll 的功能貌似木有哇,之前买了一个插件,不能用哇。
elmander
2016-01-22 17:22:17 +08:00
@shuax 所以我们改变了做法,直接通知服务器游戏开始,不带 DateTime.Now,只做 Update 里面的累加时间和最后将累加时间发送到服务器,有种它把 Time.deltaTime 给改了.23333

@yuchting 果然混淆还是太难了一点啊,等我研究出来再发一个帖,我现在就是用了隐式类型重载+上面的代码改版+梆梆加固(爱加密的防修改要花钱,果断不考虑了)
k9982874
2016-01-22 17:26:07 +08:00
我们的项目是在服务器做验证。另外客户端会把管卡数据的 md5 值也发过来,和服务器的数据比对,所以修改客户端管卡数据用简单管卡冒充 boss 关也是行不通的
wuyouchao
2016-01-22 17:38:40 +08:00
这东西本地数据都不可信,服务器验证才靠谱
undef404
2016-01-22 17:55:49 +08:00
要断绝在客户端做计算的想法,给人家破解了协议,什么幺蛾子数据都能给你传上来。。
elmander
2016-01-22 18:08:00 +08:00
@k9982874 你这招略狠,学了一招,不过我认为在战斗前通知服务器,也可以达到同样效果

@wuyouchao
@undef404 完全防御是防不住的,除非做成 WOT 那种全靠服务器判断的,我也知道这点,只能不增加过多预算的情况下增加破解难度,增加破解成本,我们代码够多,所以我才在 3L 就迫不及待的问怎么做混淆
akagi
2016-01-22 18:24:02 +08:00
@elmander 去下 Mono 源码,在解析部分做加解密,重新编译。细节能不能复现,就看楼主能力如何了~
undef404
2016-01-22 19:54:44 +08:00
每次传输时和服务器比对时间,有问题就强制下线
elmander
2016-01-22 21:06:50 +08:00
@k9982874 如果真的有玩家能改掉玩的关卡的话,你的办法是对的,因为我的出发点是防内存扫描和加速,所以没照顾到这点

@undef404 心跳包也是一个办法,我们也想过,也许过段时间会加逻辑到心跳包上吧

@akagi 重写一部分.so 模块的办法,至今好像只有鹅厂在用,大概改这个东西比较费时间,我看网上教的大多只是改写一下地址
akagi
2016-01-22 22:14:58 +08:00
@elmander 嗯,可以这么说,还是看你们的工时和安全性的要求了。实在不行就找个收费服务,话说爱加密很贵么,应该比不上官方的服务价格吧?
mV2GK
2016-01-23 14:24:41 +08:00
实习的时候研究过 u3d 的反作弊,主要是 dll 混淆,感觉实用性不是很强,对称加密破解者段位高一点就可以破解了,还是去研究 VM 吧。。。。。
elmander
2016-01-23 16:47:53 +08:00
@akagi
现在还没到赚钱的时候,所以资方也是抠门,如果真有发达的一天的话我是会希望买点服务的,现在我肯定是自己写一点东西,去掉一些简单的作弊方式
@mV2GK
混淆我也知道是对付低级别的破解者,而且那个主要的 DLL 文件,没有混淆的时候也有 3M 多,所以就算是破解了混淆,估计也能看到他们头疼.,还有 VM 是什么?可能我比较孤陋寡闻,求您多给点提示.

写在后面:
以后的话我认为我需要 PVE 的录像并且上传并且分析,因为本身我们产生的录像文件也不大,随便压一下肯定都不到 15K,3G 网络我认为基本上不会察觉
dogfeet
2016-01-25 09:47:47 +08:00
根据客户端传过来的一个值来检测,等于一定程度上的信任客户端,就怕这个值被篡改。其实完全可以根据服务器上同一个玩家的 2 次战斗间隔来呀,还要加上战斗力的一些校验。
mV2GK
2016-03-06 15:40:10 +08:00
@elmander VM 是虚拟机的意思,这个我也没怎么研究过。
比混淆高级点的,可以考虑 dll 文件字节加密,这个你需要研究下 unity 引擎如何将 dll 文件 load 进内存的,加密后在 load 进内存前解密就行了。可以参考思路: https://www.zhihu.com/question/25414422

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/252648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX