用Java混淆游戏

时间:2015-06-05 14:40:10

标签: java game-engine obfuscation

我的情况与此类似......我有一个游戏,我目前正在用Java开发,我已经采取了一些步骤来保护数据(例如在保存本地文件时使用加密)。然而,朋友推荐的一件事就是混淆代码使其混乱,并且不可读,这样如果有人决定打开它 - 对他们来说几乎没用。

我的问题分解为几个部分......首先,作为一般的想法,这实际上会使人们不太可能打破/窃取/复制我的游戏,或者混淆代码的影响是可以忽略不计?其次,如果值得做 - 是否有任何性能影响?

编辑 - 我主要是希望保护代码免受游戏中的欺骗,因为客户端上的一些文件可能会被操纵以提供不公平的优势。保护实际的二进制文件是一个我必须在以后查看的选项;现在我只是想做它,所以代码库本身不能轻易提取和可能改变。

2 个答案:

答案 0 :(得分:3)

首先,对不起我写的文字数量。

其次,我完全赞同answer to the question you linked to
远离代码流改变"混淆器" (我打电话给他们"扰乱者",但这是English的情况。)

第三,非常严格地说,纯混淆(如在班级和成员重命名中)通常会产生更短的名称(参见Minecraft with the ab,...)比你选择的那样,因为类文件更短,加载类可能只是更快一点,并且因为比较较短的字符串花费的时间较少,成员查找也会快一点,可能导致性能微小改进非静态方法调用。
但是,改进很可能是微不足道的,如果JVM进行任何形式的查找缓存,我根本不会期望任何性能提升。
但是,仅使用类和成员重命名,我不会期望性能下降。

至于它是否会阻止人们做坏事......也许一点点 非常懒惰的程序员和新手肯定会被吓跑 然后它取决于通过破解你的代码可以获得多少收益 如果一个黑客可以从破解你的游戏(即速度)获得一些东西,我会说它发生的可能性要大得多,如果它是一个付费游戏,他可以在没有许可证的情况下运行什么的 它还取决于有多少代码以及需要更改多少 如果你有大约25个或更少的课程,我认为对于一个有点高级的开发人员来说,它不会真的很难。
但是,应用Minecraft的大小是另一回事 但是以Minecraft为例,我最终学会了通过混淆代码找到方法,因为每次发布后生成的反混淆列表需要花费的时间越来越长,我只想让我的mod保持最新状态。 /> 提出一个大胆的主张,我告诉我,破解混淆的java应用程序要比破解非混淆程序要困难得多,而且我当然不是唯一的。

此外,一些混淆器完全随机选择名称,因此释放更新可能具有完全不同的名称 有人可能认为这会让黑客回归,但是一旦你大致了解哪个类代表一个版本中的内容,你就可以通过搜索字符串和导入的类或其成员来轻松地在下一个类中找到该类,并且从那里你可以建立与其他混淆类的连接 (例如,在Minecraft中,我总是从制作经理开始,因为它有独特的"###"字符串,并且因为它大量使用了块和项目,所以我可以在那里找到很多课程。)

但实际上你真的有一件事:名字冲突 再次使用Minecraft,我意识到有些文件无法再次编译 - 不是因为反编译器生成的代码无效,而是因为a被用作类名一个字段名称,该字段优先(否则我可以使用athis.a - 请注意,这仅在您的混淆器删除包并将所有类放在顶层时才有效! ),所以没有办法引用除了反射之外的类,这是我在某些情况下最终做的。在其他情况下(性能是一个问题),我创造了一种假的"假的"我可以编译的具有不同名称的类,然后篡改生成的字节码以更改名称 因此,尽管仍有可能,但通过这一努力肯定是很费力的 如果我不得不解决数百次碰撞,我很可能很快就会放弃。

另外,我了解到,至少在Oracle的Java实现中,版本6到8,"无效"字节码中的名称似乎不是问题,至少在某种程度上是这样 在我的一个项目中,我需要在运行时创建字节码,我需要生成的类包含一个名称不会与类可能包含的任何其他方法冲突的方法,所以我的第一次尝试是使用无效字符({ {1}})因为它的名字,它到目前为止(它已经出了2年)我还没有收到关于JVM拒绝它的任何错误报告。
我不知道那里是否有一个支持无效名称的混淆器,但是如果有这样的话,你当然可以生成代码,这些代码在反编译时不仅看起来很可怕,而且甚至连编译器都不会。 我想像

这样的东西
*

变成:

Some thing = field.method().whatever.array[index];

看起来很整洁,不是吗?而且我确信编译器会喜欢它。 *邪恶的笑容*
(但即使它有效,我也不能推荐它,因为它不是很好的做法。)

在那个级别,你的代码仍然是可破解的,但可能不比机器代码多,所以你应该有点安全。

TL; DR

  • 远离代码流改变。
  • 很多课程=额外的默默无闻。
  • 很多课程=名字冲突的机会更高。
  • 如果奖励足够高,有人会破解它。

答案 1 :(得分:0)

代码的混淆最容易通过Proguard等专用工具自动完成。

根据previous discussion,使用ProGuard对您的代码的性能影响可以忽略不计。