2012-02-29 70 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