unity 手游防御变速器的方案 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
elmander
V2EX    程序员

unity 手游防御变速器的方案

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

    像我们游戏,战斗的逻辑是写在客户端的,而且是只发送结果给服务器,这种情况就非常容易用变速器(调速器)来作弊,尤其是我们游戏还有打 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     Solana     2720 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:15 PVG 23:15 LAX 08:15 JFK 11:15
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86