在Javascript中制作黑客证明游戏

时间:2010-07-02 19:20:08

标签: javascript security game-engine

假设您使用HTML5 / JavaScript创建了在线游戏。所有代码都将下载到用户的浏览器中,他们将运行游戏。

如何阻止某人将游戏复制到他们的计算机上,并注入功能和模块作弊?例如,他们可以编写一个自动瞄准最近的敌人精灵的函数。

是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?

13 个答案:

答案 0 :(得分:46)

  

什么阻止某人复制   将游戏放到他们的电脑上,然后   注入功能和模块   骗?

没有

  

有没有根本的方法   保护人们不要这样做   设计你的游戏代码的事情   某种方式?

不。

答案 1 :(得分:38)

这就是大多数JavaScript游戏在服务器状态上严重依赖 的原因,以防止作弊。

答案 2 :(得分:12)

简而言之,没有。但是,您可以obfuscate Javascript使其变得更加困难。

对于像分数这样的东西,用户理论上可以将任何分数发布到处理程序脚本中。在这种情况下,您可以使用会话并定期通过AJAX回发到服务器。

答案 3 :(得分:9)

一些想法

服务器端:

  • 存储游戏内部状态服务器端并检查服务器上客户端发送的输入。

  • Autoaim :创建普通玩家看不到的虚假精灵,如果他们经常被击中,你就会有机器人。 (并不总是有效,因为机器人可能会更新以检查隐身)

  • 检查客户端对服务器更改的反应时间,检查太多反应太快。 (必须接受大量快速响应才能做出反应,因为人类可以快速反应,时间必须考虑网络延迟以捕获任何东西)。给玩家一些验证码,普通玩家永远不会看到它。

客户方:

  • 使用模糊处理来使代码与代码接口更难

  • 检查您知道的黑客中定义的功能。必须经常修改/更新,因为这些黑客的创建者可以解决这些问题。

  • 游戏设计:让您的游戏重复性降低,这使得编写工具/机器人变得更加困难。

  • 更新客户端以不时更改其结构的某些部分。虽然这不会阻止机器人,但仍需要工作才能让它们继续运行。要么对用户透明,要么用新功能对其进行伪装。

重要提示:确保您的服务器界面检查用户输入,混淆和客户端检查不会帮助编写自己客户端的人。

答案 4 :(得分:8)

我喜欢这个问题,虽然可能有更好的答案,但这里有一些可能(或可能没有)起作用的:

  • 混淆。是的,它不能得到保证,有人最终可以得到它,但有时候处理这​​个问题很痛苦。
  • 每次使用新的临时令牌生成JS。您可以对运行代码的.js进行模板化,并插入每个实例不同的服务器生成的令牌。令牌可能是临时的,它可能是验证代码真实性的一种方法
  • 可能有一些方法可以确定正在运行的脚本的正确位置 - 但这可能是伪造的

总的来说,它的难点和以上所有建议都可以解决。我想关键是要让他们很难作弊,但考虑到即使是安全的在线模式游戏也有作弊者,也很难阻止JS游戏受此影响。

答案 5 :(得分:8)

  

是否有任何基本方法可以通过以某种方式设计游戏代码来保护人们不会做这类事情?

唯一合理的方法是将代码的关键部分保存在您控制的服务器上,并且根本不会将其提供给用户的计算机。很难实现这个方块,保持游戏足够快,可以玩。

答案 6 :(得分:5)

你正试图做不可能的事。我能给你的最好的建议是,如果你打算坚持使用硬币/金钱/金币,等级等任何数据,那么你要确保你永远不要相信客户,并尽可能多地建立逻辑服务器。

答案 7 :(得分:5)

我认为可行的方法是以一种方式编写客户端,以便动态更改客户端代码并验证在服务器上使用如此创建的代码。

E.g。有这样的命名空间

window.mynamespace = {

    foo : function(){
        // some stuff here
    },

    bar : function(){
        // some more stuff here
    } 
}

包含所有客户端代码,并使所有服务器方法都需要一个令牌,该令牌是先前对代码库进行动态评估的结果。通过重新定义方法和更改方法名称来加倍努力。以下是一些示例挑战(只有在动态创建挑战并且无法预测时才有意义)。所有都先包含一个任务,然后是一个挑战,用于为下一个请求创建授权令牌。 (这些是来自ajax调用的响应对象)。基本上,任务将被评估,并且eval'd挑战的结果将成为下一个标记。

{
    task: "mynamespace.baz=mynamespace.foo;mynamespace.foo=undefined;",
    challenge: "mynamespace[11].toString().substr(10,22)"
            // get part of a well-known functions source code
}

{
    task: "mynamespace.bar=function(){ /* new code here */ }",
    challenge: "var xy=0;mynamespace.each(function(item){xy+=item.toString().lastIndexOf(';')}); xy"
            // accumulate the last index of a semicolon in all elements
            // of the namespace
}

为了击败它并仍然获得有效的授权令牌,客户端必须编写整个javascript仿真层。虽然可以这样做,但我会尝试以经常性的方式对服务器代码进行更改,以使这种技术几乎不可能(因此仿真层将不知道要模拟的内容)。

答案 8 :(得分:4)

  

他们可以写一个自动生成的函数   例如,在最近的敌人精灵中。

即使游戏大多数处理都发生在服务器端,你也可以这样做!您只需要足够快地分析显示器。

你甚至可以重新实现部分游戏AI,试图预测机器人的移动方式。如果您无法访问游戏的源代码,但如果您记录了大量的游戏时间,则可以应用机器学习技术。

  

有没有根本的方法   保护人们不要这样做   设计你的游戏代码的事情   某种方式?

不要忘记您可以更改游戏本身,而不仅仅是如何实施游戏。例如,使用随机生成的级别而不是静态级别,使用人类玩家而不是机器人,使您的艺术/精灵更复杂,更多地使用音频,限制光标移动的速度,增加冷却时间到武器,添加隐藏的危险,等等。

答案 9 :(得分:3)

理论上,你正在玩一个针对黑客的游戏。你无法赢得这场比赛但是你让它具有挑战性。

我的建议是使用尽可能多的服务器端逻辑,并使用Javascript Obfuscation。

Javascript混淆会让代码变得非常难以理解,但更好的是它可以让您在保持相同代码库的同时发布数千个代码版本。

我曾经使用JScrambler来做这件事。黑客不必破解1游戏的代码,而是必须破解数千个版本的代码! :)

答案 10 :(得分:2)

您可以将代码中的所有内容都放在闭包中:

(function() {
  var cantSeeMe = function() {
    // do some game stuff!
  };

})();

在关闭之外,非常很难获得“注入黑客”的代码(例如,覆盖控制台上的某个功能)。这不会阻止某人重写您的代码,但通过打包器传递内容,甚至closure compiler可能会使您的代码难以阅读/修改...(请查看jQuery min

总而言之,任何运行客户端的游戏都是可以攻击的。

答案 11 :(得分:2)

travian(http://www.travian.us/)是在DHTML中运行的大型游戏的一个很好的例子,它在客户端滥用方面存在大量问题。只需在firefox中安装油脂猴就可以为各种剥削行为敞开大门。也就是说,它们似乎使游戏保持一定的功能,因为大多数漏洞似乎都围绕着常见的游戏内任务的自动化而不是直接违反游戏的内部域逻辑。 请记住,此示例远非仅使用JS运行,并且主要依赖于服务器端控件。

答案 12 :(得分:1)

免责声明:这是一种非常糟糕的方法,可能需要付出太多努力。

假设您在发送之前有一个处理 javascript代码的方法。

首先,每个方法都有一个 ident 变量,该变量附加到每个函数的结果(即每个函数都返回{ident:"special code",result:"actual useful function result"})。您还有一个testIdent()函数可以接受要调用的函数名称以及“测试数据”来给它(如果需要的话)。 testIdent()的目的是将从所述函数返回的 ident 发送到服务器进行验证(这个想法是服务器可以在您认为合适时请求测试)。每个函数的 ident 应该在发送之前随机化并专门为指定用户记录。

其次,在将代码发送到客户端之前,函数顺序是随机的,并且函数名称在某些随机的情况下被混淆。这样,黑客就无法在函数 x()中查找变量 ident ,因为它将被随机命名。此外,如果每个变量名称也随机混淆,那将是另一个好处,只是为了复杂化和头痛......又添加了另一个步骤...好吧......我告诉过你这是一个糟糕的方法。

现在,假设采取适当的措施确保代码始终正常运行,黑客是非常敏锐的人,如果他们足够坚定,黑客仍然有办法跟踪这些代码。至少有一种方法是搜索关键代码结构,例如具有一定数量元素的switch语句,或具有 x 语句数量的for循环等。通过在交换机中添加虚拟case语句或在整个代码中随机添加几个if(true)位,可以抵消这些问题,反击黑客将永远是一个恒定的(可能是一个失败的)战斗。 / p>

希望这可以给你一些想法。我不知道有人会如何实现这一点,但这至少是一个想法。

祝你好运!

相关问题