付坤个人网-------------------民间天梯基地----------------------手动更新
新闻详情

论单机游戏未来发展的几个关键技术

4
发表时间:2023-07-09 04:24
论单机游戏未来发展的几个关键技术
一:数据安全,内存保镖技术。
    单机游戏随着三D化,发展的是越来越华丽了,但有一个根本的问题没有解决,那就是数据安全问题。
    游戏就是一系列的数据,而数据可以被更改,玩家就不再是玩家,而是神,他们可以用工具修改数据达到目的,认真玩游戏的态度就没有了,游戏精细美妙的设计也就被破坏了。
    我最开始知道内存数据可以被修改是因为金山游侠,这是一款强大的软件,可以轻松的搜索出游戏的关键数据,比如攻击防御,并加以设置。如果攻击设为99999,那么显然就可以一路横扫,固然是玩家爽快了,却破坏了游戏的初衷。
    所以数据安全非常重要,关系到游戏的生死存亡。
    但是,内存数据都可以更改,怎么防护呢?似乎没有什么好的办法,也看不到有游戏做这方面的努力,似乎是大家都认命了。
    要让内存数据不能被修改,是做不到的,不存在这样的技术。但是我们可以换个思路,当玩家修改内存数据的时候,我们对其进行惩罚,就可以使得他不再修改。
    这种思路就要求我们要监视内存数据,时刻跟踪它的变化。
    怎么监视,怎么跟踪呢?游戏一旦发到玩家手里,我们还能进行操作吗?
    所以我们要在程序内部设置。用程序本身的数据来跟踪,这就是内存保镖技术。
    比如有核心数据攻击需要被监视,我们可以设置另一个数据攻击监视者,跟随攻击数据变化,这就达到了监视的目的。这种跟随变化可以是一个数学公式,比如乘2,那么攻击由5变成6的时候,监视数据就由10变成12,而当玩家修改数据之后该数据再被使用时,我们检测攻击和监视数据,发现不是乘2的关系,就说明有人更改了数据。这时我们就可以启动惩罚,比如关闭程序,比如数据归零,让玩家作弊付出代价,从而阻止数据的修改。
    也就是说,两个数据被固定的关系绑定了,除非你同时修改两个,并且按我们设定的规则,否则就会出错。而在源代码没有暴露的时候,我们设定的规则是不为人所知的。前面举得例子,乘2的关系显然是非常简单的,在玩家可以用工具看到所有内存数据变化的时候,就会猜测出两者的关系,从而同时修改两个数据,达到修改的目的。但是我们可以用更复杂的关系,使得玩家看不出两者的关系,如果两个数据复杂关联,既不是正相关,也不是负相关,那么玩家就不能轻易看出。
    这种关联性可以称之为一种加密,而想要作弊的玩家修改数据的就是解密者。
    我们可以用成熟的加密技术,比如MD5,那么比如攻击数据是5,相应的监视者数据则是一串MD5码,是32位的数字,这种关系就不是语言能说清的了,非常复杂。但是玩家可以看出,这是MD5码。所以我们要进一步的加密。比如攻击数据是5,那么我们计算[5%%%*****¥]的MD5码,并且所用MD5的内部参数也被修改过,那么玩家即便知道是和MD5相关,他也无法计算这种关系,除非得到源代码。
    所以通过这种MD5外加密和MD5内加密,确定监视者和核心数据之间的变化关系,就可以使玩家看得到数据也无法猜测到数据真实的变化过程,从而不能同时正确的修改两数据,从而在修改的时候被我们发现。
    通过这种手段,核心数据的安全就被保障下来了,单机游戏重新获得属于自己的尊严。
二:登陆校验,随机万向锁技术。
    除了数据安全外,制约单机游戏发展的一个关键就是收费不便,注册码一旦被破解人人能用,就没有人付费了,这也是所有软件的问题。玩家一旦下载了软件,就抛弃了作者。
    所以要想办法解决这种情况。
    在数据安全的基础之上,我们可以采用这种随机万向锁技术。
    也很简单,让软件进入之前显示一个大的随机数字作为该软件本次登陆的ID,并要求输入对应的加密字符串。这个随机数字是每次都不一样的,而且非常大,比如4864118568,当然要在数据范围内,不要溢出的情况下,尽量使得数据没有短期重复的可能。由于一次随机范围比较大的话,出来的数据会接近,所以可以多随机几次,更加分布均匀。
    那么,这个数据是核心数据,是受监视的,所以不能被修改【发现被修改则退出程序】。而由于作者掌握着对应的加密规则【同时使用MD5内加密和外加密】,所以可以给出正确的加密字符串。而玩家得到加密字符串后,输入验证就可以进入软件。当然,下一次打开程序的时候,随机数字变化了,还需要去找作者。所以这种限制方式等于是让作者掌握了主动权,而且是按次收费。由于每个人打开程序,看到的随机数字都不一样,所以他们需要的加密字符串是不同的,所以用户之间交流是没有用的,也就是说一个人通过检验了,而另一个不可以,加密字符串没有通用的,这就将用户和用户区别开来,不会出现一个注册码所有人用的情况。
    当然,作者可以专门开了一个网站,处理这些工作,同时收取费用,或者自己写一个小的计算加密字符串的程序,只由自己掌握,当用户需要的时候,手工操作,并向其收费。开个淘宝店似乎也不错。前提是用户要提供自己随机出来的数字给作者,如果自己手工处理的话可能有点麻烦,但是收钱的事一点小麻烦也是愉快的。如果你有网站,并且便于给钱,可以自己设置货币,让玩家充钱后自己输入计算字符串,那就方便了,这种方式适合大的团队和公司。
    如果你的这个核心数字是10亿大小级别的,也就是说在10亿次登陆就必然会出现数据重复,用户可以记录一个数据库,保存所有用过的数据直到出现重复,就不用再受作者控制了。所以我建议大家用两个随机数字合起来作为登陆ID,那么整体就有亿亿级的数据,玩家就没有办法了,从而不会去做数据库。当然两个数据设计肯定麻烦一些,如果你觉得10亿已经够大,你收这么多钱之后完全可以免费,那么一个数据就够用了。
    这种技术建立在数据不能被随意修改的基础之上,所以一定要确保安全,源代码也不要泄露。
    简单来说,这就和网络游戏输入用户名和密码一样,只不过我们的用户名是变化的,密码是和用户名固定关联的,而关联关系掌握在作者手中,所以对于不同的用户名数据,只有作者知道对应的加密字符串。
    这里的关键设计,就是大数随机,确保了每个用户每次打开的登陆ID都不一样,从而不能重复使用密码。
三:货币传输技术
    货币就是游戏里的一个数字,想要流通是货币的天然属性。
    在每次打开的单机游戏有了上面所说的大数ID之后,就可以设计货币传输了。
    当然前提仍然是数据安全,确保货币数据不被修改,才有传输的价值。
    假如传输发生在两个客户端之间,所谓传输就是一个客户端失去这个数据,另一个客户端得到这个数据。
    失去很简单,数据归零就行了。关键是怎么得到,既不能中途被修改,也不能重复使用数据,重复的得到。
    假设第一个客户端有金币100,要传给第二个客户端,第二个客户端的ID为两大数:123456和234567。
    首先,在第一个客户端计算【123456+234567+100+加密字符串】的变异MD5码,并把一百归零。这是在程序内部计算的,123456+234567是玩家输入的,加密字符串是不可见的。
    然后第二个客户端输入100,再输入第一个客户端计算的码值,然后计算相应的MD5码,如果两个MD5码相等,说明数据正确,则得到100金币。这里金币数量变化也要相应的监视者数据变化,这是程序内部处理的。
    那么这样钱就由第一个客户端转移到第二个客户端了,但是这里有一个致命的问题。
    我们再次输入100和码值,第二个客户端又得到100,这样可以重复得钱,这显然是不行的。
    所以要设计变化,得到一次钱后,就把ID数据加1,123456变成123457,234567变成234568,因为第一次给钱是按123456和234567来算的,所以这两个数变化之后,第一次计算的结果就没有用了,再给钱需要重新计算,每次给钱都是一次性的,而且是确定的。
    这就完成了单机游戏客户端之间的货币传输。
    这固然十分美好,却有两个前提条件。
    第一,程序初始钱数应当为0。如果不为零,那么玩家可以重复启动程序刷钱。
    第二,游戏不能存档。因为存档就是一次数据复制,如果钱被复制,再次启动钱就重复了。这样也可以刷钱。
    这两点都是游戏设计之初要考虑到的。
    如果你想设计一款伟大的,单机和单机可以交流的游戏,注意遵守这些游戏规则。
四:物品传输技术
    物品在游戏里也是数据,不过比金钱多一些数据,只要把所有的这些数据考虑进去,用我们传输货币的方法,就一样可以传输物品,想想两个玩单机游戏的打到不同门派的装备互相交易的情形,实际上两者间的信息是通过网络交互得到的,比如QQ,比如贴吧。
    我们还可以在游戏和网站间传输物品,这就是商城的思维了,单机也可以卖道具。
    至于这种模式能不能大行其道,做了才知道。
    事实上一和二是我们今天讨论的重点,我希望它能流传出去,为大家所用,为单机游戏带来又一次的发展高潮。
    谢谢您的观看。


作者:付坤

QQ:270182827


分享到: