gpt4 book ai didi

java - 用Java混淆游戏

转载 作者:行者123 更新时间:2023-11-29 05:04:58 24 4
gpt4 key购买 nike

我的情况与此类似……我有一个我正在用Java开发的游戏,并且我已经采取了几个步骤来保护数据(例如在保存本地文件时使用加密)。但是,一位朋友向我推荐的一件事是对代码进行混淆处理,以使其变得混乱且不可读,这样,如果有人决定打开它,则对他们几乎没有用。

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

编辑-我主要是为了确保代码不会在游戏中作弊,因为可以操纵客户端上的许多文件以提供不公平的优势。保护实际的二进制文件是我以后必须考虑的一种选择。现在,我只是在考虑使它变得不容易提取和更改代码库本身。

最佳答案

首先,对我写的文字很抱歉。

其次,我完全同意answer to the question you linked to的观点:
远离更改代码流的“混淆器”。
(我称它们为“扰码器”,但English就是这种情况。)

第三,严格来讲,纯混淆(如在类和成员重命名中)通常会生成比您选择的名称短得多的名称(请参见Minecraft的ab等),因此,由于类文件较短,加载类的速度可能会快一点,并且由于比较短字符串所需的时间更少,因此成员查找也会快一点,这可能会导致非静态方法调用的性能稍有改善。
但是,这种改进很有可能是微不足道的,并且如果JVM执行任何形式的查找缓存,我根本就不会期望任何性能上的改进。
但是,仅重命名类和成员,我也不希望性能下降。

至于是否会阻止人们做恶事……也许有一点。
非常懒惰的程序员和新手肯定会被吓跑。
然后,这取决于有人通过破解您的代码可以获得多少收益。
如果黑客可以从破解您的游戏中获得个人利益(即Speedhack),那么发生这种情况的可能性要比没有许可证或其他东西的付费游戏要大得多。
而且,这还取决于有多少代码以及需要更改多少代码。
如果您有大约25个类或更少的类,我认为对于一个稍微高级的开发人员来说,这并不难。
但是,应用Minecraft的大小却是另一回事。
但是以Minecraft为例,我最终学会了通过混淆代码找到方法,因为在每次发行后生成混淆列表的时间会越来越长,而我只是想保持我的mod保持最新。
提出一个大胆的主张,对我来说,破解一个模糊的Java应用程序要比不混淆的Java应用程序难得多,而且我当然不是唯一的一个。

另外,一些混淆器会完全随机选择名称,因此发布更新的名称可能完全不同。
可能有人认为这会使黑客退缩,但是一旦您大致了解哪个类代表一个版本中的内容,则可以通过搜索字符串和导入的类或此类的成员,轻松地在下一个版本中再次找到该类,然后从那里,您可以连接到其他混淆类。
(例如,在Minecraft中,我总是从手工制作管理器开始,因为它具有唯一的"###"字符串,并且由于它大量使用了块和项目,因此我可以立即在其中找到许多类。)

但是实际上,您真正拥有一件事:名字冲突。
再次使用Minecraft,我意识到有些文件无法再次编译-不是由于反编译器生成的无效代码,而是因为a被用作类名和字段名,所以该字段具有优先权(否则我本可以使用athis.a-请注意,这仅在混淆器删除程序包并将所有类都放在顶层的情况下才有效!),因此除了通过反射之外,没有其他方法可以引用该类,这是我在某些情况下最终要做的。在其他情况下(性能是一个问题),我创建了一个带有不同名称的“假”类,可以对该名称进行编译,然后篡改生成的字节码以改回该名称。
因此,尽管仍然可能,但确实需要付出很多努力。
如果我不得不解决数百次碰撞,那么我很可能很快就会放弃。

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

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


转变为:

! ? = &.%().+.*[/];


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

在那个级别上,您的代码仍将是可破解的,但可能不比机器代码大很多,因此您应该是安全的。



TL; DR


远离更改代码流的麻烦。
很多类=晦涩难懂的另一层。
很多课程=更高的名称冲突机会。
如果奖励足够高,那么有人会永远破解它。

关于java - 用Java混淆游戏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30669348/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com