LibGDX:安卓游戏安全

Posted

技术标签:

【中文标题】LibGDX:安卓游戏安全【英文标题】:LibGDX : Android Game Security 【发布时间】:2016-01-16 19:59:11 【问题描述】:

我正在使用 LibGDX 框架开发游戏。我想知道如何让游戏更安全。例如,具有根 android 设备的用户可以更改保存的 .xml 文件,这样游戏就会被黑客入侵,或者他/她可以使用 GameKiller 或类似的程序并更改游戏运行时值(金钱、exp 等)。那么我该如何预防呢?

桌面版也是一样,保存文件没有隐藏,玩家也可以在PC上找到该文件。并且可以使用 CheatEngine 或其他程序进行黑客攻击并再次更改运行时值。

【问题讨论】:

我猜想在服务器上运行你的游戏并且只保留数据没有选项?否则,你只能让作弊变得“更难”,但你永远无法完全阻止它。如果您需要在用户拥有的设备上进行操作。 我怎样才能让它变得更难一点? 混淆您的代码/保存文件。一个选项是“加密”保存文件并混淆代码中的密钥。加密可以是简单的异或或移位。但是你不应该投入太多精力,因为如果你的游戏流行,那么它就会被破解,破解者很可能会发布他们的作品等等......代码混淆可以通过程序完成,但这是大多数可能是基于意见的问题。 【参考方案1】:

如果您不存储私人/重要数据,而只是想让您的游戏难以破解(例如通过更改游戏级别的 xml),您可以基于GWT Crypto library 实施加密

你初始化加密器的方式是:

    //this will be used for encrypting and decrypting strings
    private TripleDesCipher encryptor;  

    ...

    //creating key for encryptor
    TripleDesKeyGenerator generator = new TripleDesKeyGenerator();
    byte[] key = generator.decodeKey("04578a8f0be3a7109d9e5e86839e3bc41654927034df92ec"); //you can pass your own string here

    //initializing encryptor with generated key
    encryptor = new TripleDesCipher();
    encryptor.setKey(key);

    ...

以及使用方法:

    private String encryptString(String string)
    
        try 
        
            string = encryptor.encrypt( string );
         
        catch (DataLengthException e1) 
        
            e1.printStackTrace();
         
        catch (IllegalStateException e1) 
        
            e1.printStackTrace();
         
        catch (InvalidCipherTextException e1) 
        
            e1.printStackTrace();
        

        return string;
    

    private String decryptString(String string)
    
        try 
        
            string = encryptor.decrypt(string);
         
        catch (DataLengthException e) 
        
            e.printStackTrace();
         catch (IllegalStateException e) 
        
            e.printStackTrace();
         catch (InvalidCipherTextException e)
        
            e.printStackTrace();
        

        return string;
    

我还建议您不要使用 XML,而是使用 JSON - 它们更方便且重量更轻。 Read how to handle it here


请记住,客户端加密通常不是一个好主意,而且总是可能以某种方式被黑客入侵 - 但我很确定,如果它与金钱无关,没有人会认为它值得。

如果您对保存数据的更高级方法感兴趣,最好的办法是通过 SSL 发送所有数据并将其保存在一些保护良好的服务器中 - 尽管我不太确定 Libgdx 是否有任何好的 SSL 机制并且不知道我可以推荐的第三部分库。

保存文件的服务示例可以是Shephertz(我正在使用他们不错的 AppWarp,并将在我的应用程序中实现这个)。

【讨论】:

请注意,此加密在此上下文中提供与一个字节的异或相同的安全性。为什么? Java很容易反编译。所以我只是反编译jar/apk(甚至有在线工具),复制代码并解密/加密保存文件。至少应该尝试隐藏/混淆密钥,以便“更难”找到。【参考方案2】:

您可以将它们用于运行时

    双变量

作弊引擎和游戏杀手的双胞胎

int health=15;
int twinhealth=15;  
if(HPtaken()) 

  health+=10;//those twins will always change together 
  twinhealth+=10;

if(health!=twinhealth)//if they are different this means there is hack attempt

//punishment for hacker

    加密变量

实际上它不是一个地穴,它只是对变量进行了少许更改,因此黑客无法通过 gamekiller 或作弊引擎轻松更改。

int health=15*7;
int twinhealth=15*7;

if(HPtaken()) 

  health+=10*7;//those twins will always change together 
  twinhealth+=10*7;

drawhealth( health/7 );// So hacker going to see and search wrong value on cheatengine     
    加密孪生变量 :D

黑客禁止冻结并使用相同的值更改两个孪生。因此,至少其中一个双胞胎将被加密。

int health=15;
int twinhealth=15*5;    
if(HPtaken()) 

  health+=10;//those twins will always change together 
  twinhealth+=10*5;

if(health!=twinhealth*5)//if they are different this means there is hack attempt

//punishment for hacker

当然,黑客可以反编译 apk 并破解您的游戏,但这会使破解游戏变得有点困难。顺便说一句,您可以使用随机变量来编辑变量。

您可以应用 xml 或首选项,但您可以使用稍微复杂的 crypt,因为速度不是问题,因为您只导入/导出几次。

【讨论】:

以上是关于LibGDX:安卓游戏安全的主要内容,如果未能解决你的问题,请参考以下文章

Libgdx 游戏在 Android 上崩溃

安卓游戏要去哪个网站下载安全又免费?

如何更改我的 android 游戏的图片/标志? - libGDX [重复]

移动安全技术_安卓逆向5:绕过单机游戏的商店支付

无法在 Libgdx 中显示文本

无法在Libgdx中显示文本