【问题标题】:Protecting games from memory scanners (like Cheat Engine)保护游戏免受内存扫描仪(如作弊引擎)的影响
【发布时间】:2013-03-03 00:14:27
【问题描述】:

我正在制作一个将分数发送到服务器的 C++11 游戏。我将分数存储为一个简单的浮点数,因此使用Cheat Engine 等软件的人可以在将分数发送到服务器之前轻松更改分数的值。

如何保护我的游戏免受此类攻击?

【问题讨论】:

  • 你不能。您需要在服务器端验证发送到服务器的数据。
  • 同时发送一个加盐哈希...

标签: c++ security memory


【解决方案1】:

您可以做很多选择,但最好不要接受来自客户的任何重要值。让服务器完成所有计算,然后将值发送给客户端。

【讨论】:

  • 这并不总是一种选择。
  • @supertonsky 怎么样?我想不出哪款游戏不这样做。
  • 有些游戏在客户端进行计算,但无论我使用作弊引擎对游戏做什么,我都不能简单地破解游戏。由于某种原因,我无法访问内存。现在是这样。不管是什么,它都是辉煌的。有些游戏你可以访问内存,但是一旦你得到地址,“变量”似乎会不断改变内存地址,这实际上会使像作弊引擎这样的应用程序无用。
  • 问题不是读取/编辑内存,而是向服务器发送错误信息。没有什么可以阻止我向服务器发送消息说我刚刚赚了 100 万个硬币。如果此信息未在服务器端处理,那么它别无选择,只能信任我并编辑数据库。
  • 你说得有道理,但是如果所有的计算都是在服务器上完成的,那么对于为手机开发的动作游戏来说,这将如何运作,互联网连接的轻微不稳定肯定会破坏游戏体验。
【解决方案2】:

如果您必须首先在客户端执行任何操作,请加密您关心的任何数据(或所有数据,如果可能的话)。

让服务器计算任何重要的东西可能会更好。例如,在《使命召唤》中,您希望服务器决定谁被击中,以便个别玩家的计算机/延迟/等。不参与。

如果您正在做一款仅限本地 PC 的游戏,并且只想在最后上传分数,则无法选择服务器计算。在这种情况下,您确实必须首先坚持加密并混淆重要值。你能做的只有这么多;如果它是 100% 客户端计算的,它可能永远不会是防弹的。

【讨论】:

  • 我希望您可以在客户端没有加密密钥的情况下做到这一点? ;)
  • 老练的用户可以提取加密密钥并使用它来加密他们希望发送到服务器的任何分数
【解决方案3】:

您确实无法确保该值未被篡改。你可以做的是向服务器发送足够的信息,它可以确定“这是否可能”——例如,如果你的游戏是“吃豆人”风格的游戏,你还可以提供吃豆人的所有“Blob”——人吃,或每个级别的数量以及完成每个级别所花费的时间等。作弊者可以复制所有需要的额外数据并非不可能,但如果您要发送更多数据,这样做会变得更加困难.

但是,您的软件中随时可用的任何数据都可能会被“调试器”类型的应用程序修改。你对此无能为力。

【讨论】:

    【解决方案4】:

    总会有办法绕过您的保护。不管它有多好。但是,您可以让它变得更难。有一个例子:https://github.com/jgk2Th/anti-wpm

    基本上,重点是创建两个具有相同值的变量,并将其中一个变量移动到 RAM 中的不同位置(简单地说),以使其更难找到。然后,比较差异值。

    这是该想法的简化代码。

    int VariableToProtect = 0;
    int pVar[ 1000 ] = { 0 };
    int Pos = 0; // 'pseudo-position' of the element (with same value as VariableToProtect) in pVar
    
    while( !GetAsyncKeyState( VK_SPACE ) )
    {
        if( pVar[ Pos ] != VariableToProtect )
            printf( "detected!" );
    
        ++VariableToProtect;
    
        Pos = rand( ) % 1000;
        pVar[ Pos ] = VariableToProtect;
    
        Sleep( 10 );
    }
    

    【讨论】:

    • 为了改进您的答案,如果您可以直接在答案正文中添加一些最少的附加信息,那就太好了,因为链接可能会变得陈旧。例如,仅仅用几句话解释anti-wpm是什么以及它是如何工作的。
    • 干得好@uzivanky!现在它实际上是一个更好的答案!我相信每个人都会感谢你的努力。
    【解决方案5】:

    如果它是大型多人游戏,那么理论上,您可以使用某种算法,让服务器向随机用户组请求特定问题的答案。作弊者在没有重大勾结的情况下会得到不同的答案。

    如果在像《使命召唤》这样的游戏中,你可能有 30 名玩家,并且如果发生击杀事件,则需要超级多数同意。这样一来,任何一个团队都无法通过勾结的方式作弊。您仍然需要注意用于攀登排行榜的备用帐户。

    【讨论】:

      猜你喜欢
      • 2010-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      相关资源
      最近更新 更多