假设您正在设计一款能够追踪高分的PC游戏。除了保持本地分数之外,还设置了全局高分服务器,该服务器通过因特网访问该游戏。玩家应该能够在完成游戏后立即将他们的高分提交到全球高分榜,或者稍后从他们的本地高分榜中提交。这一定是一个普遍的问题;现代游戏机上的街机游戏通常都有一个像这样的全球高分榜。
我的问题归结为:如何阻止某人提交虚假高分?或者,换句话说,全球高分服务器如何确保提交的分数真的是由穿过游戏?
我越是想到这一点,我就越认为这可能是一个无法解决的问题。
您通常采取的措施是验证源自某个来源的邮件是否会对邮件进行数字签名。在这种情况下你当然可以这样做,但真正的问题是玩家通过拥有软件也拥有软件的私钥。无论它有多混淆,它都可以进行逆向工程,甚至只是从记忆中拔出来。
另一个选择是将玩家游戏的重放发送到高分服务器,这将快速运行重播并验证提交的分数是否与重播的结果相匹配。这并没有解决问题,但如果你还必须制作一个“证明”它的非常复杂的重播,它肯定会使伪造高分变得更加困难。
这是一个有解决方案的问题,还是真的无法解决?家庭游戏控制台开发人员是否使用技术来防止这种漏洞利用,或者他们只是依靠控制台来防止未经授权的代码运行?
答案 0 :(得分:6)
对于客户生成得分的PC游戏,这不是一个可解决的问题,因为客户本身就不值得信任。
你唯一能做的就是让某人提交假分数更难。
一些想法:
保护内存中的分数。 您可以使用类似CryptProtectMemory的API来隐藏内存中的分数 - 简单的内存写入将无法正常工作。但是,使用附加的调试器或通过将代码注入到您的进程中,他们仍然可以修改分数。您可以查看尝试击败调试器的各种方案。
保护通往服务器的分数。 您可以按照建议加密发送到服务的数据,但由于不受信任的一方可以控制密钥,这只是模糊处理,并没有提供可靠的保护。
验证服务的分数。 除了非常简单的检查之外,我不愿意这样做。这里的错误将导致您拒绝有效分数。区分作弊者和强大的玩家是不可能的。
此时,你真的要问问自己,工程工作是否真的值得。如果有人发布无效分数怎么办?你真的失去了什么?我会尽量用一个简单的脚本来防止孩子。即,没有你的分数提交只是:
http://myservice.com/submitscore.aspx?PlayerName=Michael&Score=999999999
我只是在内存中使用简单的保护来防止随意窥探,在线上进行一些简单的混淆(用服务器cookie散列得分)并完成。
答案 1 :(得分:6)
“另一种选择是发送玩家游戏的重播......这不能解决问题,”
真的?为什么不呢?
“你还必须制作一个非常复杂的重播,”证明“[得分]。”
你是否建议有人可以假装重播?在不实际玩游戏的情况下推出超高分解决方案?假时间戳和一切?拉Donald Crowhurst?
为什么不玩游戏而不是试图伪造玩游戏的日志呢?
或者......如果很容易伪造游戏历史导致超高分,那么游戏可能会被错误设计。如果游戏“很难”,那么这个人必须做出正确的选择。如果游戏很简单,那么得分并不能反映玩家的选择并且是可以实现的。
这样想。挑选任何游戏或运动。有人说 - 比如说 - 瑞士在游艇比赛中击败新西兰。您可以通过寻找有关场地,船只,车队和个人比赛的详细信息来挑战他们,以说服自己这是真的。当然,他们可以假装它,但如果他们有一套丰富的细节来涵盖比赛,那么...那不是“证据”吗?
答案 2 :(得分:5)
据我所知,这是无法解决的。
我见过很多人试图混淆加密密钥。我已经看到一些人包括其他健全检查,如时间流逝,或剩下的敌人。我从未见过一个发送重播的人,虽然当然有可能。
在一个仍然未被发现的网站中,他们设置了一个很容易找到的假发送高分例程。如果犯罪者使用它,他们的IP地址将自动禁止将来更新。
答案 3 :(得分:1)
忘掉密码学问题;如果您的代码可以在本地计算机上被黑客攻击,那么如何让某人人为地设置一个疯狂的高分然后使用现有的可信机制进行传输呢?
在您可以建立对代码本身的信任之前,通信的加密机制不会成为真正的问题。
答案 4 :(得分:-2)
发送(软件+随机盐)的哈希值和分数。使用服务器检查此哈希。如果它匹配(意味着软件没有改变)接受它。否则,得分来自游戏的“修改”版本。拒绝它。每次生成哈希值时,随机盐都应该更改(当前系统时间或类似的东西)
检查Quake III Arena源代码。他们的版本非常简单。不幸的是,我现在不记得链接了。