当前位置: 首页 > 面试题库 >

如何保护已编译的Java类?

韩景胜
2023-03-14
问题内容

我知道,这里已经问过许多类似的问题。我不是在问我是否可以保护编译的Java类-
因为显然您会说“不,您不能”。我问的是最著名的保护Java类免于反编译的方法是什么?如果您知道该领域的任何研究或学术论文,请告诉我。另外,如果您使用过某些方法或软件,请分享您的经验吗?任何种类的信息都将非常有用。谢谢。


问题答案:

首先,如果你的目标“只” Windows的市场有一个非常简单的防止“的.class来的.java”编译:使用像怡东喷气一种工具,将改变 的.jar 中的
.exe文件

这是万无一失的:如果您使用Excelsior Jet ,则 无法 取回.java文件(对于所有人来说,这么长的时间说:“无法防止反编译
.class 文件”)。当然,攻击者可以启动 SoftIce 并尝试跟踪您的 .exe, 但是比起使用JAD将 .class 反编译为
.java来说 ,这将变得有些棘手,并且当然不允许找回 .java 文件。

现在也许您也以OS X和Linux为目标,或者没有足够的资金来使用Excelsior Jet。

我正在写用Java编写的商业软件。仅当有Internet连接时,该软件才有意义。因此,我们通过在服务器端进行部分计算来“保护”我们的软件,其中包括:我们有几个
.class ,除非它们是从服务器端生成的,否则它们将无法工作,并且我们将它们通过有线发送(而且网上发送的内容 总是
不同的:我们正在服务器端生成唯一的一次性 .class 文件)。

这需要Internet连接,但是如果用户不喜欢我们软件的工作方式,那么他可以自由购买我们竞争对手的劣等产品;)

反编译并不会带来太多好处:您积极地需要破解软件(例如,再现服务器端发生的事情),否则将无法使用它。

使用Proguard 之前, 我们先使用自己的“字符串混淆”
。我们还进行源代码检测(我们也可以完成字节码说明),其中从代码中删除了很多内容(例如我们注释掉的“断言”),并引入了一些随机的“代码流混淆”(该软件可以不同的路径却获得了相同的结果,这确实使软件难以跟踪]。

然后,我们使用Proguard(免费)来展平我们所有的OO层次结构,并混淆已被代码流和字符串混淆的代码。

所以我们的流程是:

  • 字符串混淆
  • 随机码流混淆
  • 保卫者
  • 最终 .jar 取决于 .class (在服务器端(不同)动态生成)。

除此之外,我们还发布了非常定期(自动)的更新,该更新始终确保一定程度地修改了我们的客户端/服务器保护方案(因此,每次发布时,虚伪的攻击者都必须从头开始)。

当然,更容易投入思考: “我无法采取任何措施使攻击者的生活更加艰难,因为JAD仍然可以找到.java文件。”
(这很容易引起争议,并且在以下情况下公然地错了:您使用.class到.exe转换器来保护.class免受反编译)。



 类似资料:
  • 问题内容: 众所周知,有很多Java反编译器工具可以将.cl​​ass转换为.java文件。 因此,我们需要保护.java文件免于反编译。我知道这是一个大话题,也许没有止境。 通常,有两种方法:混淆器和定制的类加载器。 是否有将这两种方式结合在一起的成熟解决方案或开源框架? 另一个方面与exe4j有关,它将jars打包到exe文件中,似乎可以保护java代码,因为我们看到的是exe文件而不是jar

  • 问题内容: 我正在使用Java开发应用程序,但是我不会发布代码。问题是,我测试了其中的一个jar反编译器,它几乎可以完美地从我的jar文件中获取代码!我的问题是如何在不提取代码的情况下分发jar文件? 问题答案: 由于Java在编译过程中保留了大多数“元数据”(允许动态加载和反射),因此直接编译(不仅反汇编)已编译的类文件是一种直接的方法。这就是为什么恢复的代码与原始代码非常相似的原因。 虽然不是

  • 问题内容: 我是Java初学者。我正在开发可解密某些数据的应用程序。解密密钥被硬编码到软件中,因此可以通过分析字节码看到。 我知道不能完全防止逆向工程,所以我想做的就是使过程尽可能地艰巨。 我的想法不是直接将密钥放入代码中,而是将其进行某种转换。例如,我可以写- 这样,查看字节码的人无法立即读取它。但是将必须遵循逻辑并对其进行转换,这在字节级别上不会那么容易。 那么你们怎么看?这有用吗?除了十六进

  • 问题内容: 如果我有一个已编译的Java类,是否可以仅从类文件中知道其目标版本兼容性是什么?具体来说,我有许多编译成Java 6的类文件,它们在Java 5下运行,并显示“无法识别的版本”错误。我希望能够在不运行JVM的情况下查看类文件并查找其目标版本兼容性。有任何想法吗? 问题答案: 我已经在网上找到了它并且可以使用。 每个“ .class”文件都以以下内容开头: 幻数[4字节] 版本信息[4字

  • 问题内容: 前一段时间,在我的工作中,我需要保护某些类以防他人读取代码。为此,我创建了一个EncryptedClassLoader,它加载了以前加密的类,并且还可以加载普通(未加密)的类。以这种方式工作有点复杂,并且也要进行测试(编译,然后加密,然后解密)。 是否有任何免费的框架可以满足我的需求,并且易于处理?我的意思是,不仅混淆而且还加密文件,因此没有人可以读取或调试该部分代码。我可以轻松更改用

  • 问题内容: 关键字授予对相同包和子类(http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)中的类的访问权限。 现在,每个类都有一个超类(http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html)。 因此,我得出结论,即使每个类都可以访问的方法。