最近我一直在编写适用于Windows 10商店的游戏.这款游戏比较怕玩家用修改器改金钱,因为这种修改会导致某些内购失效并且损害公平性。于是我把自己见过的三种反修改器的方法给网友们介绍一下。

首先说明一下我总结的防止游戏作弊的理念:

1.预防修改,防患于未然,让可用的修改手段减少。

比如说,你让你的UWP在PC不可用,那么修改内存这个操作本身就变得十分艰难了。

用.NET Native编译(或者干脆用c++而不是.net语言),可有效防止反编译看你的加密和解密算法然后搜内存。

2.拦截修改,修改前就拦截掉

这通常需要特权,目前很多游戏的反外挂保护程序就是这样做的。缺点很明显,就是兼容性差,甚至可能导致整个操作系统崩溃。

还要注意,在UWP或者其它Windows Runtime环境下,提升特权不仅难而且违法商店规定。

3.免疫修改,简单的修改后不影响游戏逻辑的正常工作或者干脆用一般的搜索手段找不到该改哪里。

这种方案可行性比较高,具体的实现方法我在后面列出来。

4.检测修改,能够在修改后发现被修改了,加强这种防范。

比如你的程序使用了一种代价低但是精确度不高的作弊检查手段(比如每1分钟扫描一次需要保护的数值,检查是否作弊了),那么发现作弊后可以启动更严格的作弊检查(例如,改成每秒检查是否作弊,或者是启用其它保护方式)。

总结一下,防止作弊与我们看病是一样的,对抗疾病,我们应该做好预防,早发现,早治疗,还要防止后遗症。

转载必须注明这是Nukepayload2原创的博文

下面开始介绍在UWP上比较可行的防内存修改作弊的方法。

一. 用Hash验证数值是否被修改过

一个需要保护的数值被赋值时计算新值的Hash值,在读取的时候就可以验证Hash值是否正确,如果发现读取的时候存储的数值与Hash值不对应,游戏就不应该继续进行下去。

还有个问题是关于线程安全的。如果你修改了存储的值,但是还没来得及计算Hash值,另一个线程下一步修改了存储的值,那么这个验证就会发生错误。所以整个赋值的过程应该是互斥的。

下面的示例代码描述了对读写过程的互斥,并且要计算Hash值。读取的时候要验证Hash值。

VB

    Public Property Value As T
Get
SyncLock lock
If GetHashCode() = Hash Then
Return _Value
Else
Throw New CheatedException
End If
End SyncLock
End Get
Set(value As T)
SyncLock lock
_Value = value
Hash = GetHashCode()
End SyncLock
End Set
End Property

验证的时机可以调整,比如在游戏空闲的时候,存档之前,交易之前,交易之后 等关键时刻进行。

二. 对需要保护的数值进行混淆

让被保护的数值混淆,比较理想的情况是:实际值变大时存储的值不一定变大,实际值变小时存储值不一定变小,即使实际值变化后与原来的实际值等价存储的值也可能变得不一样。这样的保护既可以防止精准查找,也可以防止变大或变小的模糊查找。

混淆的同时,还可以更新一个假的字段诱骗内存修改器上当(不过这样可能会让真的值暴露,所以混淆算法要好好设计,假的值在哪里放也要考虑清楚)

VB

    Public Property Value As T
Get
Return TransformBack(_Value)
End Get
Set(value As T)
baitValue = value
_Value = ConfuseTransform(value)
End Set
End Property

三. 加密需要保护的数值

这种方法非常经典,与上面的方法接近,但是不会骗修改器。代码很简单,没必要给大家写了。

四.混合使用保护方法

你可以给需要保护的值算一个Hash值保存起来,然后对原有值混淆后加密,并且向某个远离秘文和Hash值的地方写入一个假的数值误导修改器。

混合前面的方法时同样要注意线程安全问题,考虑哪里需要互斥。

这是本文最后的代码示例,描述了一种混合多种保护方式的值的读写方法。

这样,使用简单的内存修改器的玩家会先找到陷阱,发现那里的值改了不起作用,使用exe分析程序找到了加密用的key和iv,尝试多种解密算法,可是解出来的值还是不能用常规的hash算法找到与内存中匹配的内容。这样几乎所有不会汇编的玩家会对内存修改这条路望而却步(除非某个会汇编的人写了修改器出来,不过要看懂.NET Native编译的程序还是挺难的)。

VB

    Public Property Value As T
Get
SyncLock lock
Dim val = TransformBack(Decrypt(_Value))
If ComputeHash(val) = hashCode Then
Return val
Else
Throw New CheatedException
End If
End SyncLock
End Get
Set(value As T)
SyncLock lock
traps.Enqueue(value)
If traps.Count > TrapSize Then traps.Dequeue()
hashCode = ComputeHash(value)
_Value = Encrypt(ConfuseTransform(value))
End SyncLock
End Set
End Property

至于发现作弊后做什么,我的选择是终止游戏,而且异常提示也是具有迷惑性的。

图中是我的UWP游戏强行改内存后崩溃的图,我把游戏名称抹掉了。

UWP游戏防内存修改器的方法的更多相关文章

  1. Android For JNI(二)——C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器

    Android For JNI(二)--C语言中的数据类型,输出,输入函数以及操作内存地址,内存修改器 当我们把Hello World写完之后,我们就可以迈入C的大门了,今天就来讲讲基本的一些数据类型 ...

  2. ce游戏内存修改器(Cheat Engine)

    ce修改器(Cheat Engine)一款专门修改内存修改编辑的游戏工具它包括16进制编辑,反汇编程序,内存查找工具新版6.1 版的CE与6.0 最大的区别就是添加了修改器制作工具,比之前 5.6.1 ...

  3. 只需要一点点C++基础,新手也可以制作单机游戏内存修改器

    声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http ...

  4. 实例游戏内存修改器----CUI版本模拟

    实现说明: 目标进程内存中很可能存在多个你要搜索的值, 所以在进行第一次搜索的时候, 要把搜索到的地址记录下来,然后让用户改变要搜索的值,再在记录的地址中搜索,直到搜索到的地址惟一为止.为此写两个辅助 ...

  5. 防止apk反编译的技术分析浅谈--内存修改器篇

    声明: 1.本帖转载自http://jingyan.baidu.com/article/a24b33cd509eb719fe002b94.html,仅供自用,勿喷 Apk反编译修改器有很多.拿其中的比 ...

  6. C++内存修改器开源代码

    我们玩单机游戏时,游戏难度可能过大, 或者游戏已经比较熟练,想要增加游戏的玩法,这时候可以使用修改器. 内存式游戏修改器主要对游戏内存修改 修改时有两种方式,一是定时对内存数值进行修改.实现类似锁定的 ...

  7. Steam 游戏 《The Vagrant(流浪者)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标08)

    日期:2020.02.07 博客期:146 星期五 [温馨提示]: 只是想要修改器的网友,可以直接点击此链接下载: 只是想拿CT文件的网友,可以直接点击此链接下载: 没有博客园账号的网友,可以将页面下 ...

  8. Cocos2d-x单机游戏防八门神器修改数据

    来源:http://cocos2d.9tech.cn/news/2014/0212/39812.html 网上的cocos2d-x教程多为知识点的讲解,但我们学习cocos2d-x的目的是为了什么?为 ...

  9. Steam游戏《Northgard(北境之地)》修改器制作

    日期:2021.06.07 博客期:181 星期一 [温馨提示]: 我现在把资源先放到开头,不想研究学习的就直接取用.如果修改器失效了,你们可以在博客园本页直接评论,也可以给我发邮件告诉我,就是不要到 ...

随机推荐

  1. shell 中命令输入的快!捷!键!

    非常棒!! 非常棒!! 删除ctrl + d 删除光标所在位置上的字符相当于VIM里x或者dlctrl + h 删除光标所在位置前的字符相当于VIM里hx或者dhctrl + k 删除光标后面所有字符 ...

  2. iOS xcode6 添加.pch文件

    1, 新建文件 (command+N)选择other组,再次选择pch,输入文件名保存. eg: 创建的工程为Demo; 创建文件名为DemoPrefixHeader.pch 2,到工程里面的buil ...

  3. Java基础之泛型

    泛型: (1)为什么会出现泛型? 因为集合存放的数据类型不固定,故往集合里面存放元素时,存在安全隐患, 如果在定义集合时,可以想定义数组一样指定数据类型,那么就可以解决该类安全问题. JDK1.5后出 ...

  4. 解决URL中文乱码问题

    在做一个HTTPS连接时, 要客户端合成一段HTTPS地址 如果地址含中文的话程序会crash, 检查发现原来是中文没有转码的原因 在NSString库里面找到了下面两个方法 - (NSString ...

  5. 大叔也说Xamarin~Android篇~为HttpClient共享Session,android与api的session共享机制

    回到目录 杂谈 在进行android进行开发时,我们的数据一般通过接口来获收,这里指的接口泛指web api,webservice,wcf,web应用程序等:它们做为服务端与数据库进行直接通讯,而AP ...

  6. 06- Shell脚本学习--其它

    Shell输入输出重定向 Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出 ...

  7. 在同一台电脑上同时安装Python2和Python3

    目前Python的两个版本Python2和Python3同时存在,且这两个版本同时在更新与维护. 到底是选择Python2还是选择Python3,取决于当前要使用的库.框架支持哪个版本. 例如:HTM ...

  8. fir.im Weekly - 人人都需要的 IT 技能图谱

    AlphaGo 与李世石的人机世纪大战落下帷幕,不禁让人思考<失控> 中说道的 "机器正在生物化,而生物正在工程化 ".作为人类,在未来能否保全最后的智力骄傲成为一个疑 ...

  9. 每天一个linux命令(31): /etc/group文件详解

    Linux /etc/group文件与/etc/passwd和/etc/shadow文件都是有关于系统管理员对用户和用户组管理时相关的文件.linux /etc/group文件是有关于系统管理员对用户 ...

  10. android TextView 文字垂直的设置

    <TextView android:id="@+id/tv_status" android:layout_width="wrap_content" and ...