2012-02-29 72 views
1

我一直在为我正在编写的应用程序开发一种引导程序。它缓冲来自网站的应用程序并运行它。它工作得非常好,直到我称之为应用程序主要类的主要方法,这需要库,也是流式传输。 LIB和应用程序位于同一个类加载器中,但它表示由于链接不满而无法找到该库。我寻求帮助,但找不到任何。从MemoryClassLoader加载库?

+2

除非你提供确切的错误信息,也许你的一些加载器代码,我们唯一能看到的错误是'MemmoryClassLoader'中的双'm' ... – thkala 2012-02-29 17:17:38

回答

0

我假设你得到一个UnsatisfiedLinkError,因为你还没有做Runtime.loadLibrary来引入本机代码来支持native方法。这样的库需要在本地文件系统上,并且独立于任何类加载器。的Javadoc:

public void loadLibrary(String libname) 

加载指定库名的动态库。包含本地代码的文件从本地文件系统从传统获取库文件的位置加载这个过程的细节是依赖于实现的。从库名到特定文件名的映射是以系统特定的方式完成的。

显然,Runtime.getRuntime()是独立于任何特定的类加载器。

如果网络类负载可能会导致网络负载的本地代码,这将是一个巨大的remote code execution vulnerability,因为本机代码不能受到java字节码可以的方式约束SecurityManager

如果您信任产生应用程序的网站,并通过安全通道(加密以防止MITM和篡改)获取它,那么您可以获取这些库,将它们转储到本地文件系统,验证任何签名或校验和,然后在导致类初始化之前调用Runtime.loadLibrary or System.loadLibrary加载本地库。

如果您不信任生成该应用程序的网站的作者,或该网站托管第三方内容,那么请勿将JAR从系统库中加载更少的系统库。

即使网站作者是值得信赖的,加载系统库或其他未经审查和测试的本地代码也是危险的。通过chroot进行沙盒处理和系统调用拦截有助于缓解这种风险,但要小心。

+0

我想从我的域加载库jar ,这些不一定是系统库。 – Roby718 2012-02-29 17:41:17

+0

@RomanHargrave,如果您收到['UnsatisfiedLinkError'](http://docs.oracle.com/javase/7/docs/api/java/lang/UnsatisfiedLinkError.html),那么它们就是系统库。你是否得到这种或不同类型的'LinkageError'? – 2012-02-29 17:46:35

+0

看起来问题并不大。我刚刚意识到这个问题与LWJGL喜欢抛出的错误消息有关。我会尽快回复你! – Roby718 2012-02-29 17:53:33