UWP游戏防内存修改器的方法

最近我一直在编写适用于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游戏强行改内存后崩溃的图,我把游戏名称抹掉了。

时间: 05-27

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

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

声明:本文只是为了初学C++的,能够做出一些实用的东西,跳出管理系统的束缚,提升学习的兴趣,在这里选取了单机游戏,请不要尝试在线游戏,违发而已未必可行.序:首先我们需要一个Qt+VS环境Qt从http://download.qt.io/archive/中下载,第一个和第三个,在里面选择对应版本.然后就是配环境了,这里提供2013+Qt5.5.1的环境配置,如果环境不同,请自行百度.这点解决问题能力都没有,就别学C++了...我的环境是2013+Qt5.5.1,不同版本可能略有差异,不过大同小异.

单机游戏如何防止类似八门神器这类的内存修改器的篡改办法

当下由于八门神器这类的存在,好多的单机游戏开发程序员都听蛋疼,今天看到伟哥实现了一个办法.... 大体的思路是: 1.实现一个类似与由一个值可以生成唯一的另一个值的函数(类似于C++ 的 std::hash<std::string>)hashFunc 2.本地保存两个相对的成员变量(this->coin, this->hash_coin) 3.每次对 coin赋值总会一起用 hashFunc对 hash_coin来赋值 4.当读取的时候判断 hash_coin 和 hashFunc

游戏客户端内存防修改浅析

但凡现在有点人气的游戏都可能被hack,而且网上有很多方便的工具可以使用,单就手机端还讲,最常见的内存修改器有八门神器.烧饼修改器.最近针对这两种内存修改器做了些防护处理,简单记录一下.当然道高一尺,魔高一丈,这里的处理也只是一定程度上的防作弊,最好的办法还是要做服务端校验. 1. 对内存数据进行加密处理 即在存储的时候事实上存储的是加密数据,而在读取时再做解密处理.这样的话,修改器便无法定位数据,也就无法修改或锁定该内存数据.但是,这可能会带来游戏性能的下降,加解密过程毕竟还是有效率问题的.所

用 C++ 写一个简易的《生化危机 4》修改器

思路比较简单,实现方法也不难,我这里大概说一下流程:♦ 用 CheatEngine 或者类似的内存搜索工具定位要修改的数值的内存地址:♦ 确定要修改的数值所占的字节数:♦ 提升修改器进程自身的 Privilege(特权):♦ 查找并打开目标进程,获取目标进程句柄:♦ 读取目标进程内存地址上的值:♦ 把值写入目标进程的内存地址上: 第一第二步不属于本文的讨论范围,我们从第三步开始吧: 微软从 Windows Vista  开始,引入了新的安全机制,一个进程如果没有足够的权限,是无法读写或者查询另外

CE修改器修改DNF 测试视频 阿修罗提升智力增加攻击力

使用CE修改器来修改网络游戏,如DNF 测试视频: CE修改器:指的是Cheat Engine,字面上的意思指的是作弊引擎的意思,是一款内存修改编辑工具.通过修改游戏的内存数据来得到一些原本无法实现的其他功能.让游戏难度变得更低,通关更容易.以及如果和朋友们一起玩的时候,可以用它来带人,可以在无形之中就装了一次逼.有一种开了外挂的感觉. 一般修改单机游戏非常简单,但是修改网络游戏可很难,不仅进制换算复杂,而且一旦被发现,可是直接封号处理的.所以修改游戏,仅仅是用来娱乐用的,发现一些好玩的东西.不

游戏开发中的一些基本方法

一.              检测对象变化的两种基本方式: 学过<微机原理>的人应该都了解这两种方式 1.       轮询 1) 每帧轮询 2) 定时轮询 按业务需求和性能问题选择 2.       中断(并非硬件中断,而是软件的事件通知方式) 两种模式: 1)       观察者模式 优点:① 扩展性强,事件发起接口不变,只需增加事件类型 ② 只通知对某件事有兴趣的对象,不会浪费性能 ③ 每种事件对应一种回调函数,对于回调函数,事件参数类型是固定的,MouseMove事件的参数类型肯定是

用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器

平时不怎么玩游戏,有时消遣就玩玩QQ里的2D桌球,但是玩的次数少,不能像骨灰级玩家一样百发百中,肿么办呢?于是某天突发奇想,决定自己也来做个“外挂”.说是外挂,其实只是一个瞄准器,毕竟外挂是修改别人的软件,有点违法的意思,况且自己还没有能力去那么做,所以自己还是弄个瞄准器,做做弊,过下小瘾,同时也提高一下自己的编程能力. 起初(也就是半年前),自己尝试做一个瞄准器的初始版本,用C#做,想法很简单: Step1.把鼠标移到洞口,获取鼠标位置: Step2.将鼠标放到要击打的球的圆心上,获取鼠标当前

STL内存管理器的分配策略

STL提供了很多泛型容器,如vector,list和map.程序员在使用这些容器时只需关心何时往容器内塞对象,而不用关心如何管理内存,需要用多少内存,这些STL容器极大地方便了C++程序的编写.例如可以通过以下语句创建一个vector,它实际上是一个按需增长的动态数组,其每个元素的类型为int整型: stl::vector<int> array; 拥有这样一个动态数组后,用户只需要调用push_back方法往里面添加对象,而不需要考虑需要多少内存: array.push_back(10); a

红色警戒2修改器原理百科(三)

继续上次,上次给出的开全图,是不能看透盟军的裂缝产生器的,有的修改器的开全图是可以看透的.它的原理是修改了判断迷雾的一个关键跳转.此处不多说,本人觉得不够优雅——能少改动代码则少改动代码.当然他也有自己的优势——看透裂缝产生器.可能在最后补充中,再加上吧. 当然,如果你事先查找了一些关键字符串,可以直接快速的定位到关键位置,不需要像我利用升级箱子来找. (七)额外核弹——可能是全球首发 笔者在百度了那个升级箱子都能带来什么之后,发现那个箱子有可能会得到一次额外的核弹发射机会,我就在想能不能找到这