2012-01-22 23 views
3

對於java中的字節碼檢測,有asm框架和bcel和javaassist庫。本地java字節碼檢測

不過,我需要做的儀器在本機代碼,因爲一些Java類已經由javaagent運行時間,例如java.lang.Thread中,java.lang.Class中,等

裝載有任何庫用於在本地代碼中檢測java類?編號: 似乎有點混亂。

我想要的是: 創建一個本地Java代理,它使用JVMTI API在使用OnClassLoad事件掛接加載它時加載類的字節碼。

+5

您需要解決什麼是原始問題? –

+0

你是什麼意思的「本機代碼」? http://www.cs.ioc.ee/~ando/jbe/提供了一個工具,使您可以直接編輯java字節碼 –

+0

@ThorbjørnRavnAndersen我想要在JavaAgent加載之前加載類似Thread和Class的類,因此它們必須在本地代理中進行檢測。 – pdeva

回答

-1

加載完成後,您無法更改類的字節碼。您可以確保您的工具在加載之前運行,也可以創建一個新的ClassLoader,並通過不要求父類來重新加載其中的類。但是,您不能使用那些在ClassLoader之外加載代碼的類,因爲該代碼將引用先前加載的未修改的類。

+1

我不想在加載字節碼後改變字節碼。我想使用本地代理來更改字節碼*,而類正在加載 – pdeva

1

JIT會將字節碼轉換爲本機碼。如果你想產生本地代碼,你需要讓JIT執行它或者編寫通過JNI調用的本地代碼。

也許你試圖實現可以做更簡單的另一種方式。

使用OnClassLoad事件掛鉤創建本機java代理,該代理使用JVMTI apis更改加載類時的字節碼。

雖然你不需要做你想做的。爲什麼要使解決方案比需要的更復雜(並且工作的可能性更小)?

+0

我不想生成本機代碼。我想在使用OnClassLoad hook加載到本地代理時更改類的'字節碼' – pdeva

+0

在這種情況下,您的問題沒有任何意義。爲什麼你需要使用本地代碼來生成字節碼? –

+0

「javaagent運行時已經加載了一些java類」,例如Thread,Hashmap等。 – pdeva

7

我在博士研究期間遇到了這個問題。最適合我的答案是使用java庫(我使用ASM)在單獨的JVM中執行字節碼修改。

我使用JVMTI類加載掛鉤來捕獲類文件並使用tcp連接將其傳輸到單獨的JVM。一旦在單獨的JVM中修改了類,我將其返回給JVMTI代理,該代理將其複製到VM內存中,並將指向修改的類文件的指針返回給JVM。

我發現在同一個JVM中編織類與我想要修改的系統類文件(例如java.lang.Object)不同,必須在任何類文件之前加載我太困難了需要進行編織。在找到我最終使用的獨立JVM方法之前,我沒有取得太大的成功,因此尋找了c/C++字節碼庫。

您可以使用編織器JVM的主機名/端口參數化JVMTI代理,也可以使用某種形式的發現,具體取決於您的要求。

+3

其他幾個答案是輕微不正確或錯誤的。您可以更改已加載的類的字節碼 - 甚至是系統類。一旦一個類已經被加載,你可能不會影響它的外部簽名(添加字段/方法),但是你可以改變方法體。使用JVM分發的基本heapTracker JVMTI演示了改變java.lang.Object的行爲。 ()。 –