2012-03-26 81 views
1

我正嘗試使用JPF來驗證運行時使用javassist生成的字節碼。在現有項目中用於字節碼驗證的Java路徑查找器,字節碼驗證

我試圖驗證的代碼是在我的程序運行時由用戶提供的。由於我無法檢查所有的OOP模型和類似的東西,所以在運行他的代碼之前我需要驗證過程。

目前我只是用他的類中的javassist生成字節碼。

我現在的問題是,我有時會得到異常,因爲用戶做了一些繼承錯誤和東西,我的應用程序關閉了一個異常,因爲我試圖加載和執行他的類。

因此,我想驗證生成的字節碼在運行時避免這種異常,並知道如果從用戶提供的類錯誤(或包含任何問題)。

JPF在運行時可以這樣嗎?

對此有何解決方案?

謝謝!

+0

試着對字節碼做一個散列;也許在不同/隨機位置選擇字節並查看它們是否匹配;它應該比檢查整個文件要快得多 – Adrian 2012-03-26 13:58:01

+0

散列只是爲了與事物進行比較,還是我錯了?我需要檢查代碼是否有效,並且可以在沒有異常情況下運行! – Evils 2012-03-26 20:00:55

+0

我的印象是,你在所有字節上進行相等操作......而不是字節是有效的代碼。我錯過了解釋嗎? – Adrian 2012-03-26 20:18:12

回答

1

有很多點檢查:

從我的角度來看,一個ClassLoader做所有的步驟,但它通常一次加載一個類,並且只在需要時才加載。

在您的上下文中,我建議您編寫一個ClassLoader,按順序加載生成的字節碼中的所有類,並報告每個具有捕獲異常的失敗類名。 ClassLoader通過引用相關的父ClassLoader來實例化,並在測試通過後被丟棄,然後生成的字節碼由運行時上下文的原始ClassLoader加載。

可能這個類的加載檢查可能是由於OSGi而實現的,但它需要比獨立的ClassLoader更多的努力。

2

由於JPF使用BCEL Stand-alone Bytecode Verifier可能會有幫助。只需編程調用Verifier類 - 甚至可以深入該類的細節。 hth

+0

我不是100%確定的,但有些測試向我展示了我的意思:「特別是,我們不會處理Java虛擬機在運行時必須檢查的安全限制,即字節代碼驗證程序「。所以它看起來像BCEL(或Javassist)使用的字節碼驗證器不是100%全面檢查,這就是爲什麼我試圖使用JPF – Evils 2012-03-29 07:46:03

+0

我的錯誤。我癱瘓依賴於BCEL的舊版JPF,但我剛剛看到新版本不是。所以忘記我的評論... – 2012-04-02 14:04:40

0

如果您沒有使用JPF的絕對要求,則ASM庫包含可以驗證字節碼的CheckClassAdapter。這只是一個全面的檢查不過 - 我不相信它會趕上與繼承等問題

+0

這就是問題所在,正如我所說的,我需要100%正確的驗證來檢查oop模型,以及哪些安全地運行在jvm上,沒有例外。除此之外,我還需要從ASM不提供的驗證器中獲得正確且良好的錯誤消息 – Evils 2012-04-03 09:26:30