Unity3D应用防外挂与防破解
随机数校验
为了让玩家的操作体验更好,游戏开发之初,我决定把战斗计算放在前端实现,战斗结束之后,后端校验前端发来的数据。最简单直接的校验方法就是:按照前端的实现方法,后端实现战斗计算,逐条验证前端发来的战报。这种方法简单、直接,非常可靠,缺点一是维护前后端两份代码,比较麻烦,我不想做重复性工作;二是消耗服务器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. 下载资源
注意unity mono与mono的不同,unity mono源码在https://github.com/Unity-Technologies/mono。
我是在linux64位机器编译的,用的是Unity4.6,对应的ndk是r9,下载地址:
https://github.com/Unity-Technologies/mono/tree/unity-4.6
https://github.com/Unity-Technologies/krait-signal-handler
http://dl.google.com/android/ndk/android-ndk-r9-linux-x86_64.tar.bz2下载后解压
/home/night/mono-unity-4.6
/home/night/android-ndk-r9将krait_signal_handler复制到mono-unity-4.6/external/目录下,并重命名为android_krait_signal_handler。
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
- 找到这一行,perl ${BUILDSCRIPTSDIR}/PrepareAndroidSDK.pl,确保设置了ndk版本-ndk=r9;我编译的时候提示找不到ndk目录(设置了环境变量),可以在文件开头,export ANDROID_PLATFORM=android-9之后设置export ANDROID_NDK_ROOT=/home/night/android-ndk-r9。
- 在64位机器上,找到HOST_ENV=linux-x86,改为HOST_ENV=linux-x86_64
- 找到这一行-fpic -g -funwind-tables,去掉-g(编release版本)。
- 注释掉这两行,我们不需要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 endmy @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应用防外挂与防破解相关推荐
- 防外挂和防木马的通用解决方案
[转]防外挂和防木马的通用解决方案 Posted on 2012-01-19 11:30 单鱼游弋 阅读(110) 评论(0) 编辑 收藏 外挂.木马和私服一直网络游戏的三大死敌.一个不小心被任意一个 ...
- 网易云加密--Android安卓移动应用程序加密加壳保护方案防破解防逆向分析防游戏外挂
网易云加密--Android安卓移动应用程序加密加壳保护方案防破解防逆向分析防游戏外挂 一.服务简介 网易云加密为网易公司旗下产品,致力于为移动应用程序提供专业保护方案,让加固变得更简单,一键搞定.目 ...
- 游戏防外挂、破解解决方案
##往事--记得之前面试时,考官问过类似问题,怎么防外挂?小白当时也是胡乱讲一通,主要说前后服务端进行数据校验之类的,想想还是挺可爱的. 最近看了大神写的方案,觉得还是挺好的,记录的同时做下分享 1. ...
- 艾格拉斯张鹏:重度手游防外挂及安全
艾格拉斯张鹏:重度手游防外挂及安全 图/文 游戏茶馆 前言 2015年1月10日,[问道一线]品牌沙龙第一期,有幸邀请到的艾格拉斯创始人之一.CTO张鹏先生,以<游戏防外挂及安全>为主题, ...
- 手游遭遇兼容性、客户端、服务器、防外挂问题如何做?
手游遭遇兼容性.客户端.服务器.防外挂问题如何做? 本文来自Game Look,不代表本平台观点与立场(好文章分享) 这份白皮书不仅给出了目前国内手游产品遭遇的技术上的主要问题,也给出了一个推荐给开发 ...
- 技能模块的防外挂机制和同步机制优化
游戏在真实的环境中,有些特殊情况需要处理,本文介绍技能模块是如何处理人为作弊和现实中的网络导致的一些问题. 主要介绍三个功能: 1.防外挂 2.网络延迟问题解决 3.网络卡顿和抖动 4.流量优化 注意 ...
- 域名防封-微信防屏蔽的原理以及实现
为什么? 微信被封? 被秒封? 本人也是做防封的 所以总结一些小经验 一 服务器 服务器方面 是目前很多大家在做的 很多做防封的朋友都一样这种经历 例如把自己的域名 解析到 防封平台的服务器上 很诡异 ...
- 一文看懂设备指纹如何防篡改、防劫持
一定程度上,设备指纹之于人的重要意义不亚于身分证. 为什么这么说? 大多数人可能都有过这样的经历: 刷短视频时,只要我们点赞了某个视频,那么下一次再刷视频时,系统就会推荐更多类似的视频:当你在某个购物 ...
- 某程序员揭秘“开水团”大厂真实福利:工位拥挤,没有食堂!公司防员工跟防贼一样,特别是纸巾和插排都粘到桌子上!...
坊间都说美团福利差,差到只提供白开水,还因此喜提了"开水团"美称.但美团好歹也是个互联网大厂,它的福利待遇真有传说中那么不靠谱吗?不少人对此存疑,觉得可能有所夸张. 百闻不如一见, ...
- 简单的 php 防注入、防跨站 函数
/*** 简单的 php 防注入.防跨站 函数* @return String*/function fn_safe($str_string) {//直接剔除$_arr_dangerChars = ar ...
最新文章
- 解析RecyclerView的缓存机制
- 用c语言打电子算料,用C语言实现CRC校验计算
- Linux下Sniffer程序的实现
- Windows 10如何禁用Microsoft Edge标签页预览
- Linux怎么调oracle存储,Linux 环境下Oracle安装与调试(四)之视图、存储过程
- Intel Skylake (Client) 架构/微架构/流水线 (2) - 前端
- 【校招VIP】知名产品分析之微信本身的亮点和缺点
- 十三五规划中中国制造2025
- 100以内的奇数求和
- div 设置a4大小_CSS设置A4纸张大小_others_酷徒编程知识库
- 用C/C++自己写一个宋词生成器,气质一下子就上来了呀
- 计算机电子科技生产质量标准,SJT9527__微型数字电子计算机 质量分等标准(4页)-原创力文档...
- h5做app和原生app有什么区别
- vivo手机html有吗,vivo手机有哪些系列?区别是什么?
- kotlin实现的简单个人账户管理APP(三) 自定义View仿支付宝的密码输入框/密码相关逻辑
- 一元回归及多元回归模型
- 分布式调度问题及解决方案
- 查看linux文件工具,Linux基础命令-文本文件查看工具
- android开发之消息推送
- 使用hardhat将合约部署到ganache
热门文章
- 微盟致远OA聚水潭YonSuite系统对接集成整体解决方案
- C# 汉字转拼音(支持GB2312字符集中所有汉字)
- 安装terrasolid模块的“setup.exe”弹窗setup.inf not found
- Unity-TouchScripts中使用TUIO的记录和简单的代码分析
- 白话空间统计二十四:地理加权回归(二)
- 现有VI 创建子VI(LabVIEW软件)
- arcgis重心迁移分析,ArcGIS支持下三峡库区适度人口重心迁移研究
- iphone13怎么安装双卡(双卡功能)
- 百度如流首发AI智能办公标准 ,BATH持续发力企业办公
- Proteus里设置任意电源值的POWER的实现