小编典典

阻止人们破解基于 PHP 的 Flash 游戏高分表的最佳方法是什么

all

我说的是一个没有分数上限的动作游戏,也无法通过重播动作等来验证服务器上的分数。

我真正需要的是 Flash/PHP 中最强大的加密,以及一种防止人们通过我的 Flash 文件调用 PHP
页面的方法。过去我尝试过一些简单的方法,例如多次调用单个分数并完成校验和/斐波那契序列等,还使用 ​​Amayeta SWF Encrypt 混淆
SWF,但最终它们都被黑了。

感谢 StackOverflow 的回复,我现在从 Adob​​e 找到了更多信息 -
http://www.adobe.com/devnet/flashplayer/articles/secure_swf_apps_12.htmlhttps://github.com/mikechambers/as3corelib
- 我想我可用于加密。不确定这会让我了解 CheatEngine。

我需要知道 AS2 和 AS3 的最佳解决方案,如果它们不同的话。

主要问题似乎是 TamperData 和 LiveHTTP 标头之类的东西,但我知道还有更高级的黑客工具——比如 CheatEngine(感谢 Mark
Webster)


阅读 57

收藏
2022-06-22

共1个答案

小编典典

这是网络游戏和竞赛的经典问题。您的 Flash 代码与用户一起决定游戏的分数。但用户不受信任,Flash
代码在用户的计算机上运行。你是索尔。您无法阻止攻击者伪造高分:

  • Flash 比您想象的更容易进行逆向工程,因为字节码有很好的文档记录并描述了一种高级语言 (Actionscript) — 当您发布 Flash 游戏时,您正在发布源代码,无论您是知不知道。

  • 攻击者控制 Flash 解释器的运行时内存,因此任何知道如何使用可编程调试器的人都可以随时更改任何变量(包括当前分数),或更改程序本身。

对您的系统最简单的攻击是通过代理运行游戏的 HTTP 流量,捕获高分保存,并以更高的分数重播。

您可以尝试通过将每个高分保存绑定到游戏的单个实例来阻止此攻击,例如通过在游戏启动时向客户端发送加密令牌,可能如下所示:

hex-encoding( AES(secret-key-stored-only-on-server, timestamp, user-id, random-number))

(您也可以使用会话 cookie 来达到同样的效果)。

游戏代码通过高分保存将此令牌回显到服务器。但是攻击者仍然可以再次启动游戏,获得一个令牌,然后立即将该令牌粘贴到重放的高分存档中。

因此,接下来您不仅要提供令牌或会话 cookie,还要提供高分加密会话密钥。这将是一个 128 位 AES 密钥,它本身使用一个硬编码到 Flash
游戏中的密钥进行加密:

hex-encoding( AES(key-hardcoded-in-flash-game, random-128-bit-key))

现在,在游戏发布高分之前,它会解密高分加密会话密钥,因为您将高分加密会话密钥解密密钥硬编码到 Flash
二进制文件中,所以它可以这样做。您使用此解密密钥以及高分的 SHA1 哈希来加密高分:

hex-encoding( AES(random-128-bit-key-from-above, high-score, SHA1(high-score)))

服务器上的 PHP 代码检查令牌以确保请求来自有效的游戏实例,然后解密加密的高分,检查以确保高分与高分的 SHA1
匹配(如果您跳过此步骤,解密只会产生随机的,可能非常高的高分)。

所以现在攻击者反编译了你的 Flash 代码并迅速找到了 AES 代码,它像拇指一样突出,尽管即使没有,它也会在 15
分钟内通过内存搜索和跟踪器(“我知道我这个游戏的分数是 666,所以让我们在内存中找到 666,然后捕捉任何触及该值的操作 —
哦,看,高分加密代码!”)。使用会话密钥,攻击者甚至不必运行 Flash 代码;她抓住一个游戏启动令牌和一个会话密钥,并可以发回任意高分。

您现在正处于大多数开发人员刚刚放弃的地步——通过以下方式与攻击者相处几个月:

  • 使用 XOR 操作加扰 AES 密钥

  • 用计算密钥的函数替换密钥字节数组

  • 在整个二进制文件中散布假密钥加密和高分帖子。

这主要是浪费时间。不用说,SSL 也帮不了你。当两个 SSL 端点之一是邪恶的时,SSL 无法保护您。

以下是一些实际上可以减少高分欺诈的事情:

  • 需要登录才能玩游戏,让登录生成会话 cookie,并且不允许在同一会话上启动多个未完成的游戏,或同一用户的多个并发会话。

  • 拒绝持续时间少于所玩过的最短真实游戏的游戏会话中的高分(对于更复杂的方法,请尝试“隔离”持续时间低于平均游戏持续时间 2 个标准差的游戏会话的高分)。确保您在服务器端跟踪游戏持续时间。

  • 拒绝或隔离只玩过一次或两次游戏的登录名的高分,这样攻击者就必须为他们创建的每个登录名生成看起来合理的游戏玩法的“书面记录”。

  • 游戏过程中的“心跳”得分,以便您的服务器在一次游戏的生命周期内看到得分增长。拒绝不遵循合理分数曲线的高分(例如,从 0 跳到 999999)。

  • 游戏过程中的“快照”游戏状态(例如,弹药量、关卡中的位置等),您可以稍后将其与记录的临时分数进行核对。您甚至不必从一开始就检测此数据中的异常情况;你只需要收集它,然后如果事情看起来可疑,你可以回去分析它。

  • 禁用未通过您的一项安全检查的任何用户的帐户(例如,通过提交未通过验证的加密高分)。

请记住,您只是在这里阻止高分欺诈。没有 什么 可以阻止如果。如果你的游戏中有钱,那么有人会打败你想出的任何系统。目标不是 阻止
这种攻击;这是为了使攻击比仅仅在游戏中真正擅长并击败它更昂贵。

2022-06-22