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