【问题标题】:Load classes from a jar file from a url to memory and then run the main class out of all the classes将 jar 文件中的类从 url 加载到内存,然后从所有类中运行主类
【发布时间】:2023-03-08 16:28:01
【问题描述】:

我正在尝试将 jar 文件中的类从 URL 加载到内存中,然后运行加载的类之一。我不希望用户可以访问类文件或 jar。我见过几个类似的问题,但都没有得到解答。

我知道它可能会使用 URLClassLoader 和 ByteArrayInputStream/ByteArrayOutputStream。

提前感谢您的帮助。

类似的未回答问题:

How to load a jar from an URL without downloading it?

Load jar from URL

【问题讨论】:

标签: java class url jar load


【解决方案1】:

你在正确的轨道上(我认为)。步骤是:

  1. 使用 URLConnection 打开指向 JAR 文件的流。
  2. 读取流并将其写入ByteArrayOutputStream,并提取字节数组。
  3. 在字节数组上打开一个 ByteArrayInputStream,然后将其包装在一个 JarInputStream 中。
  4. 遍历JAR文件的入口成员,保存入口信息,并将入口文件内容缓存在内存中。
  5. 编写一个自定义类加载器,使用 JAR 文件条目和内容的内存缓存。

我无法指出示例代码,因为我找不到任何示例代码。

(您几乎必须在内存中缓存内容,因为JarFile API 需要RandomAccessFile,这意味着数据在文件系统中。在某些系统上,您可以创建一个临时文件,打开一个 RAF在它上面,取消链接,然后获取 URL 并将其写入 RAF。但这不是可移植的......)


我应该指出,如果您将此作为某些许可或“知识产权管理”计划的一部分,那么您可能是在浪费时间。您希望在客户端代码(即在用户机器上运行的代码)中实现的任何实用方案都可能被破坏......除非机器完全锁定。

【讨论】:

  • 这很有帮助,谢谢。作为对您上一条评论的回应,添加只有在服务器端身份验证代码和 ip 匹配时才能访问该 jar 是否会改变任何内容,或者仍然很容易破坏?另外,您建议的最佳方法是什么?因为即使是专业程序也被破解,显然不必是 100% 万无一失的。 --- 顺便说一句,只允许用户暂时直接从 jar 加载混淆的类文件会容易得多吗?
  • 它仍然很容易损坏。严重地。我建议你完全放弃在用户机器上保密的想法。如果你不得不混淆你的代码......为了让老板高兴......但不要把你的时间浪费在更复杂的计划上。如果你有“秘密调味料”的东西,那就去做/保存在适当安全的服务器中。
  • 对我来说,我使用类似的方法。我通过 SSL 加载并且被混淆了。它至少可以防止对检查文件哈希的游戏部分进行简单的逆向工程。磁盘上游戏的其余部分是混淆而不是混淆的混合。有助于使内部结构和网络的重建变得混乱。除了时间敏感的游戏数据,我还为所有的游戏数据保持 SSL 连接。不过,代理仍会检查作弊和完整性。
猜你喜欢
  • 2012-04-15
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 2018-10-11
  • 2017-04-30
  • 2017-02-25
  • 2011-11-26
相关资源
最近更新 更多