Unity3D应用防外挂与防破解

原创 2015年09月28日 16:59:34

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

随机数校验

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

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

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

内存加密/校验

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

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

private int curATK;
private int curAtkKey;
public int CurATK {
    get {
        return curATK ^ curAtkKey;
    }
    set {
        curAtkKey = Random.Range(0, 0xffff);
        curATK = value^curAtkKey;
    }
}

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

private int curATK;
private int curRealAtk;
private int curAtkKey;
public int CurATK {
    get {
        if (curRealAtk != (curATK ^ curAtkKey))
            // cheat!!! report to server...
        return curATK ^ curAtkKey;
    }
    set {
        curRealAtk = value;
        curAtkKey = Random.Range(0, 0xffff);
        curATK = value^curAtkKey;
    }
}

防破解

防破解主要是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。

MonoImage *
mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, MonoImageOpenStatus *status, gboolean refonly, const char *name)
{
    MonoCLIImageInfo *iinfo;
    MonoImage *image;
    char *datac;

    if (!data || !data_len) {
        if (status)
            *status = MONO_IMAGE_IMAGE_INVALID;
        return NULL;
    }

    // 我们在这里解密data

    // load image from data ...

    if (buffer != NULL)
        g_free(buffer);
    return register_image (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
#clean_build$CCFLAGS_ARMv5_CPU” “$LDFLAGS_ARMv5″ “$OUTDIR/armv5″
#clean_build$CCFLAGS_ARMv6_VFP” “$LDFLAGS_ARMv5″ “$OUTDIR/armv6_vfp”
  • 编辑./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)”的代码

sub PrepareNDK
    ...

    # remove the possible '(64-bit)' from the end
    my @curr_arr = split(' ', $current);
    $current = $curr_arr[0];

    if ($ndk eq $current)
    ...
  • 执行./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

转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/48784335。作者:夜风。

Unity3D 3.1 破解(外挂修改内存版)

  • 2010年11月14日 10:44
  • 45KB
  • 下载

Unity3D 游戏加密解密那些事

0x01 加密 加密主要是为了防止美术资源被窃取(换皮)和代码被恶意修改(外挂辅助,广告,二次打包) 1.资源的加密 先说说Unity加载资源的方式,第一种Resources.Load,第二种Asse...
  • BlueEffie
  • BlueEffie
  • 2015年10月12日 13:12
  • 6630

Unity编程笔录--Unity3D 导出的apk进行混淆和加固(防止反编译)

前言: 对于辛辛苦苦完成的apk程序被人轻易的反编译了,那就得不偿失了,这篇文章就是解决Unity打包出来的apk进行代码加固和混淆。   准备资料: 1:Obfuscator.zip  作用是代码混...
  • AdamBieber
  • AdamBieber
  • 2015年07月02日 23:47
  • 4868

Unity 2017.1.0f3 (64-bit) unity2017(win版)破解程序

  • 2017年08月18日 15:54
  • 62KB
  • 下载

在游戏研发中如何有效防止外挂程序

由于HTTP协议是明文传输,很容易通过抓取HTTP包获取游戏内交互的逻辑和数据,请问如何能有效地防止外挂程序? 总的说来,道高一尺魔高一丈,外挂不可能100%被杜绝,只能通过...
  • MeetLunay
  • MeetLunay
  • 2014年03月26日 10:37
  • 2265

我要玩石器多开的攻与防和外挂 ③

本片博文准备介绍最新的驱动级防多开(20161012)是怎么一会事! 游戏加载后发现一个名为MMProtect的驱动被加载了 搜索后发现原来号称是专业反外挂的现成方案:http://m...
  • hack_515sa
  • hack_515sa
  • 2016年10月19日 03:34
  • 3263

unity3d 5.0.2的安装与破解

1.序言2015年是VR(虚拟现实)的元年,不到一年的时间,异军突起,在可预见的未来,VR(虚拟现实)和AR(增强现实)会逐渐融入到我们的生活。而不管是VR还是AR,unity3d都提供了很好的支持。...
  • luofen521
  • luofen521
  • 2016年07月08日 23:58
  • 4408

Unity3D项目程序加密——对dll进行混淆

这里假设我们在Unity3D里面写的代码抽象成这样一个Test类,里面包含了公开和私有的变量,有自带的Start方法、Update方法和OnGUI方法,还有public、private和protect...
  • dingkun520wy
  • dingkun520wy
  • 2016年09月08日 15:41
  • 2610

规避网络游戏的外挂检测机制

规避网络游戏的外挂检测机制 译注:这是一篇发表在rootkit.com上的讨论怎么规避warden检测机制的文章,原文在这里。作者Darawk是D2的黑客。之前,暴雪通过Module32First/...
  • kingswb
  • kingswb
  • 2016年06月15日 08:11
  • 1582

游戏外挂防封心得

游戏的行为检测与加入随机数防封。 针对行为检测的解决办法。 这里注意!!!随机数是很重要! 游戏行为检测是记录一段时间的数据去进行分析对比,有规则的操作一目了然。一般没有特殊的原因是不会记录太长时...
  • qq_32175491
  • qq_32175491
  • 2016年09月23日 20:05
  • 1488
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Unity3D应用防外挂与防破解
举报原因:
原因补充:

(最多只允许输入30个字)