代码之家  ›  专栏  ›  技术社区  ›  James P. PachinSV

指令执行顺序验证算法

  •  2
  • James P. PachinSV  · 技术社区  · 14 年前

    我想写一些简单的代码来帮助确定是否按照客户机端的预定顺序执行了一些指令。这将使任何希望通过编辑字节代码来改变行为的人都很困难。例如,使用JMP,这样就不会执行某些指令。不过,我的想法有点欠缺。

    要检查最后两条指令是否按正确的顺序运行,可以使用类似这样的简单指令(伪代码):

    // Variables initialized by server
    int lastInt;
    // Monitored at regular intervals
    // Saves using callback which could be tampered with 
    boolean bSomethingFishyHere;
    int array[20]
    
    ...
    execute( array[5], doStuff1() )
    execute( array[6], doStuff2() )
    ...
    
    // This could be tested remotely with all combinations of values possible
    execute( int i, boolean b ){
        if( lastInt >= i ){
            bSomethingFishyHere = true; 
        }
    
        lastInt = i;
    }
    

    我不知道用什么方法来验证 全部的 不过,指令的运行顺序是正确的。也许我可以添加一个数组,让服务器用一些随机递增的数字填充它,或者使用一些排序校验和。你有什么建议?

    2 回复  |  直到 14 年前
        1
  •  1
  •   Stephen C    14 年前

    这只是为了修补FPS射手的一些漏洞。游戏设计者在控制台中留下了一些可以更改的临时变量。其中一些是无害的,但另一些像纹理透明=真的是滥用。我的目标是重新设计一个现有的修改,这样大多数代码就如您所建议的那样在服务器上。所讨论的变量设置在客户机模拟的“世界”中。最后,我计划扩展一些类,让它们忽略它们,只需要监视那些不可能实现的值。

    如果你真的想要一个短期的补丁,一个更实用的方法(比你正在看的方法)会将加密的字节码发送到客户机,并使用一个特殊的类加载器动态地解密它们。但是要注意,黑客反向工程类加载器、获取客户端字节码并修改它们以安装欺骗并不那么困难。

    所以我的建议是,任何客户端“补丁”来阻止用户篡改字节码,永远都不会是防黑客的。跳过这个想法,直接进入你的长期解决方案,重新设计游戏,这样就不必相信客户端代码是按规则运行的。

        2
  •  2
  •   Salman A    14 年前

    问题是,无论你做什么样的簿记,恶意用户总是可以做同样的簿记,但跳过实际做的事情。如果你能做到,他们也能做到。您可以依赖外部机制,如代码签名,以确保您的可执行文件没有被篡改,以及CPU保护,以防止在内存中动态修改代码。但在这种情况下,你只有在运行的平台上才安全。

    我假设这是某种复制保护方案。(如果没有,请随时纠正我,您可能会得到一些更好、更适用的建议)。没有一种简单的方法可以防止有人运行您的软件,但是您可以授权一个现有的方案,其中供应商已经在其中投入了足够的精力,这在很大程度上不值得攻击者去麻烦。

    有一种方法非常简单,就是控制代码。在服务器上运行真正的代码,并提供某种前端远程客户端。