用Java混淆游戏

用Java混淆游戏,java,game-engine,obfuscation,Java,Game Engine,Obfuscation,我的情况与此类似。。。我有一个目前正在用Java开发的游戏,我已经采取了一些步骤来保护数据(例如在保存本地文件时使用加密)。然而,我的一位朋友建议我做的一件事是混淆代码,使其变得混乱、不可读,这样,如果有人决定打开它,对他们来说几乎是无用的 我的问题分为几个部分。。。首先也是最重要的一点,作为一种普遍的想法,这实际上会使人们不太可能破坏/窃取/复制我的游戏,还是混淆代码的影响可以忽略不计?第二,如果这是值得做的——是否有任何形式的性能影响 编辑-我主要是想保护代码,防止游戏中作弊,因为客户端的许

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

我的问题分为几个部分。。。首先也是最重要的一点,作为一种普遍的想法,这实际上会使人们不太可能破坏/窃取/复制我的游戏,还是混淆代码的影响可以忽略不计?第二,如果这是值得做的——是否有任何形式的性能影响


编辑-我主要是想保护代码,防止游戏中作弊,因为客户端的许多文件可能会被操纵,从而获得不公平的优势。保护实际的二进制文件是我以后必须考虑的一个选项;目前,我正在考虑如何使代码库本身不容易提取和更改。

代码模糊处理最容易通过专用工具自动完成,例如


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

首先,很抱歉我写了这么多的文本

其次,我完全同意:
远离改变代码流的“混淆器”。
(我会称之为“扰频器”,但这对我来说就是一个例子。)

第三,严格来说,纯模糊处理(如类和成员重命名)通常会生成比您选择的短得多的名称(请参见Minecraft,其
a
b
,…),因此,由于类文件较短,加载类可能会稍微快一点,而且比较较短字符串所需的时间也较少,成员查找也会稍微快一点,这可能会导致非静态方法调用的性能略有提高。
但是,这种改进很可能是微不足道的,如果JVM执行任何形式的查找缓存,我根本不希望有任何性能改进。
但是,仅使用类和成员重命名,我也不会期望性能下降

至于它是否能阻止人们作恶。。。也许有一点。
非常懒惰的程序员和新手肯定会被吓跑。
然后,这取决于破解您的代码可以获得多少收益。
如果黑客可以通过破解你的游戏(即speedhack)获得一些个人收益,我想说,这比他可以在没有许可证的情况下运行付费游戏的可能性要大得多。
这还取决于有多少代码以及需要更改多少。
如果您有大约25个或更少的类,我认为对于一个稍微高级的开发人员来说,这并不难。
但是,应用地雷船的大小则是另一回事。
但以Minecraft为例,我最终学会了通过模糊的代码找到自己的方法,因为每次发布后生成除臭剂列表的时间会越来越长,我只想让我的mods保持最新。
大胆地说,对我来说,破解一个模糊的java应用程序并不比破解一个非模糊的java应用程序难多少,而且我肯定不是唯一一个

此外,一些混淆器完全随机选择名称,因此发布更新时可能会有完全不同的名称。
有人可能会认为这会让黑客望而却步,但一旦你大致了解了一个版本中哪个类代表什么,你就可以在下一个版本中通过搜索字符串和导入的类或此类类的成员很容易地再次找到该类,从那里你可以连接到其他模糊的类。
(例如,在Minecraft中,我总是从crafting manager开始,因为它有唯一的
“####”
字符串,而且由于它大量使用块和项,我可以马上找到许多类。)

但实际上,有一件事确实站在你这边:名称冲突。
再次使用Minecraft,我意识到有些文件不能被再次编译——不是因为反编译器生成的代码无效,而是因为
a
被用作类名和字段名,所以字段优先(否则我可以使用
a
this.a
-注意,只有当模糊器删除包并将所有类放在顶层时,这才有效!),因此除了通过反射之外,没有其他方法引用类,这在某些情况下是我最终要做的。在其他情况下(性能是一个问题),我用一个不同的名称创建了一个“假”类,我可以对它进行编译,然后篡改生成的字节码来更改名称。
因此,尽管这仍然是可能的,但确实需要付出很多努力。
如果我不得不研究数百次碰撞,我很可能很快就会放弃

此外,我还了解到,至少在Oracle的Java实现中,版本6到8的字节码中的“无效”名称似乎不是问题,至少在某种程度上不是问题。
在我的一个项目中,我需要在运行时创建字节码,并且我需要生成的类包含一个名称不会与该类可能包含的任何其他方法冲突的方法,因此我的第一次尝试是使用一个无效字符(
*
)作为其名称,到目前为止(它已经过时2年了)我没有收到任何关于JVM拒绝它的错误报告。
我不知道是否有一个模糊器支持无效名称,但是有了这样一个模糊器,您肯定可以生成代码,这些代码不仅在反编译时看起来很可怕,而且几乎不可编译。 我想象一下

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

! ? = &.%().+.*[/];
看起来很整洁,不是吗?我相信编译器会喜欢的。*邪恶的笑容*
(但即使