gpt4 book ai didi

java - 使用捆绑资源创建 JavaVM

转载 作者:行者123 更新时间:2023-11-28 02:58:09 27 4
gpt4 key购买 nike

我必须编辑原始帖子,因为它具有误导性。我有一个使用 JNI 创建 JavaVM 的应用程序。它是用 C++ 和 QT5 框架编写的。如果我在应用程序的 .exe 文件旁边提供 .class 和 .jar 文件,那么从我的 Java 应用程序创建 jvm 和调用函数没有问题。现在,由于可以反编译 Java 应用程序,我公司的标准不允许我将此应用程序分发给本地用户,因为它确实包含他们无法访问的关键密码。像这样从安全同事那里得到的答复是,如果我将 java 源代码捆绑在 .exe 文件中,他们对应用程序很满意。 QT 资源文件非常适合我定义如下的这项工作:

<RCC>
<qresource prefix="/javaApplication">
<file>resources/bytecodes/helloworld/HelloWorld.class</file>
<file>resources/bytecodes/helloworld/HelloWorld.jar</file>
</qresource>
</RCC>

因此使我能够使用以下路径访问文件:

:/javaApplication/resources/bytecodes/helloworld/HelloWorld.class
:/javaApplication/resources/bytecodes/helloworld/HelloWorld.jar

很好很流畅,但是这些路径似乎不适用于 JavaVMArgs:

// Does work but violates security policies:
options[1].optionString = "-Djava.class.path=C:/Users/johorvat/Documents/NetBeansProjects/HelloWorld/build/classes/helloworld/HelloWorld.class;C:/Users/johorvat/Documents/NetBeansProjects/HelloWorld/dist/HelloWorld.jar";
// Does not work, sadly I try to achieve something like this:
options[1].optionString = "-Djava.class.path=:/javaApplication/resources/bytecodes/helloworld/HelloWorld.class;:/javaApplication/resources/bytecodes/helloworld/HelloWorld.jar";

我怎样才能启动并运行第二个变体?

最佳答案

您的问题与 Qt 无关,可以简单地改写为:

有没有办法将类或 jar 文件的内容传递给 JVM 而无需将它们显式保存在磁盘上?

I've asked this question .答案是:有可能,但必须先将一些代码加载到 JVM 中。所以你实际上可以做你想做的,首先启动你自己的加载器,然后传递数据,例如通过本地套接字或本地主机网络连接。您的数据也可以来自本地方法,您当然可以使用 Qt 编写 JNI DLL。

除了您的应用程序之外,Qt 资源系统对任何事物都是不可见的。使用特定于 Qt 的资源路径的参数调用 JVM 或任何其他可执行文件没有任何意义。 JVM 对这些文件一无所知,而且永远不会知道。除非您在 java 中重新实现 Qt 资源系统,否则您需要那些初始类文件。

Qt 资源只是 zlib 压缩的二进制 blob,很容易从已编译的可执行文件中提取出来。它们并不是真正意义上的“编译”。它们实际上是通过利用链接器和编译器连接到可执行文件的,但这只是一个实现细节。

my company's standards does not allow me to distribute this application to local users because it does contain critical passwords they can't access

一切都可以被反编译,所以无论您的密码是在显式 java 类文件中还是在 qrc-obfuscated 类文件中都没有关系。可能的结果是相同的。

为了让逆向工程师的日子更难过,你所能做的就是:

  1. 使用 SSL 保护连接。

  2. 验证服务器签名,防止中间人攻击。

  3. 在应用程序可执行文件中捆绑加密的私有(private)客户端 key 。使用它而不是密码。服务器可以预先知道允许的客户端 key 。

  4. 静态链接到您最喜欢的 SSL 库。

如果您的方案允许,您可以使用密码保护客户端 key ,并要求用户在每次打算连接到服务器时输入它。这可以防止泄露的可执行文件在没有密码的情况下允许服务器闯入。

就是这样,真的。

关于java - 使用捆绑资源创建 JavaVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21526147/

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