Flash游戏骇客,得分是49700 ?? 如何提高Flash游戏的安全性?

Flash games hack, score is 49700?? How to improve flash games security?

我有2个Flash游戏(用as3编写)。两者的高分价值都被黑了。每个游戏得分的正常范围不超过5000(普通用户只能获得2000-3000分)。我当前的反黑客方法是:

游戏结束后,Flash将使用post参数发送:username = mike&score = 2000&hash = md5(secret。username。score)。在php页面中,我进行了检查,如果哈希!= md5(secret。username。score),它将返回错误,并且WONT将数据插入数据库。

我相信这种方法还不够,否则我的Flash游戏不会被黑客入侵。有什么我可以做的事情来提高我的Flash游戏的安全性/防黑客攻击能力吗?

黑客如何入侵?使用第三方软件,例如作弊引擎,篡改数据(firefox ext),tamperIE等?

您可以列出所有标准的黑客方法吗? (通过了解骇客方法/问题,意味着已经解决了50%的问题,至少我知道问题出在哪里,并对此做了某些预防措施)

好吧,我的标题是" 49700",因为两个游戏的最高分都是49700(实际上,很多分数都插入了我的数据库,不同的用户认为),所以我相信他们使用的是相同的方法

谢谢


如果分数验证完全在客户端运行,则实际上不可能确保分数验证的安全性。您必须至少在服务器端执行部分操作,才能使其远程安全。我看到两种方法:

  • 您将定期的分数更新发送到服务器,并在服务器端检查分数没有跳得"太大"(将在游戏环境中定义)。如果它"跳了起来",您可以放心地认为玩家正在黑客入侵。

  • 您将完整的游戏动作序列(连同任何随机生成的东西或任何AI事件一起)发送到服务器,并在最后加上分数,并验证分数是否准确。这显然不适用于所有游戏,但对于某些游戏却可以。您没有对游戏进行任何具体说明,因此我将其保留在此处。


到目前为止,最简单且最难在Flash中失败的方法是使用CheatEngine来简单地搜索存储得分的内存位置,然后将其值更改为所需的值。世界上所有服务器提交的哈希/盐化/验证都无法解决这个问题,因为您的游戏认为它是有效的,然后才将其打包为可提交的有效哈希。

如果分数总是落在预定义的值内,则可以对其进行"合理性检查",但是即使那样,坚定的黑客也可以简单地怀疑最大允许值是多少,并始终提交该值。

您可以尝试对内存中的得分值进行混淆处理,以使它们难以通过CheatEngine进行查找,例如,将它们存储为一个乘数值,然后在得分的getter和setter中包含要获取/的值的乘法/除法为您的视图和分数提交小部件设置适当的分数。即使这只是一个失速策略。

除非伪造的分数使您付出金钱,否则不要担心浪费时间在0.01%的作弊者上,或者手动调节分数表。

防止作弊的关键考虑因素是:"这到底有多重要?"如果您正在进行某种基于高分的比赛并获得现金奖励,那么这是一个相当高的优先级。如果您只是觉得某个随机的人弄乱了您的高分表,那您就不值得花些时间来阻止他们,只需每周检查一次并降低不良分即可。


您最终将试图延迟人们入侵您的系统或使其变得不值得的时间。您可以尝试在哈希中添加盐,这会带来一些额外的复杂性。这可以作为值发送给Flash游戏(将其作为参数添加到HTML中的Flash对象),并将其包括在哈希验证代码中。您可以发送某种会话ID或随机数,因此它总是不同的。您甚至可以通过不同的方法生成两个哈希,然后对它们进行检查。

当然,不要低估人们找到破解实际游戏功能的方法的可能性。或者他们只是非常好的球员...


您使用的加密系统与HMAC非常相似,但是您的实现不太安全。 md5算法是无效的,但是您的MAC不受前缀攻击的影响,因为您的秘密开始会产生哈希冲突。攻击者必须能够控制字符串的乞讨操作,以创建哈希冲突。

TamperData是一个非常有用的黑客工具,用于修改/捕获/重放来自浏览器的流量。因此,您应该通过验证当前日期和时间来防止重放攻击:hmac(secret,date_time.score.username)。

黑客可能正在使用SWF反编译器在SWF文件中查找您的机密值。为了解决这个问题,您应该尝试使用SWF模糊处理(例如http://www.amayeta.com/)来掩埋机密。

这些都不是"银弹",这只会使黑客更加困难。黑客将始终能够修改他或她的分数,因为您相信客户端可以告诉您正确的分数。即使您进行了建议的更改,仍然会违反CWE-602。


如果我想破解您的游戏,可以对您的游戏进行反编译,找出md5"秘密"。请注意,我在引号中加上了秘密,因为它是在Flash游戏二进制文件中提供的,这意味着它实际上不是秘密。

可能无法使您的分数难以破解,您所希望做的就是加大难度。


您可以在Flash应用程序中添加某种RSA(非对称)加密。 您可以将公钥放入Flash应用程序中,并在服务器端使用私钥来解密发送的分数。

这并不一定能防止黑客入侵您的Flash应用程序,但会让您更加痛苦。

这是用于RSA加密的AS3库。

除此之外,这取决于您在另一端如何实现RSA所使用的服务器技术(PHP,.Net或其他)。

还要注意,这个问题已经得到回答。


我当时想的是,由于游戏似乎需要身份验证,因此我认为有些呼叫需要获取用户名和其他信息。

与另一位开发人员的建议讨论的是使用Ajax组件。
Idk。

大多数黑客都会找到解决大多数安全问题的方法,最好的方法是防止
他们可以将游戏正常运行所需的东西发送回服务器。

有没有人根据可用的负记忆量使用随机数?而不是使用这些软件查找特定的内存位置。

为什么不将多个伪造的值发送给mem并根据开放式内存位置得出结果?

请不要因为这个建议而攻击我,因为我像其他大多数人一样是学习者。


不能简单地在服务器端运行游戏来防止分数被黑客入侵?
如果该游戏是作为随机游戏运行的,那么您将随机值发送到用户的浏览器,他们试图作弊就没有多大意义,即使反编译Flash文件也不会给他们带来好处。


正如您所说,根据要执行的操作,有不同的漏洞需要修复。当您在消息中发送实际信息时,"秘密"包含在代码中,这将使目标变得更加容易。您可以采取的一些措施来提高安全性

  • 使用不同的哈希函数,MD5具有已知的缺陷,可以在不知道内容的情况下创建具有相同签名的消息,SHA1,SHA2提供更高的安全性,这将通过MD5的弱点防止攻击

  • 使"秘密"对于每个消息都是唯一的,即。在每次发布时将其从服务器发送出去,这将防止人们一遍又一遍地重复使用相同的哈希值,并使查看代码和创建哈希值变得更加困难

  • 将结果散列多次,例如value = hash(hash(hash(...,salt),salt),salt)如果人们正在反编译您的程序,这将无济于事,但如果他们只是尝试自己重新创建哈希,这将有所帮助。

  • 寻找保护您的SWF免受反编译的软件,我没有做太多的闪存,因此我没有任何可靠的链接