zoukankan      html  css  js  c++  java
  • Unity3D应用防外挂与防破解

    在我们的游戏开发过程中,我陆陆续续做了一些防外挂与防破解工作,这里记录总结一下。

    随机数校验

    为了让玩家的操作体验更好,游戏开发之初,我决定把战斗计算放在前端实现,战斗结束之后,后端校验前端发来的数据。最简单直接的校验方法就是:按照前端的实现方法,后端实现战斗计算,逐条验证前端发来的战报。这种方法简单、直接,非常可靠,缺点一是维护前后端两份代码,比较麻烦,我不想做重复性工作;二是消耗服务器CPU资源。有什么方法不用这么麻烦呢?

    对于战斗,玩家可以操作的数据分为可变和固定数据。决定战斗结果关键因素:卡牌上场顺序、技能释放概率和部分伤害值,是随机的,也就是可变数据。要校验这块只需要校验随机数。

    为此,我用线性冗余法,自己实现了随机数生成算法,前后端只要随机数种子相同,生成的随机数序列就是一模一样的。前端记录战斗过程中生成的随机数,后端逐个校验,非常简单,解决了可变数据被修改的问题。

    内存加密/校验

    后来,我们的合作运营提醒我说,他们运营的上一款游戏,战斗也是前端计算的,出现过玩家用外挂修改攻击值/血量值的情况,找来玩家用的工具试了一下,效果非常犀利。可以直接把对方英雄血量改为1,然后一下击毙。这就是修改基础固定数据,防范方法很简单,内存加密或内存校验就可以了。

    内存加密的简单方法是把关键数据加密,比如攻击值atk可以这样加密存取:
    Image

    这样内存修改工具就无法根据数值来找到修改了。或者也可以做内存校验:

    Image

    防破解

    防破解主要是C#脚本加密。Unity3D生成的应用,逻辑脚本都编译到了Assembly-CSharp.dll中。打包时把它按byte加密,然后在应用启动时解密就可以了。

    加密方法

    这个有很多种,根据自己的理解选一种就可以了。比如MD5、AES、xtea(cocos2d-x用的这个)、RSA等,都有开源实现。最简单是用mono自带的实现,也就是.net的安全类库实现,在System.Security.Cryptography中。

    解密

    mono加载dll是在/mono/metadata/image.c中的mono_image_open_from_data_with_name。

    Image

    编译mono

    1. 下载资源

    2. 安装依赖

    • 安装编译工具:gcc、make、automake等

    • 安装依赖包:bison、gettext、libffi-dev、zlib、libtool等 

      yum -y install xxx

    3. 修改设置
    进入目录/home/night/mono-unity-4.6
    • 设置环境变量 export ANDROID_NDK_ROOT=/home/night/android-ndk-r9

    • 编辑./external/buildscripts/build_runtime_android.sh

      1. 找到这一行,perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl,确保设置了ndk版本-ndk=r9;我编译的时候提示找不到ndk目录(设置了环境变量),可以在文件开头,export ANDROID_PLATFORM=android-9之后设置export ANDROID_NDK_ROOT=/home/night/android-ndk-r9。

      2. 在64位机器上,找到HOST_ENV=linux-x86,改为HOST_ENV=linux-x86_64

      3. 找到这一行-fpic -g -funwind-tables,去掉-g(编release版本)。

      4. 注释掉这两行,我们不需要ARMv5/v6的so
        Image

    • 编辑./external/android_krait_signal_handler/build.pl,将#!/usr/bin/env perl –w改为#!/usr/bin/perl –w,因为有设备兼容问题

    • 编辑mono-unity-4.6/external/android_krait_signal_handler/PrepareAndroidSDK.pm 

      拉到最后,找到sub PrepareNDK,在判断ndk版本号是否相等之前加入移除” (64-bit)”的代码
      Image

    • 执行./external/buildscripts/build_runtime_android.sh 

      如果出现以下提示,说明编译成功,生成的so在./builds/embedruntimes/android/armv7a/目录下。 

      Build SUCCESS! 

      Build failed? Android STATIC/SHARED library cannot be found… Found 4 libs under builds/embedruntimes/ android 

      如果报错,可以看config.log文件,里面记录了错误的详细原因。

    PS. 如果想编译Windows平台的mono.dll,需要用Visual Studio Command Prompt,打开,然后进入./msvc目录,执行msbuild.exe mono.sln /p:Configuration=Release_eglib

    Ref: http://blog.csdn.net/ynnmnm/article/details/48784335

  • 相关阅读:
    关于二分操作的基本应用
    东北育才 d1t4 漂流
    东北育才 d1t1 优雅的序列
    从零开始的图的存储方法
    从零理解的KMP算法
    openjudge T017 黑社会团伙 (并查集)
    东北育才 day6
    poj3071 Football
    noip2015 跳石头
    noip2015 信息传递
  • 原文地址:https://www.cnblogs.com/open-coder/p/12502177.html
Copyright © 2011-2022 走看看