簡體   English   中英

本機java字節碼檢測

[英]native java bytecode instrumentation

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

但是我需要在本機代碼中進行檢測,因為javaagent運行時已經加載了一些java類,例如java.lang.Thread,java.lang.Class等。

是否有任何庫用於在本機代碼中檢測java類?

編輯:似乎有點混亂。

我想要的是:創建一個本機java代理,它使用JVMTI apis在加載類時使用OnClassLoad事件掛鈎更改類的字節碼。

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

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

我發現在同一個JVM中編寫類很難被分析,因為我想要修改的系統類文件(例如java.lang.Object)必須在我需要執行編織的任何類文件之前加載。 在確定我最終使用的單獨JVM方法之前,我沒有成功地尋找c / c ++字節碼庫。

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

JIT會將字節代碼轉換為本機代碼。 如果要生成本機代碼,則需要讓JIT執行此操作或編寫通過JNI調用的本機代碼。

也許你想要實現的目標可以通過另一種方式更簡單地完成。

創建一個本機java代理,它使用JVMTI apis在加載類時使用OnClassLoad事件掛鈎更改類的字節碼。

雖然你不需要做你想做的事。 為什么使解決方案比需要的更復雜(並且不太可能工作)?

加載后,您無法更改類的字節代碼。 您可以確保在加載之前運行檢測,也可以創建新的ClassLoader,並通過不詢問父類重新加載其中的類。 但是,您不能將這些類與在ClassLoader之外加載的代碼一起使用,因為該代碼將引用先前加載的,未更改的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM