V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
elmander
V2EX  ›  程序员

unity 手游防御变速器的方案

  •  
  •   elmander · 2016-01-22 16:26:12 +08:00 · 5274 次点击
    这是一个创建于 3229 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    写在后面:
    以后的话我认为我需要 PVE 的录像并且上传并且分析,因为本身我们产生的录像文件也不大,随便压一下肯定都不到 15K,3G 网络我认为基本上不会察觉
    dogfeet
        18
    dogfeet  
       2016-01-25 09:47:47 +08:00
    根据客户端传过来的一个值来检测,等于一定程度上的信任客户端,就怕这个值被篡改。其实完全可以根据服务器上同一个玩家的 2 次战斗间隔来呀,还要加上战斗力的一些校验。
    mV2GK
        19
    mV2GK  
       2016-03-06 15:40:10 +08:00
    @elmander VM 是虚拟机的意思,这个我也没怎么研究过。
    比混淆高级点的,可以考虑 dll 文件字节加密,这个你需要研究下 unity 引擎如何将 dll 文件 load 进内存的,加密后在 load 进内存前解密就行了。可以参考思路: https://www.zhihu.com/question/25414422
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3554 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:55 · PVG 08:55 · LAX 16:55 · JFK 19:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.